From b38e2a73dbe08f36b31cfa72ac9bf202eaebdb2b Mon Sep 17 00:00:00 2001 From: rogerfraser Date: Fri, 26 May 2023 14:18:08 +1000 Subject: [PATCH 001/102] Remove unnecessary stdlib include --- dynadjust/include/functions/dnafilepathfuncs.hpp | 1 - dynadjust/include/functions/dnastrmanipfuncs.hpp | 1 - dynadjust/include/functions/dnatemplatecalcfuncs.hpp | 1 - dynadjust/include/functions/dnatemplatefuncs.hpp | 1 - dynadjust/include/functions/dnatemplategeodesyfuncs.hpp | 1 - dynadjust/include/functions/dnatemplatematrixfuncs.hpp | 1 - dynadjust/include/functions/dnatemplatematrixio.hpp | 1 - dynadjust/include/io/pdfdde.cpp | 1 - 8 files changed, 8 deletions(-) diff --git a/dynadjust/include/functions/dnafilepathfuncs.hpp b/dynadjust/include/functions/dnafilepathfuncs.hpp index 6f31498e..c8ff9a09 100644 --- a/dynadjust/include/functions/dnafilepathfuncs.hpp +++ b/dynadjust/include/functions/dnafilepathfuncs.hpp @@ -30,7 +30,6 @@ #endif #include -#include #include #include diff --git a/dynadjust/include/functions/dnastrmanipfuncs.hpp b/dynadjust/include/functions/dnastrmanipfuncs.hpp index 40b8d635..eecba071 100644 --- a/dynadjust/include/functions/dnastrmanipfuncs.hpp +++ b/dynadjust/include/functions/dnastrmanipfuncs.hpp @@ -30,7 +30,6 @@ #endif #include -#include #include #include diff --git a/dynadjust/include/functions/dnatemplatecalcfuncs.hpp b/dynadjust/include/functions/dnatemplatecalcfuncs.hpp index ff58e26e..49d7c0b9 100644 --- a/dynadjust/include/functions/dnatemplatecalcfuncs.hpp +++ b/dynadjust/include/functions/dnatemplatecalcfuncs.hpp @@ -36,7 +36,6 @@ #include #include #include -#include #include #include diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index ec2d40c9..eeb63770 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -34,7 +34,6 @@ #include #include #include -#include #include #include diff --git a/dynadjust/include/functions/dnatemplategeodesyfuncs.hpp b/dynadjust/include/functions/dnatemplategeodesyfuncs.hpp index f332941c..46754e0e 100644 --- a/dynadjust/include/functions/dnatemplategeodesyfuncs.hpp +++ b/dynadjust/include/functions/dnatemplategeodesyfuncs.hpp @@ -34,7 +34,6 @@ #include #include #include -#include #include #include diff --git a/dynadjust/include/functions/dnatemplatematrixfuncs.hpp b/dynadjust/include/functions/dnatemplatematrixfuncs.hpp index 1423912f..4d8ed571 100644 --- a/dynadjust/include/functions/dnatemplatematrixfuncs.hpp +++ b/dynadjust/include/functions/dnatemplatematrixfuncs.hpp @@ -34,7 +34,6 @@ #include #include #include -#include #include #include diff --git a/dynadjust/include/functions/dnatemplatematrixio.hpp b/dynadjust/include/functions/dnatemplatematrixio.hpp index db1ce3fb..7dbbe795 100644 --- a/dynadjust/include/functions/dnatemplatematrixio.hpp +++ b/dynadjust/include/functions/dnatemplatematrixio.hpp @@ -16,7 +16,6 @@ #include #include #include -#include #include #include diff --git a/dynadjust/include/io/pdfdde.cpp b/dynadjust/include/io/pdfdde.cpp index 1cae365d..72003d19 100644 --- a/dynadjust/include/io/pdfdde.cpp +++ b/dynadjust/include/io/pdfdde.cpp @@ -27,7 +27,6 @@ PURPOSE #include #include #include -#include #include #include From 0ddf9ccb60fe370d06684b6421591f0c6a4f4a22 Mon Sep 17 00:00:00 2001 From: rogerfraser Date: Tue, 7 May 2024 16:33:10 +1000 Subject: [PATCH 002/102] Normalise and improve handling of epsg codes --- dynadjust/include/parameters/dnaconsts-datums.hpp | 8 ++++---- dynadjust/include/parameters/dnaepsg.hpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dynadjust/include/parameters/dnaconsts-datums.hpp b/dynadjust/include/parameters/dnaconsts-datums.hpp index 705e7ef5..9b04a67e 100644 --- a/dynadjust/include/parameters/dnaconsts-datums.hpp +++ b/dynadjust/include/parameters/dnaconsts-datums.hpp @@ -34,13 +34,13 @@ const UINT16 AGD66_i = 4202; const UINT16 AGD84_i = 4203; -const UINT16 GDA94_i_2d = 4283; // LatLon const UINT16 GDA94_i_xyz = 4938; // XYZ +const UINT16 GDA94_i_2d = 4283; // LatLon const UINT16 GDA94_i = 4939; // LatLonEht const UINT16 GDA2020_i_xyz = 7842; // XYZ -const UINT16 GDA2020_i = 7843; // LatLonEht const UINT16 GDA2020_i_2d = 7844; // LatLon +const UINT16 GDA2020_i = 7843; // LatLonEht const UINT16 ITRF2020_i_xyz = 9988; // XYZ const UINT16 ITRF2020_i = 9989; // LatLonEht @@ -93,11 +93,11 @@ const UINT16 WGS84_ensemble_i = 6326; // WGS84 ensemble const char* const AGD66_c = "4202"; const char* const AGD84_c = "4203"; const char* const GDA94_c_xyz = "4938"; -const char* const GDA94_c = "4939"; const char* const GDA94_c_2d = "4283"; +const char* const GDA94_c = "4939"; const char* const GDA2020_c_xyz = "7842"; -const char* const GDA2020_c = "7843"; const char* const GDA2020_c_2d = "7844"; +const char* const GDA2020_c = "7843"; // epsg strings for ITRF provide XYZ definition only const char* const ITRF2020_c = "9988"; diff --git a/dynadjust/include/parameters/dnaepsg.hpp b/dynadjust/include/parameters/dnaepsg.hpp index 92fca12e..13809c3d 100644 --- a/dynadjust/include/parameters/dnaepsg.hpp +++ b/dynadjust/include/parameters/dnaepsg.hpp @@ -206,11 +206,11 @@ S epsgStringFromName(const S& datumName) case GDA94_i: case GDA94_i_2d: case GDA94_i_xyz: - return GDA94_c; + return GDA94_c_xyz; case GDA2020_i: case GDA2020_i_2d: case GDA2020_i_xyz: - return GDA2020_c; + return GDA2020_c_xyz; // ITRF case ITRF2020_i: case ITRF2020_i_xyz: From c097621c578f0cac37887ac02126841e565f6874 Mon Sep 17 00:00:00 2001 From: rogerfraser Date: Tue, 7 May 2024 16:36:41 +1000 Subject: [PATCH 003/102] Add ability to identify first file --- dynadjust/include/io/dnaiodna.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/include/io/dnaiodna.hpp b/dynadjust/include/io/dnaiodna.hpp index 17740c60..79deb899 100644 --- a/dynadjust/include/io/dnaiodna.hpp +++ b/dynadjust/include/io/dnaiodna.hpp @@ -89,7 +89,7 @@ class dna_io_dna : public dna_io_base const CDnaDatum& datum, const string& comment); void read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA_TYPE& idt, - CDnaDatum& referenceframe, bool user_supplied_frame, bool override_input_frame, + CDnaDatum& referenceframe, bool firstFile, bool user_supplied_frame, bool override_input_frame, string& fileEpsg, string& fileEpoch, string& geoidversion, UINT32& count); inline const dna_stn_fields dna_stn_positions() { return dsl_; } From 2618e431ba4748f214afc25506ff43727b006809 Mon Sep 17 00:00:00 2001 From: rogerfraser Date: Tue, 7 May 2024 16:40:00 +1000 Subject: [PATCH 004/102] Improve handling of project datum on data import --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 278 ++++-------------- dynadjust/dynadjust/dnaimport/dnainterop.hpp | 9 +- .../dynadjust/dnaimport/dnaparser_pimpl.cxx | 114 ++++--- .../dynadjust/dnaimport/dnaparser_pimpl.hxx | 8 +- .../dynadjust/dnaimport/dnaparser_pskel.cxx | 10 +- .../dynadjust/dnaimport/dnaparser_pskel.hxx | 7 +- .../dnaimportwrapper/dnaimportwrapper.cpp | 123 ++++++-- .../dnaimportwrapper/dnaimportwrapper.hpp | 9 +- dynadjust/include/io/dnaiodna.cpp | 90 +++--- 9 files changed, 312 insertions(+), 336 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index 32750b27..146864fb 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -182,44 +182,13 @@ void dna_import::BuildExtractStationsList(const string& stnList, pvstring vstnLi } -void dna_import::UpdateEpoch(const vifm_t* vinput_file_meta) -{ - // Inspect the first file that was loaded. - // Assume that the epoch in that file is the desired epoch. - - string epoch(""); - - if (vinput_file_meta->empty()) - // Do nothing - return; - - epoch = vinput_file_meta->at(0).epoch; - - if (epoch.empty()) - // Do nothing - return; - - if (dateFromString(epoch) == timeImmemorial()) - epoch = ""; - - m_strProjectDefaultEpoch = epoch; - - // Set default epoch - datum_.SetEpoch(epoch); - - // Update bst and bms files accordingly - sprintf(bst_meta_.epoch, "%s", epoch.substr(0, STN_EPOCH_WIDTH).c_str()); - sprintf(bms_meta_.epoch, "%s", epoch.substr(0, STN_EPOCH_WIDTH).c_str()); -} - - -void dna_import::InitialiseDatum(const string& reference_frame) +void dna_import::InitialiseDatum(const string& reference_frame, const string epoch) { try { // Take the default reference frame, set either by the user or // the datum_ constructor (GDA2020). Epoch is that of the default // reference frame (indicated by "") - datum_.SetDatumFromName(reference_frame, ""); + datum_.SetDatumFromName(reference_frame, epoch); } catch (const runtime_error& e) { stringstream ss; @@ -236,13 +205,15 @@ void dna_import::InitialiseDatum(const string& reference_frame) m_strProjectDefaultEpoch = ""; // Update binary file meta - // Note: the following rule applies each time a new file is loaded: - // * This method (InitialiseDatum) is called (from dnaimportwrapper) before any files are loaded - // * By default, the bst & bms meta is initialised with the reference frame and reference epoch. - // * As each file is loaded, the frame and epoch from the files are captured from the header - // * Once all files have been loaded, UpdateEpoch() is called to update the default epoch, with the - // assumption that the first file contains the epoch that is to be used for the default, e.g. SINEX file. - // * DynAdjust will not attempt to reconcile multiple default epochs found across the input files + // Note: the following rule applies each time a set of files is loaded via import: + // * This method (InitialiseDatum) is called (from dnaimportwrapper) before any files are loaded. + // By default, the bst & bms meta are initialised with the reference frame and reference epoch. + // * The datum and epoch within the first file (if present) is used to set the default project + // datum. If a datum isn't provided in the first input file, e.g. SINEX file, the default datum + // (GDA2020) is used. As each subsequent file is loaded, the default frame and epoch are assumed. + // * After all files have been loaded, InitialiseDatum is called again to set the metadata. + // * import does not attempt to reconcile multiple default datums and epochs found across the input + // files. It will however produce a warning when something different to the default is discovered. sprintf(bst_meta_.epsgCode, "%s", m_strProjectDefaultEpsg.substr(0, STN_EPSG_WIDTH).c_str()); sprintf(bms_meta_.epsgCode, "%s", m_strProjectDefaultEpsg.substr(0, STN_EPSG_WIDTH).c_str()); sprintf(bst_meta_.epoch, "%s", m_strProjectDefaultEpoch.substr(0, STN_EPOCH_WIDTH).c_str()); @@ -250,101 +221,9 @@ void dna_import::InitialiseDatum(const string& reference_frame) } -// // DynaXML, dna v.1-2 and sinex file formats do not contain reference frame information, so -// // by default the reference frame for all stations is set to GDA2020. -// // This function is called to modify the default frame to a user-specified frame -// void dna_import::SetDefaultReferenceFrame(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements) -// { -// // Default is GDA2020. -// switch (m_ift) -// { -// case sinex: // SNX -// // For sinex files, the default (or user input) reference frame is set in -// // parse_sinex_msr and parse_sinex_stn. The epoch of the sinex file is -// // also set in these functions. Hence, there is no need to override here. -// return; -// -// case dynaml: // DynaML - *stn.xml and *msr.xml -// // Reference frame is properly handled in and dnaparser_pskel.cxx dnaparser_pimpl.cxx -// case dna: // DNA - .stn and .msr -// // Reference frame is properly handled in and ParseDNAMSR... -// return; -// -// ////////////////////////////////////////////////////////// -// // UNSUPPORTED OPTIONS -// -// case geodesyml: // GeodesyML - GML application schema -// case csv: // CSV -// default: -// -// //throw XMLInteropException("ParseInputFile(): Could not deduce file type from extension or contents.", 0); -// stringstream ss; -// ss << "SetDefaultReferenceFrame(): unsupported file type."; -// parseStatus_ = PARSE_UNRECOGNISED_FILE; -// throw XMLInteropException(ss.str(), 0); -// -// -// // Does the user want to override what is contained in the input files? -// if (projectSettings_.i.override_input_rfame == 0) -// // No, so don't override the reference frame found in the input files -// return; -// break; -// } -// -// ////////////////////////////////////////////////////////// -// // Unused code - comment out until required -// // -// // // Yes, override what is contained in the input files. -// // -// // // Get defaults -// // string strEpsg(datum_.GetEpsgCode_s()); -// // string strEpoch(datum_.GetEpoch_s()); -// // -// // for_each(vStations->begin(), vStations->end(), -// // [this, &strEpsg, &strEpoch] (dnaStnPtr& s) { -// // s->SetReferenceFrame(projectSettings_.i.reference_frame); -// // s->SetEpoch(strEpoch); -// // }); -// // -// // // If only some dna records have frame and epoch, the default reference frame and epoch will be used. -// // -// // CDnaGpsBaselineCluster* bslCluster; -// // CDnaGpsPointCluster* pntCluster; -// // -// // for_each(vMeasurements->begin(), vMeasurements->end(), -// // [this, &bslCluster, &pntCluster, &strEpsg, &strEpoch](dnaMsrPtr& m){ -// // -// // // Set reference frame (and reference epoch) in the CDnaMeasurement (parent class) -// // m->SetReferenceFrame(projectSettings_.i.reference_frame); -// // m->SetEpoch(strEpoch); -// // -// // switch (m->GetTypeC()) { -// // case 'G': // Single Baseline (treat as a single-baseline cluster) -// // bslCluster = (CDnaGpsBaselineCluster*) (m.get()); -// // bslCluster->SetReferenceFrame(projectSettings_.i.reference_frame); -// // bslCluster->SetEpoch(strEpoch); -// // break; -// // case 'X': // GPS Baseline cluster -// // bslCluster = (CDnaGpsBaselineCluster*) (m.get()); -// // bslCluster->SetReferenceFrame(projectSettings_.i.reference_frame); -// // bslCluster->SetEpoch(strEpoch); -// // break; -// // case 'Y': // GPS point cluster -// // pntCluster = (CDnaGpsPointCluster*) (m.get()); -// // pntCluster->SetReferenceFrame(projectSettings_.i.reference_frame); -// // pntCluster->SetEpoch(strEpoch); -// // break; -// // default: -// // break; -// // } -// // -// // }); -// } - - _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, - PUINT32 clusterID, input_file_meta_t* input_file_meta, + PUINT32 clusterID, input_file_meta_t* input_file_meta, bool firstFile, string* success_msg, project_settings* p) { projectSettings_ = *p; @@ -356,17 +235,6 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS isProcessing_ = true; stringstream ss; - try - { - // Reset default datum for the input file - // Note, the following call assumes InitialiseDatum(...) - // has already been called, and set m_strEpsg and m_strEpoch. - datum_.SetDatumFromEpsg(m_strProjectDefaultEpsg, m_strProjectDefaultEpoch); - } - catch (const runtime_error& e) { - SignalExceptionParse(e.what(), 0); - } - try { // Obtain exclusive use of the input file pointer @@ -405,6 +273,7 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS char first_chars[PRINT_LINE_LENGTH+1]; string fileEpsg, fileEpoch; + fileEpsg = ""; try { @@ -434,7 +303,7 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS m_ift = dynaml; // Parse the DynaML file - ParseXML(fileName, vStations, stnCount, vMeasurements, msrCount, clusterID, fileEpsg, fileEpoch, success_msg); + ParseXML(fileName, vStations, stnCount, vMeasurements, msrCount, clusterID, fileEpsg, fileEpoch, firstFile, success_msg); if (fileEpsg.empty()) fileEpsg = m_strProjectDefaultEpsg; @@ -459,6 +328,13 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS sprintf(input_file_meta->epsgCode, "%s", m_strProjectDefaultEpsg.substr(0, STN_EPSG_WIDTH).c_str()); sprintf(input_file_meta->epoch, "%s", datum_.GetEpoch_s().substr(0, STN_EPOCH_WIDTH).c_str()); + if (firstFile) + { + fileEpoch = input_file_meta->epoch; + if (!fileEpoch.empty()) + m_strProjectDefaultEpoch = fileEpoch; + } + SignalComplete(); } // STN or MSR @@ -473,7 +349,7 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS m_ift = dna; // Parse the DNA file - ParseDNA(fileName, vStations, stnCount, vMeasurements, msrCount, clusterID, fileEpsg, fileEpoch); + ParseDNA(fileName, vStations, stnCount, vMeasurements, msrCount, clusterID, fileEpsg, fileEpoch, firstFile); if (fileEpsg.empty()) fileEpsg = m_strProjectDefaultEpsg; @@ -504,11 +380,6 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS if (p->i.apply_discontinuities) ApplyDiscontinuities(vMeasurements); } - - // SetDefaultReferenceFrame is not needed. Keep for potential file formats that require this to be set - // - // // Set default reference frame (if the file type does not specify it). - // SetDefaultReferenceFrame(vStations, vMeasurements); // Populate metadata sprintf(input_file_meta->filename, "%s", fileName.c_str()); @@ -524,7 +395,7 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, - string& fileEpsg, string& fileEpoch, string* success_msg) + string& fileEpsg, string& fileEpoch, bool firstFile, string* success_msg) { parseStatus_ = PARSE_SUCCESS; @@ -543,6 +414,7 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 clusterID, // pass cluster ID so that a unique number can be retained across multiple files datum_.GetName(), // pass the default reference frame datum_.GetEpoch_s(), // pass the default epoch + firstFile, // is this the first file to be loaded? projectSettings_.i.user_supplied_frame==1, // Has a reference frame been supplied? projectSettings_.i.override_input_rfame==1); // Should this reference frame override all others? @@ -605,25 +477,41 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 try { + // Get the reference frame from the XML file (i.e. referenceframe attribute in DnaXmlFormat element) - string xml_referenceframe = referenceframe_p.str(); - string xml_epoch = epoch_p.str(); - - // Is this attribute value an empty string? As long as a default value - // is specified in DynaML.xsd, this value will never be empty, unless the user - // has inadvertently set in the xml file, e.g.: - // - if (xml_referenceframe.empty()) - // No, so get the epsg code from the default datum - fileEpsg = datum_.GetEpsgCode_s(); - else - fileEpsg = epsgStringFromName(xml_referenceframe); + fileEpsg = DnaXmlFormat_p.FileEpsg(); + fileEpoch = DnaXmlFormat_p.FileEpoch(); + + if (firstFile) + { + if (fileEpsg.empty()) + // Get the epsg code from the default datum + fileEpsg = datum_.GetEpsgCode_s(); + + if (fileEpoch.empty()) + { + // Get the epoch of the nominated epsg (whether default or from the file) + UINT32 u = LongFromString(fileEpsg); + fileEpoch = referenceepochFromEpsgCode(u); + } - if (xml_epoch.empty()) - // No, so get the epoch from the default datum - fileEpoch = datum_.GetEpoch_s(); + if (!projectSettings_.i.override_input_rfame && !projectSettings_.i.user_supplied_frame) + datum_.SetDatumFromEpsg(fileEpsg, fileEpoch); + } else - fileEpoch = xml_epoch; + { + // Is this attribute value an empty string? As long as a default value + // is specified in DynaML.xsd, this value will never be empty, unless the user + // has inadvertently set in the xml file, e.g.: + // + if (fileEpsg.empty()) + // No, so get the epsg code from the default datum + fileEpsg = datum_.GetEpsgCode_s(); + + if (fileEpoch.empty()) + // No, so get the epoch from the default datum + fileEpoch = datum_.GetEpoch_s(); + } } catch (...) { @@ -1128,51 +1016,11 @@ void dna_import::ApplyDiscontinuitiesMeasurements_D(vector* vDire } } } - - -//// Get version number and assign field widths/locations -//void dna_import::ParseDNAVersion(const INPUT_DATA_TYPE& idt) -//{ -// string sBuf; -// -// // Obtain exclusive use of the input file pointer -// import_file_mutex.lock(); -// getline((*ifsInputFILE_), sBuf); -// // release file pointer mutex -// import_file_mutex.unlock(); -// -// // Set the default version -// string version("1.00"); -// -// // Attempt to get this file's version -// try { -// if (iequals("!#=DNA", sBuf.substr(0, 6))) -// version = trimstr(sBuf.substr(6, 6)); -// } -// catch (...) { -// SignalExceptionParseDNA("ParseDNAVersion(): Could not extract file version from the record: ", -// sBuf, 6); -// } -// -// stringstream ss; -// switch (idt) -// { -// case stn_data: -// determineDNASTNFieldParameters(version, dsl_, dsw_); -// break; -// case msr_data: -// determineDNAMSRFieldParameters(version, dml_, dmw_); -// break; -// default: -// ss << " Unknown file type." << endl; -// m_columnNo = 0; -// throw XMLInteropException(ss.str(), m_lineNo); -// } -//} + void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, - string& fileEpsg, string& fileEpoch) + string& fileEpsg, string& fileEpoch, bool firstFile) { parseStatus_ = PARSE_SUCCESS; @@ -1203,7 +1051,8 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 // reference frame based on the header and user preferences dnaFile.read_dna_header(ifsInputFILE_, version, idt, datum_, // default datum - projectSettings_.i.user_supplied_frame==1, // Has a reference frame been supplied? + firstFile, // is this the first file to be loaded? + projectSettings_.i.user_supplied_frame==1, // Has a reference frame been supplied? projectSettings_.i.override_input_rfame==1, // does the user want to override the datum in the input files? fileEpsg, fileEpoch, geoversion, count); // release file pointer mutex @@ -1218,8 +1067,7 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 if (idt == stn_data || (pos = fileName.find(stn_file_type, 0)) != string::npos) { - // Determine the file format version - //ParseDNAVersion(stn_data); + // set the column positions and widths (using version obtained from the header) dsl_ = dnaFile.dna_stn_positions(); dsw_ = dnaFile.dna_stn_widths(); @@ -4861,6 +4709,8 @@ void dna_import::SerialiseBms(const string& bms_filename, vdnaMsrPtr* vMeasureme sprintf(bms_meta_.modifiedBy, "%s", __BINARY_NAME__); bms_meta_.binCount = m_binaryRecordCount; bms_meta_.inputFileCount = bms.create_msr_input_file_meta(vinput_file_meta, &(bms_meta_.inputFileMeta)); + bms_meta_.reftran = false; + bms_meta_.geoid = false; bms.write_bms_file(bms_filename, vMeasurements, bms_meta_); } catch (const runtime_error& e) { @@ -4880,6 +4730,8 @@ void dna_import::SerialiseBst(const string& bst_filename, vdnaStnPtr* vStations, bst_meta_.binCount = static_cast(vStations->size()); bst_meta_.inputFileCount = bst.create_stn_input_file_meta(vinput_file_meta, &(bst_meta_.inputFileMeta)); bst_meta_.reduced = true; + bst_meta_.reftran = false; + bst_meta_.geoid = false; bst.write_bst_file(bst_filename, vStations, vUnusedStns, bst_meta_, flagUnused); } catch (const runtime_error& e) { diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.hpp b/dynadjust/dynadjust/dnaimport/dnainterop.hpp index 11ff92aa..b4cbe5b9 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.hpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.hpp @@ -112,7 +112,7 @@ class dna_import { // Parse an xml file _PARSE_STATUS_ ParseInputFile(const string& filename, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, - PUINT32 clusterID, input_file_meta_t* input_file_meta, + PUINT32 clusterID, input_file_meta_t* input_file_meta, bool firstFILE, string* success_msg, project_settings* p); _PARSE_STATUS_ LoadDNAGeoidFile(const string& fileName, vdnaStnPtr* vStations); @@ -187,8 +187,7 @@ class dna_import { inline _PARSE_STATUS_ GetStatus() const { return parseStatus_; } void inline ResetFileOrder() const { g_fileOrder = 0; } - void InitialiseDatum(const string& reference_frame); - void UpdateEpoch(const vifm_t* vinput_file_meta); + void InitialiseDatum(const string& reference_frame, const string epoch=""); void PrintMeasurementsToStations(string& m2s_file, MsrTally* parsemsrTally, string& bst_file, string& bms_file, string& aml_file, pvASLPtr vAssocStnList); @@ -201,7 +200,7 @@ class dna_import { // DynaML files void ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, - string& fileEpsg, string& fileEpoch, string* success_msg); + string& fileEpsg, string& fileEpoch, bool firstFile, string* success_msg); // SINEX files void ParseSNX(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, @@ -211,7 +210,7 @@ class dna_import { //void ParseDNAVersion(const INPUT_DATA_TYPE& idt); void ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, - string& fileEpsg, string& fileEpoch); + string& fileEpsg, string& fileEpoch, bool firstFile); void ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount); void ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT32 clusterID); diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index 519160e6..233e1d17 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -867,7 +867,8 @@ void DnaStation_pimpl::post_DnaStation() // DnaXmlFormat_pimpl // -DnaXmlFormat_pimpl::DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, const string& referenceframe, const string& epoch, bool userspecifiedreferenceframe, bool overridereferenceframe) +DnaXmlFormat_pimpl::DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, const string& referenceframe, const string& epoch, + bool firstFile, bool userspecifiedreferenceframe, bool overridereferenceframe) { // capture pointer to file stream is_ = is; @@ -879,6 +880,9 @@ DnaXmlFormat_pimpl::DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, con _referenceframe = referenceframe; _epoch = epoch; + // capture first file flag + _firstFile = firstFile; + // Has the user supplied a reference frame and should this be used to override all? _userspecifiedreferenceframe = userspecifiedreferenceframe; _overridereferenceframe = overridereferenceframe; @@ -1306,34 +1310,46 @@ void referenceframe_pimpl::pre() // For DynaML.xsd, the following is specified: // // In this case, post_string() will return "GDA2020" -void referenceframe_pimpl::post_type(string& referenceframe, bool userspecifiedreferenceframe, bool overridereferenceframe) +void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, bool userspecifiedreferenceframe, bool overridereferenceframe, bool firstFile) { - // 1. Get the DnaXmlFormat referenceframe attribute value from the file - _referenceframe = trimstr(post_string()); - // 2. Does the user want to override the default datum? - if (overridereferenceframe) - // Do nothing, just return as referenceframe will become - // the default for all stations and measurements loaded - // from the file. - return; - - // 3. Does the user want the referenceframe attribute in the file to become the default? - if (!userspecifiedreferenceframe) + if (firstFile) { - // Here, the assumption is, if the user did not specify a reference frame, - // then the user wants to adopt the DnaXmlFormat referenceframe attribute + // 1. Get the DnaXmlFormat referenceframe attribute value from the file + _referenceframe = trimstr(post_string()); + fileEpsg = epsgStringFromName(_referenceframe); + + // 2. Does the user want to override the default datum? + if (overridereferenceframe) + // Do nothing, just return as referenceframe will become + // the default for all stations and measurements loaded + // from the file. + return; - // But, is this attribute value an empty string? As long as a default value - // is specified in DynaML.xsd, this value will never be empty, unless the user - // has inadvertently set in the xml file, e.g.: - // + // 3. Does the user want the referenceframe attribute in the file to become the default? + if (!userspecifiedreferenceframe) + { + // Here, the assumption is, if the user did not specify a reference frame, + // then the user wants to adopt the DnaXmlFormat referenceframe attribute + + // But, is this attribute value an empty string? As long as a default value + // is specified in DynaML.xsd, this value will never be empty, unless the user + // has inadvertently set in the xml file, e.g.: + // + if (!_referenceframe.empty()) + // Set the DynaML parser reference frame to the file's DnaXmlFormat referenceframe attribute + referenceframe = _referenceframe; + else + // Set to the default reference frame passed from import + _referenceframe = referenceframe; + } + } + else + { if (_referenceframe.empty()) // Set to the default reference frame passed from import _referenceframe = referenceframe; - else - // adopt the DnaXmlFormat referenceframe attribute - referenceframe = _referenceframe; + fileEpsg = epsgStringFromName(trimstr(post_string())); } } @@ -1349,22 +1365,48 @@ void epoch_pimpl::pre() // For DynaML.xsd, the following is specified: // // In this case, post_string() will return "01.01.1994" -void epoch_pimpl::post_type(string& epoch, bool overridereferenceframe) +void epoch_pimpl::post_type(string& epoch, string& fileEpoch, bool userspecifiedreferenceframe, bool overridereferenceframe, bool firstFile) { - // 1. Get the DnaXmlFormat epoch attribute value from the file - _epoch = post_string(); - - // 2. Does the user want to override the default datum? - if (overridereferenceframe) - // Do nothing, just return as epoch will become - // the default for all stations and measurements loaded - // from the file. - return; + if (firstFile) + { + // 1. Get the DnaXmlFormat epoch attribute value from the file + _epoch = trimstr(post_string()); + fileEpoch = _epoch; + + // 2. Does the user want to override the default datum? + if (overridereferenceframe) + // Do nothing, just return as epoch will become + // the default for all stations and measurements loaded + // from the file. + return; - // Since import doesn't offer an option to capture epoch on the command line, - // take the epoch from the DnaXmlFormat referenceframe attribute - if (_epoch.empty()) - epoch = _epoch; + // 3. Does the user want the epoch attribute in the file to become the default? + if (!userspecifiedreferenceframe) + { + // Here, the assumption is, if the user did not specify a reference frame, + // then the user wants to adopt the DnaXmlFormat epoch attribute + + // But, is this attribute value an empty string? As long as a default value + // is specified in DynaML.xsd, this value will never be empty, unless the user + // has inadvertently set in the xml file, e.g.: + // + if (!_epoch.empty()) + // Set the DynaML parser epoch to the file's DnaXmlFormat epoch attribute + epoch = _epoch; + else + // Set to the default epoch passed from import + _epoch = epoch; + } + } + else + { + // Since import doesn't offer an option to capture epoch on the command line, + // take the epoch from the DnaXmlFormat referenceframe attribute + if (_epoch.empty()) + // Set to the default reference frame passed from import + _epoch = epoch; + fileEpoch = trimstr(post_string()); + } } // system_pimpl diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx index 86d98fc3..086976aa 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx @@ -117,6 +117,7 @@ class DnaXmlFormat_pimpl: public virtual DnaXmlFormat_pskel public: DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, const string& referenceframe, const string& epoch, + bool firstFile, bool userspecifiedreferenceframe, bool overridereferenceframe); virtual void pre (); virtual void DnaStation (); @@ -132,6 +133,9 @@ public: inline UINT32 NumMeasurementsRead() const { return _measurement_count; } inline UINT32 CurrentClusterID() const { return _clusterID; } + inline string FileEpsg() const { return _fileEpsg; } + inline string FileEpoch() const { return _fileEpoch; } + protected: string _parse_msg; @@ -233,7 +237,7 @@ class referenceframe_pimpl: public virtual referenceframe_pskel, { public: virtual void pre (); - virtual void post_type (string& referenceframe, bool userspecifiedreferenceframe, bool override_referenceframe); + virtual void post_type (string& referenceframe, string& fileEpsg, bool userspecifiedreferenceframe, bool override_referenceframe, bool firstFile); inline const string str() { return _referenceframe; } protected: @@ -246,7 +250,7 @@ class epoch_pimpl: public virtual epoch_pskel, { public: virtual void pre (); - virtual void post_type (string& epoch, bool override_referenceframe); + virtual void post_type (string& epoch, string& fileEpoch, bool userspecifiedreferenceframe, bool override_referenceframe, bool firstFile); inline const string str() { return _epoch; } protected: diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx index 5bb21374..23339572 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx @@ -2143,7 +2143,7 @@ bool DnaXmlFormat_pskel::_attribute_impl (const ::xml_schema::ro_string& ns, this->epoch_parser_->_pre_impl (); this->epoch_parser_->_characters (v); this->epoch_parser_->_post_impl (); - this->epoch_parser_->post_type (_epoch, _overridereferenceframe); + this->epoch_parser_->post_type (_epoch, _fileEpoch, _userspecifiedreferenceframe, _overridereferenceframe, _firstFile); this->epoch(); } @@ -2163,10 +2163,8 @@ bool DnaXmlFormat_pskel::_attribute_impl (const ::xml_schema::ro_string& ns, this->referenceframe_parser_->_pre_impl (); this->referenceframe_parser_->_characters (v); this->referenceframe_parser_->_post_impl (); - this->referenceframe_parser_->post_type (_referenceframe, _userspecifiedreferenceframe, _overridereferenceframe); + this->referenceframe_parser_->post_type (_referenceframe, _fileEpsg, _userspecifiedreferenceframe, _overridereferenceframe, _firstFile); this->referenceframe (); - - } return true; @@ -3188,14 +3186,14 @@ void type_pskel::post_type () // referenceframe_pskel // string& referenceframe, bool user_specified, bool override_referenceframe -void referenceframe_pskel::post_type (string&, bool, bool) +void referenceframe_pskel::post_type (string&, string&, bool, bool, bool) { } // epoch_pskel // string& epoch, bool override_referenceframe -void epoch_pskel::post_type (string&, bool) +void epoch_pskel::post_type (string&, string&, bool, bool, bool) { } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx index 29bcd12f..c072452b 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx @@ -820,6 +820,9 @@ protected: UINT32 _station_count; string _referenceframe; string _epoch; + string _fileEpsg; + string _fileEpoch; + bool _firstFile; bool _userspecifiedreferenceframe; bool _overridereferenceframe; }; @@ -1226,7 +1229,7 @@ public: // pre (); // string& referenceframe, bool user_specified, bool overridereferenceframe - virtual void post_type (string&, bool, bool); + virtual void post_type (string&, string&, bool, bool, bool); }; class epoch_pskel: public virtual ::xml_schema::string_pskel @@ -1238,7 +1241,7 @@ public: // pre (); // string& referenceframe, bool overridereferenceframe - virtual void post_type (string&, bool); + virtual void post_type (string&, string&, bool, bool, bool); }; class system_pskel: public virtual ::xml_schema::string_pskel diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index 68161de8..dcf73d09 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -61,7 +61,14 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, pro } if (!p->i.reference_frame.empty()) - *f_out << setw(PRINT_VAR_PAD) << left << "Default reference frame:" << p->i.reference_frame << endl; + { + *f_out << setw(PRINT_VAR_PAD) << left << "Default reference frame:" << p->i.reference_frame; + if (p->i.user_supplied_frame) + *f_out << " (user supplied)"; + else + *f_out << " (default)"; + *f_out << endl; + } if (!p->i.include_msrs.empty()) *f_out << setw(PRINT_VAR_PAD) << left << "Strip all measurements except:" << p->i.include_msrs << endl; @@ -528,9 +535,10 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti if (!iequals(epsgCode, vinput_file_meta->at(i).epsgCode)) { string inputFrame(datumFromEpsgString(vinput_file_meta->at(i).epsgCode)); - ssEpsgWarning << endl << "- Warning: The default reference frame (used for all exported files)" << endl << - " does not match the reference frame of one or more input files. To" << endl << - " suppress this warning, override the default reference frame using" << endl << + ssEpsgWarning << endl << "- Warning: The default reference frame (" << p.i.reference_frame << ")" << + " used for all exported" << endl << + " files does not match the reference frame of one or more input files." << endl << + " To suppress this warning, override the default reference frame using" << endl << " --reference-frame, or provide --override-input-ref-frame."; displayEpsgWarning = true; break; @@ -780,9 +788,6 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* // UINT32 stnCount(0), msrCount(0), clusterID(0); - // obtain the project reference frame - string epsgCode(epsgStringFromName(p.i.reference_frame)); - size_t pos = string::npos; size_t strlen_arg = 0; for_each(p.i.input_files.begin(), p.i.input_files.end(), @@ -794,7 +799,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* strlen_arg += (6 + PROGRESS_PERCENT_04); size_t i, nfiles(p.i.input_files.size()); // for each file... - string input_file, ss, status_msg; + string epsgCode, input_file, ss, status_msg; vstring input_files; ostringstream ss_time, ss_msg; input_file_meta_t input_file_meta; @@ -805,8 +810,13 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* cout << "+ Parsing: " << endl; *imp_file << "+ Parsing " << endl; + bool firstFile; + for (i=0; i(p.i.reference_frame); + stnCount = msrCount = 0; input_file = p.i.input_files.at(i); if (!exists(input_file)) @@ -826,12 +836,14 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* *imp_file << " " << setw(strlen_arg) << left << ss; running = true; + firstFile = bool(i == 0); + thread_group ui_interop_threads; if (!p.g.quiet) ui_interop_threads.create_thread(dna_import_progress_thread(&parserDynaML, &p)); ui_interop_threads.create_thread(dna_import_thread(&parserDynaML, &p, input_file, vStations, &stnCount, vMeasurements, &msrCount, - &clusterID, &input_file_meta, &status_msg, + &clusterID, &input_file_meta, firstFile, &status_msg, &elapsed_time)); ui_interop_threads.join_all(); @@ -903,22 +915,69 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* } *imp_file << time_message << endl; - // Produce a warning if the input file's default reference frame + // Produce a info or warning if the input file's default reference frame // is different to the project reference frame - string inputFileEpsg; + string inputFileEpsg, inputFileDatum, inputFileEpoch; try { - inputFileEpsg = datumFromEpsgString(input_file_meta.epsgCode); + inputFileDatum = datumFromEpsgString(input_file_meta.epsgCode); + inputFileEpsg = input_file_meta.epsgCode; + inputFileEpoch = input_file_meta.epoch; } catch (...) { + inputFileDatum = epsgCode; inputFileEpsg = epsgCode; } + // Is this the first file? If so, attempt to set the default datum from + // the input file (if applicable). + UINT32 epsgCodei; + bool referenceframeChanged(false); + if (firstFile) + { + // If the user has not provided a reference frame, then inspect the file reference frame + // If the file does not contain a reference frame (eg SNX), fileEpsg will be empty. Thus, + // no change will occur. + if (!inputFileEpsg.empty() && !p.i.user_supplied_frame) + { + // Set the project defaults + referenceframeChanged = true; + epsgCodei = LongFromString(inputFileEpsg); + p.i.reference_frame = datumFromEpsgCode(epsgCodei); + p.r.reference_frame = p.i.reference_frame; + + try { + // Initialise the 'default' datum (frame and epoch) for the project, from the first file. + parserDynaML.InitialiseDatum(p.i.reference_frame, trimstr(inputFileEpoch)); + } + catch (const XMLInteropException& e) { + stringstream ss; + ss << "- Error: "; + cout << ss.str() << e.what() << endl; + return EXIT_FAILURE; + } + } + + if (inputFileEpoch.empty()) + p.r.epoch = referenceepochFromEpsgCode(epsgCodei); + else + p.r.epoch = inputFileEpoch; + } + if (!iequals(epsgCode, input_file_meta.epsgCode)) { stringstream ssEpsgWarning; - - ssEpsgWarning << "- Warning: Input file reference frame (" << inputFileEpsg << - ") does not match the " << endl << " default reference frame."; + + if (referenceframeChanged) + { + ssEpsgWarning << "- Warning: The default reference frame (" << GDA2020_s << ") has been changed to " << endl << + " the default datum of " << leafStr(p.i.input_files.at(i)) << " (" << inputFileDatum << ")."; + } + else + { + ssEpsgWarning << "- Warning: Input file reference frame (" << inputFileDatum << + ") does not match the " << endl << " default reference frame (" << p.i.reference_frame << ")."; + } + if (!p.g.quiet) cout << ssEpsgWarning.str() << endl; *imp_file << ssEpsgWarning.str() << endl; @@ -1260,7 +1319,15 @@ int main(int argc, char* argv[]) cout << setw(PRINT_VAR_PAD) << left << " Binary measurement output file: " << p.i.bms_file << endl; if (!p.i.reference_frame.empty()) - cout << setw(PRINT_VAR_PAD) << left << " Default reference frame:" << p.i.reference_frame << endl; + { + cout << setw(PRINT_VAR_PAD) << left << " Default reference frame:" << p.i.reference_frame; + + if (p.i.user_supplied_frame) + cout << " (user supplied)"; + else + cout << " (default)"; + cout << endl; + } if (p.i.override_input_rfame) cout << setw(PRINT_VAR_PAD) << left << " Override input file ref frame:" << yesno_string(p.i.override_input_rfame) << endl; @@ -1334,6 +1401,9 @@ int main(int argc, char* argv[]) // First things first! // Set the 'default' reference frame for the binary station and measurement files + // At this point, the frame may be the hard-coded default, or a user-specified + // frame via: -r [--reference-frame] arg + // See comments in InitialiseDatum() try { // Initialise the 'default' datum for the project. parserDynaML.InitialiseDatum(p.i.reference_frame); @@ -1408,6 +1478,9 @@ int main(int argc, char* argv[]) } } + // Now, set the 'default' epoch in the binary station and measurement files + string default_datum = p.i.reference_frame; + // Import network information based on a segmentation block? if (p.i.import_block) { @@ -1445,18 +1518,6 @@ int main(int argc, char* argv[]) if (!p.g.quiet) cout << endl; - // Now, set the 'default' epoch in the binary station and measurement files - try { - // Initialise the 'default' datum for the project. - parserDynaML.UpdateEpoch(&vinput_file_meta); - } - catch (const XMLInteropException& e) { - stringstream ss; - ss << "- Error: "; - cout << ss.str() << e.what() << endl; - return EXIT_FAILURE; - } - vstring vPoorlyConstrainedStns; // Ignore measurements that do not sufficiently (in themselves) allow for a station to be estimated @@ -2505,9 +2566,6 @@ int main(int argc, char* argv[]) parserDynaML.SerialiseDatabaseId(p.i.dbid_file, &vmeasurementsTotal); } - - - // Export stations and measurements try { if (p.i.export_dynaml || p.i.export_dna_files) @@ -2549,7 +2607,8 @@ int main(int argc, char* argv[]) if (errorCount) { - cout << "- Warning: some files were not parsed - please read the log file for more details." << endl; + if (!p.g.quiet) + cout << "- Warning: some files were not parsed - please read the log file for more details." << endl; imp_file << "- Warning: some files were not parsed - please read the log file for more details." << endl; } diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.hpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.hpp index d363439e..30eb93cd 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.hpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.hpp @@ -90,11 +90,11 @@ class dna_import_thread public: dna_import_thread(dna_import* dnaParse, project_settings* p, const string& filename, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, - PUINT32 clusterID, input_file_meta_t* input_file_meta, string* status_msg, + PUINT32 clusterID, input_file_meta_t* input_file_meta, bool firstFile, string* status_msg, milliseconds* ms) : _dnaParse(dnaParse), _p(p), _filename(filename) , _vStations(vStations), _stnCount(stnCount), _vMeasurements(vMeasurements), _msrCount(msrCount) - , _clusterID(clusterID), _input_file_meta(input_file_meta) + , _clusterID(clusterID), _input_file_meta(input_file_meta), _firstFile(firstFile) , _status_msg(status_msg), _ms(ms) {}; void operator()() { @@ -103,7 +103,7 @@ class dna_import_thread _dnaParse->ParseInputFile(_filename, _vStations, _stnCount, _vMeasurements, _msrCount, - _clusterID, _input_file_meta, + _clusterID, _input_file_meta, _firstFile, _status_msg, _p); *_ms = milliseconds(time.elapsed().wall/MILLI_TO_NANO); } @@ -123,7 +123,7 @@ class dna_import_thread inline void SetFile(const string& file) { _filename = file; } private: - dna_import* _dnaParse; + dna_import* _dnaParse; project_settings* _p; string _filename; vdnaStnPtr* _vStations; @@ -132,6 +132,7 @@ class dna_import_thread PUINT32 _msrCount; PUINT32 _clusterID; input_file_meta_t* _input_file_meta; + bool _firstFile; string* _status_msg; milliseconds* _ms; }; diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index 7caa5898..79f433c0 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -165,7 +165,7 @@ void dna_io_dna::read_ren_file(const string& filename, pv_string_vstring_pair st UINT32 count(0); // read header information - read_dna_header(&renaming_file, version, idt, datum, false, false, fileEpsg, fileEpoch, geoidVersion, count); + read_dna_header(&renaming_file, version, idt, datum, false, false, false, fileEpsg, fileEpoch, geoidVersion, count); read_ren_data(&renaming_file, stnRenaming); @@ -249,7 +249,7 @@ void dna_io_dna::read_ren_data(std::ifstream* ptr, pv_string_vstring_pair stnRen void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA_TYPE& idt, - CDnaDatum& referenceframe, bool user_supplied_frame, bool override_input_frame, + CDnaDatum& referenceframe, bool firstFile, bool user_supplied_frame, bool override_input_frame, string& fileEpsg, string& fileEpoch, string& geoidversion, UINT32& count) { string sBuf; @@ -303,7 +303,7 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA // Station file if (iequals(type, "stn")) idt = stn_data; - // MEasurement file + // Measurement file else if (iequals(type, "msr")) idt = msr_data; // Geoid information file @@ -357,51 +357,69 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA } // Try to get the reference frame + // For the first file, and unless the user has specified a reference frame, + // the reference frame will be used to set the frame for all other files. try { - switch (idt) { case stn_data: case msr_data: - // Capture file epsg - if (file_referenceframe.empty()) - // Get the epsg code from the default datum - fileEpsg = referenceframe.GetEpsgCode_s(); - else - fileEpsg = epsgStringFromName(file_referenceframe); - - if (epoch_version.empty()) - // No, so get the epoch from the default datum - fileEpoch = referenceframe.GetEpoch_s(); + if (firstFile) + { + // Capture file epsg + if (file_referenceframe.empty()) + // Get the epsg code from the default datum + fileEpsg = referenceframe.GetEpsgCode_s(); + else + fileEpsg = epsgStringFromName(file_referenceframe); + + // capture file epoch + if (epoch_version.empty()) + { + // Get the epoch of the nominated epsg (whether default or from the file) + UINT32 u = LongFromString(fileEpsg); + fileEpoch = referenceepochFromEpsgCode(u); + } + else + fileEpoch = epoch_version; + + // Presently, the logic for handling default reference frame is duplicated for + // each file type, here and in dnaparser_pimpl.cxx: + // void referenceframe_pimpl::post_type(...) + + // 2. Does the user want to override the default datum? + if (override_input_frame) + // Do nothing, just return as referenceframe will become + // the default for all stations and measurements loaded + // from the file. + break; + + // 3. Does the user want the referenceframe attribute in the file to become the default? + if (!user_supplied_frame) + { + if (!file_referenceframe.empty()) + // adopt the reference frame supplied in the file + referenceframe.SetDatumFromName(file_referenceframe, epoch_version); + } + + // Since import doesn't offer an option to capture epoch on the command line, + // take the epoch from the file (if not empty). + referenceframe.SetEpoch(fileEpoch); + } else - fileEpoch = epoch_version; - - // Presently, the logic for handling default reference frame is duplicated for - // each file type, here and in dnaparser_pimpl.cxx: - // void referenceframe_pimpl::post_type(...) - - // 2. Does the user want to override the default datum? - if (override_input_frame) - // Do nothing, just return as referenceframe will become - // the default for all stations and measurements loaded - // from the file. - break; - - // 3. Does the user want the referenceframe attribute in the file to become the default? - if (!user_supplied_frame) { + // Simply capture what was in the file + // + // Capture file epsg if (!file_referenceframe.empty()) - // adopt the reference frame supplied in the file - referenceframe.SetDatumFromName(file_referenceframe, epoch_version); + fileEpsg = epsgStringFromName(file_referenceframe); + // capture file epoch + if (!epoch_version.empty()) + fileEpoch = epoch_version; } - // Since import doesn't offer an option to capture epoch on the command line, - // take the epoch from the file (if not empty). - if (!epoch_version.empty()) - referenceframe.SetEpoch(epoch_version); - break; case geo_data: From f47b6fc02dfad7629144013d840e97afe7326f1a Mon Sep 17 00:00:00 2001 From: rogerfraser Date: Tue, 7 May 2024 16:40:47 +1000 Subject: [PATCH 005/102] Add new MSVC versions --- dynadjust/include/config/dnaversion.hpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/dynadjust/include/config/dnaversion.hpp b/dynadjust/include/config/dnaversion.hpp index 4c3a8c48..da805126 100644 --- a/dynadjust/include/config/dnaversion.hpp +++ b/dynadjust/include/config/dnaversion.hpp @@ -308,6 +308,7 @@ const char* const __plot_dll_name__ = "libdnaplot.so"; #define __COMPILER__ "HP C++" #define __COMPILER_VERSION__ __HP_aCC #elif defined(_MSC_VER) +// https://learn.microsoft.com/en-us/cpp/overview/compiler-versions?view=msvc-170#version-macros #define __COMPILER__ "MSVC++" #if (_MSC_VER == 1100) #define __COMPILER_VERSION__ "5.0" @@ -375,8 +376,18 @@ const char* const __plot_dll_name__ = "libdnaplot.so"; #define __COMPILER_VERSION__ "17.4, VS2022" #elif (_MSC_VER == 1935) #define __COMPILER_VERSION__ "17.5, VS2022" - -#elif (_MSC_VER > 1935) +#elif (_MSC_VER == 1936) +#define __COMPILER_VERSION__ "17.6, VS2022" +#elif (_MSC_VER == 1937) +#define __COMPILER_VERSION__ "17.7, VS2022" +#elif (_MSC_VER == 1938) +#define __COMPILER_VERSION__ "17.8, VS2022" +#elif (_MSC_VER == 1939) +#define __COMPILER_VERSION__ "17.9, VS2022" +#elif (_MSC_VER == 1940) +#define __COMPILER_VERSION__ "17.10, VS2022" + +#elif (_MSC_VER > 1940) #define __COMPILER_VERSION__ _MSC_VER #endif #else From 8f27b6bb73e19fc07327fb69aaeb128251e47b40 Mon Sep 17 00:00:00 2001 From: rogerfraser Date: Tue, 7 May 2024 16:41:26 +1000 Subject: [PATCH 006/102] Improve monitoring of program execution --- .../dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp | 9 ++++++++- dynadjust/dynadjust/dnageoid/dnageoid.cpp | 1 + dynadjust/dynadjust/dnareftran/dnareftran.cpp | 2 ++ dynadjust/include/config/dnatypes.hpp | 6 ++++-- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp index 6750f5f7..ae16fed0 100644 --- a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp +++ b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp @@ -1063,7 +1063,14 @@ int main(int argc, char* argv[]) LoadBinaryMeta(bst_meta, bms_meta, p, bst_meta_import, bms_meta_import); // Capture datum set within project file - CDnaDatum datum(epsgStringFromName(p.r.reference_frame), p.r.epoch); + CDnaDatum datum; + + // Inspect if reftran has been executed. If so, select the appropriate + // reference frame label + if (bst_meta.reftran) + datum.SetDatumFromName(p.r.reference_frame, p.r.epoch); + else + datum.SetDatumFromName(p.i.reference_frame, bst_meta.epoch); if (vm.count(QUIET)) p.g.quiet = 1; diff --git a/dynadjust/dynadjust/dnageoid/dnageoid.cpp b/dynadjust/dynadjust/dnageoid/dnageoid.cpp index 910851a7..30c5a07d 100644 --- a/dynadjust/dynadjust/dnageoid/dnageoid.cpp +++ b/dynadjust/dynadjust/dnageoid/dnageoid.cpp @@ -727,6 +727,7 @@ void dna_geoid_interpolation::LoadBinaryStationFile(const string& bstnfileName) void dna_geoid_interpolation::WriteBinaryStationFile(const string& bstnfileName) { sprintf(bst_meta_.modifiedBy, "%s", __BINARY_NAME__); + bst_meta_.geoid = true; try { // write binary stations data. Throws runtime_error on failure. diff --git a/dynadjust/dynadjust/dnareftran/dnareftran.cpp b/dynadjust/dynadjust/dnareftran/dnareftran.cpp index 210dc014..86fb6809 100644 --- a/dynadjust/dynadjust/dnareftran/dnareftran.cpp +++ b/dynadjust/dynadjust/dnareftran/dnareftran.cpp @@ -582,6 +582,7 @@ void dna_reftran::WriteBinaryStationFile(const string& bstfileName) sprintf(bst_meta_.modifiedBy, "%s", __BINARY_NAME__); sprintf(bst_meta_.epsgCode, "%s", strEpsg.substr(0, STN_EPSG_WIDTH).c_str()); sprintf(bst_meta_.epoch, "%s", strEpoch.substr(0, STN_EPOCH_WIDTH).c_str()); + bst_meta_.reftran = true; try { // write binary stations data. Throws runtime_error on failure. @@ -615,6 +616,7 @@ void dna_reftran::WriteBinaryMeasurementFile(const string& bmsfileName) sprintf(bms_meta_.modifiedBy, "%s", __BINARY_NAME__); sprintf(bms_meta_.epsgCode, "%s", strEpsg.substr(0, STN_EPSG_WIDTH).c_str()); sprintf(bms_meta_.epoch, "%s", strEpoch.substr(0, STN_EPOCH_WIDTH).c_str()); + bms_meta_.reftran = true; try { // write binary measurement data. Throws runtime_error on failure. diff --git a/dynadjust/include/config/dnatypes.hpp b/dynadjust/include/config/dnatypes.hpp index 9599ed7a..4b602bc6 100644 --- a/dynadjust/include/config/dnatypes.hpp +++ b/dynadjust/include/config/dnatypes.hpp @@ -612,9 +612,9 @@ typedef struct input_file_meta { typedef struct binary_file_meta { binary_file_meta () - : binCount(0), reduced(false), inputFileCount(0), inputFileMeta(NULL) {} + : binCount(0), reduced(false), reftran(false), geoid(false), inputFileCount(0), inputFileMeta(NULL) {} binary_file_meta (const string& app_name) - : binCount(0), reduced(false), inputFileCount(0), inputFileMeta(NULL) { + : binCount(0), reduced(false), reftran(false), geoid(false), inputFileCount(0), inputFileMeta(NULL) { sprintf(modifiedBy, "%s", app_name.c_str()); } ~binary_file_meta() { @@ -626,6 +626,8 @@ typedef struct binary_file_meta { char modifiedBy[MOD_NAME_WIDTH+1]; // the program that modified this file char epsgCode[STN_EPSG_WIDTH+1]; // epsg ID, i.e. NNNNN (where NNNNN is in the range 0-32767). "Mixed" if stations are on different reference frames char epoch[STN_EPOCH_WIDTH+1]; // date, i.e. "DD.MM.YYYY" (10 chars) + bool reftran; // the data has been transformed to another frame and/or epoch + bool geoid; // geoid separation values have been obtained UINT16 inputFileCount; // Number of source file metadata elements input_file_meta_t* inputFileMeta; // Source file metadata } binary_file_meta_t; From 2b4e329b98288e95e31032716ff8dc30dcecdb7b Mon Sep 17 00:00:00 2001 From: rogerfraser Date: Wed, 8 May 2024 14:56:25 +1000 Subject: [PATCH 007/102] Change behaviour of reference frame option and improve reporting --- .../dnaimportwrapper/dnaimportwrapper.cpp | 16 +++++++--- .../dnareftranwrapper/dnareftranwrapper.cpp | 32 ++++++++++++++----- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index dcf73d09..dfdb2b4b 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -570,10 +570,14 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti // Separate output files (default) if (!p.g.quiet) { - cout << "+ Exporting stations and measurements to " << leafStr(p.i.xml_stnfile) << " and " << leafStr(p.i.xml_msrfile) << "... "; + cout << "+ Exporting stations and measurements to:" << endl << + " " << leafStr(p.i.xml_stnfile) << ", and" << endl << + " " << leafStr(p.i.xml_msrfile) << "... "; cout.flush(); } - *imp_file << "+ Exporting stations and measurements to " << leafStr(p.i.xml_stnfile) << " and " << leafStr(p.i.xml_msrfile) << "... "; + *imp_file << "+ Exporting stations and measurements to:" << endl << + " " << leafStr(p.i.xml_stnfile) << ", and " << endl << + " " << leafStr(p.i.xml_msrfile) << "... "; parserDynaML->SerialiseDynaMLSepfromMemory( vstationsTotal, vmeasurementsTotal, p.i.xml_stnfile, p.i.xml_msrfile, p, vinput_file_meta, (p.i.flag_unused_stn ? true : false)); @@ -592,10 +596,14 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti // Separate output files (default) if (!p.g.quiet) { - cout << "+ Exporting stations and measurements to " << leafStr(p.i.dna_stnfile) << " and " << leafStr(p.i.dna_msrfile) << "... "; + cout << "+ Exporting stations and measurements to:" << endl << + " " << leafStr(p.i.dna_stnfile) << ", and" << endl << + " " << leafStr(p.i.dna_msrfile) << "... "; cout.flush(); } - *imp_file << "+ Exporting stations and measurements to " << leafStr(p.i.dna_msrfile) << " and " << leafStr(p.i.dna_msrfile) << "... "; + *imp_file << "+ Exporting stations and measurements to:" << endl << + " " << leafStr(p.i.dna_stnfile) << ", and" << endl << + " " << leafStr(p.i.dna_msrfile) << "... "; parserDynaML->SerialiseDNA( vstationsTotal, vmeasurementsTotal, p.i.dna_stnfile, p.i.dna_msrfile, p, vinput_file_meta, (p.i.flag_unused_stn ? true : false)); diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index bb4714d6..f162d8a7 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -118,8 +118,18 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (!vm.count(REFERENCE_FRAME)) { - cout << endl << "- Nothing to do - reference frame was not supplied. " << endl << endl; - return EXIT_FAILURE; + //cout << endl << "- Nothing to do - reference frame was not supplied. " << endl << endl; + //return EXIT_FAILURE; + try + { + // Okay, no frame supplied, check the frame in the project settings. + // The following throws an exception if the frame is unknown + string epsg = epsgStringFromName(p.r.reference_frame); + } + catch (const runtime_error& e) { + cout << endl << "- Error: " << e.what() << endl; + return EXIT_FAILURE; + } } if (!vm.count(EPOCH)) @@ -682,9 +692,13 @@ int main(int argc, char* argv[]) // Separate output files (default) if (!p.g.quiet) { - cout << "+ Exporting stations and measurements to " << leafStr(p.i.xml_stnfile) << " and " << leafStr(p.i.xml_msrfile) << "... "; + cout << "+ Exporting stations and measurements to:" << endl << + " " << leafStr(p.i.xml_stnfile) << ", and" << endl << + " " << leafStr(p.i.xml_msrfile) << "... "; cout.flush(); - rft_file << "+ Exporting stations and measurements to " << leafStr(p.i.xml_stnfile) << " and " << leafStr(p.i.xml_msrfile) << "... "; + rft_file << "+ Exporting stations and measurements to:" << endl << + " " << leafStr(p.i.xml_stnfile) << ", and " << endl << + " " << leafStr(p.i.xml_msrfile) << "... "; } refTran.SerialiseDynaML( p.i.xml_stnfile, p.i.xml_msrfile, @@ -715,12 +729,14 @@ int main(int argc, char* argv[]) // Separate output files (default) if (!p.g.quiet) { - cout << "+ Exporting stations and measurements to " << - leafStr(p.i.dna_stnfile) << " and " << leafStr(p.i.dna_msrfile) << "... "; + cout << "+ Exporting stations and measurements to:" << endl << + " " << leafStr(p.i.dna_stnfile) << ", and" << endl << + " " << leafStr(p.i.dna_msrfile) << "... "; cout.flush(); } - rft_file << "+ Exporting stations and measurements to " << - leafStr(p.i.dna_stnfile) << " and " << leafStr(p.i.dna_msrfile) << "... "; + rft_file << "+ Exporting stations and measurements to:" << endl << + " " << leafStr(p.i.dna_stnfile) << ", and" << endl << + " " << leafStr(p.i.dna_msrfile) << "... "; refTran.SerialiseDNA( p.i.dna_stnfile, p.i.dna_msrfile, From f3bc1d93d1c40a00b322d67eab2d12277232b47b Mon Sep 17 00:00:00 2001 From: rogerfraser Date: Wed, 8 May 2024 16:17:17 +1000 Subject: [PATCH 008/102] Add a new pointer type definition --- dynadjust/include/measurement_types/dnastation.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/include/measurement_types/dnastation.hpp b/dynadjust/include/measurement_types/dnastation.hpp index 56e2aea0..8b025073 100644 --- a/dynadjust/include/measurement_types/dnastation.hpp +++ b/dynadjust/include/measurement_types/dnastation.hpp @@ -70,7 +70,7 @@ class CDnaStation; // station types typedef boost::shared_ptr dnaStnPtr; -typedef vector vdnaStnPtr; // vector of dnaStnPtr +typedef vector vdnaStnPtr, * pvdnaStnPtr; // vector of dnaStnPtr typedef vdnaStnPtr::iterator _it_vdnastnptr; typedef vdnaStnPtr::const_iterator _it_vdnastnptr_const; typedef pair<_it_vdnastnptr, _it_vdnastnptr> it_pair_dnastnptr; From fbf191fead7e78d729947aec49a9f859b0b8ee15 Mon Sep 17 00:00:00 2001 From: rogerfraser Date: Wed, 8 May 2024 16:18:14 +1000 Subject: [PATCH 009/102] Simplify logic implementation --- dynadjust/include/io/dnaiodna.cpp | 66 ++++++++++++------------------- 1 file changed, 26 insertions(+), 40 deletions(-) diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index 79f433c0..aad040ec 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -365,33 +365,30 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA { case stn_data: case msr_data: + + // 1. Capture file epsg + if (file_referenceframe.empty()) + // Empty? Get the epsg code from the default datum + fileEpsg = referenceframe.GetEpsgCode_s(); + else + fileEpsg = epsgStringFromName(file_referenceframe); - if (firstFile) + // capture file epoch + if (epoch_version.empty()) { - // Capture file epsg - if (file_referenceframe.empty()) - // Get the epsg code from the default datum - fileEpsg = referenceframe.GetEpsgCode_s(); - else - fileEpsg = epsgStringFromName(file_referenceframe); - - // capture file epoch - if (epoch_version.empty()) - { - // Get the epoch of the nominated epsg (whether default or from the file) - UINT32 u = LongFromString(fileEpsg); - fileEpoch = referenceepochFromEpsgCode(u); - } - else - fileEpoch = epoch_version; - - // Presently, the logic for handling default reference frame is duplicated for - // each file type, here and in dnaparser_pimpl.cxx: - // void referenceframe_pimpl::post_type(...) + // Empty? Get the epoch of the nominated epsg (whether default or from the file) + UINT32 u = LongFromString(fileEpsg); + fileEpoch = referenceepochFromEpsgCode(u); + } + else + fileEpoch = epoch_version; - // 2. Does the user want to override the default datum? + if (firstFile) + { + // 2. Does the user want to override the datum contained in the files with + // the default? if (override_input_frame) - // Do nothing, just return as referenceframe will become + // If so, do nothing, just return as referenceframe will become // the default for all stations and measurements loaded // from the file. break; @@ -401,25 +398,14 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA { if (!file_referenceframe.empty()) // adopt the reference frame supplied in the file - referenceframe.SetDatumFromName(file_referenceframe, epoch_version); + referenceframe.SetDatumFromEpsg(fileEpsg, fileEpoch); } - - // Since import doesn't offer an option to capture epoch on the command line, - // take the epoch from the file (if not empty). - referenceframe.SetEpoch(fileEpoch); - } - else - { - // Simply capture what was in the file - // - // Capture file epsg - if (!file_referenceframe.empty()) - fileEpsg = epsgStringFromName(file_referenceframe); - // capture file epoch - if (!epoch_version.empty()) - fileEpoch = epoch_version; + else + // Since import doesn't offer an option to capture epoch on the command line, + // take the epoch from the file (if not empty). + referenceframe.SetEpoch(fileEpoch); } - + break; case geo_data: From 5d197bce27a2195086eac9cb53c269ab3974f9a0 Mon Sep 17 00:00:00 2001 From: rogerfraser Date: Wed, 8 May 2024 16:19:33 +1000 Subject: [PATCH 010/102] Revert to file datum first, then project datum --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 12 ++++++++---- dynadjust/dynadjust/dnaimport/dnainterop.hpp | 3 ++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index 146864fb..a6f17d78 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -1116,7 +1116,7 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 dmw_ = dnaFile.dna_msr_widths(); try { - ParseDNAMSR(vMeasurements, msrCount, clusterID); + ParseDNAMSR(vMeasurements, msrCount, clusterID, fileEpsg, fileEpoch); m_idt = msr_data; } catch (const ios_base::failure& f) { @@ -1374,7 +1374,7 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount) } -void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT32 clusterID) +void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT32 clusterID, const string& fileEpsg, const string& fileEpoch) { string sBuf, tmp; @@ -1504,7 +1504,9 @@ void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT3 break; case 'G': // GPS Baseline (treat as single-baseline cluster) case 'X': // GPS Baseline cluster - msr_ptr.reset(new CDnaGpsBaselineCluster(++(*clusterID), datum_.GetName(), datum_.GetEpoch_s())); + //msr_ptr.reset(new CDnaGpsBaselineCluster(++(*clusterID), datum_.GetName(), datum_.GetEpoch_s())); + // Default to the fileEpsg and fileEpoch (see read_dna_header(..) in ParseDNA) + msr_ptr.reset(new CDnaGpsBaselineCluster(++(*clusterID), datumFromEpsgString(fileEpsg), fileEpoch)); ParseDNAMSRGPSBaselines(sBuf, msr_ptr, ignoreMsr); (*msrCount) += static_cast(msr_ptr->GetBaselines_ptr()->size() * 3); break; @@ -1575,7 +1577,9 @@ void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT3 (*msrCount) += 1; break; case 'Y': // GPS point cluster - msr_ptr.reset(new CDnaGpsPointCluster(++(*clusterID), datum_.GetName(), datum_.GetEpoch_s())); + //msr_ptr.reset(new CDnaGpsPointCluster(++(*clusterID), datum_.GetName(), datum_.GetEpoch_s())); + // Default to the fileEpsg and fileEpoch (see read_dna_header(..) in ParseDNA) + msr_ptr.reset(new CDnaGpsPointCluster(++(*clusterID), datumFromEpsgString(fileEpsg), fileEpoch)); ParseDNAMSRGPSPoints(sBuf, msr_ptr, ignoreMsr); (*msrCount) += static_cast(msr_ptr->GetPoints_ptr()->size() * 3); break; diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.hpp b/dynadjust/dynadjust/dnaimport/dnainterop.hpp index b4cbe5b9..ef87d3cb 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.hpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.hpp @@ -212,7 +212,8 @@ class dna_import { vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, string& fileEpsg, string& fileEpoch, bool firstFile); void ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount); - void ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT32 clusterID); + void ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT32 clusterID, + const string& fileEpsg, const string& fileEpoch); //void SetDefaultReferenceFrame(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements); From c8b175a0ef51a6aeb2d9cf2207d3dba88643f3a1 Mon Sep 17 00:00:00 2001 From: rogerfraser Date: Wed, 8 May 2024 17:15:25 +1000 Subject: [PATCH 011/102] Simplify logic implementation --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 59 +++++++++++-------- .../dynadjust/dnaimport/dnaparser_pimpl.cxx | 41 ++++++------- dynadjust/include/io/dnaiodna.cpp | 1 + 3 files changed, 51 insertions(+), 50 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index a6f17d78..996878a5 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -477,40 +477,47 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 try { - + // 1. Capture file epsg // Get the reference frame from the XML file (i.e. referenceframe attribute in DnaXmlFormat element) fileEpsg = DnaXmlFormat_p.FileEpsg(); + // Is this attribute value an empty string? As long as a default value + // is specified in DynaML.xsd, this value will never be empty, unless the user + // has inadvertently set in the xml file, e.g.: + // + if (fileEpsg.empty()) + // No, so get the epsg code from the default datum + fileEpsg = datum_.GetEpsgCode_s(); + fileEpoch = DnaXmlFormat_p.FileEpoch(); + // Is this attribute value an empty string? As long as a default value + // is specified in DynaML.xsd, this value will never be empty, unless the user + // has inadvertently set in the xml file, e.g.: + // + if (fileEpoch.empty()) + { + // Get the epoch of the nominated epsg (whether default or from the file) + UINT32 u = LongFromString(fileEpsg); + fileEpoch = referenceepochFromEpsgCode(u); + } + // Is this the first file? If so, set the project datum from the file's datum if (firstFile) { - if (fileEpsg.empty()) - // Get the epsg code from the default datum - fileEpsg = datum_.GetEpsgCode_s(); - - if (fileEpoch.empty()) + // 2. Does the user want to override the datum contained in the files with + // the default? + if (!projectSettings_.i.override_input_rfame) { - // Get the epoch of the nominated epsg (whether default or from the file) - UINT32 u = LongFromString(fileEpsg); - fileEpoch = referenceepochFromEpsgCode(u); + // 3. Does the user want the referenceframe attribute in the file to become the default? + if (!projectSettings_.i.user_supplied_frame) + { + // adopt the reference frame supplied in the file + datum_.SetDatumFromEpsg(fileEpsg, fileEpoch); + } + else + // Since import doesn't offer an option to capture epoch on the command line, + // take the epoch from the file (if not empty). + datum_.SetEpoch(fileEpoch); } - - if (!projectSettings_.i.override_input_rfame && !projectSettings_.i.user_supplied_frame) - datum_.SetDatumFromEpsg(fileEpsg, fileEpoch); - } - else - { - // Is this attribute value an empty string? As long as a default value - // is specified in DynaML.xsd, this value will never be empty, unless the user - // has inadvertently set in the xml file, e.g.: - // - if (fileEpsg.empty()) - // No, so get the epsg code from the default datum - fileEpsg = datum_.GetEpsgCode_s(); - - if (fileEpoch.empty()) - // No, so get the epoch from the default datum - fileEpoch = datum_.GetEpoch_s(); } } catch (...) diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index 233e1d17..cc42a331 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -1312,16 +1312,19 @@ void referenceframe_pimpl::pre() // In this case, post_string() will return "GDA2020" void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, bool userspecifiedreferenceframe, bool overridereferenceframe, bool firstFile) { + // 1. Get the DnaXmlFormat referenceframe attribute value from the file + _referenceframe = trimstr(post_string()); + if (_referenceframe.empty()) + // Set to the default reference frame passed from import + _referenceframe = referenceframe; + fileEpsg = epsgStringFromName(_referenceframe); if (firstFile) { - // 1. Get the DnaXmlFormat referenceframe attribute value from the file - _referenceframe = trimstr(post_string()); - fileEpsg = epsgStringFromName(_referenceframe); - - // 2. Does the user want to override the default datum? + // 2. Does the user want to override the datum contained in the files with + // the default? if (overridereferenceframe) - // Do nothing, just return as referenceframe will become + // If so, do nothing, just return as referenceframe will become // the default for all stations and measurements loaded // from the file. return; @@ -1339,18 +1342,8 @@ void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, b if (!_referenceframe.empty()) // Set the DynaML parser reference frame to the file's DnaXmlFormat referenceframe attribute referenceframe = _referenceframe; - else - // Set to the default reference frame passed from import - _referenceframe = referenceframe; } } - else - { - if (_referenceframe.empty()) - // Set to the default reference frame passed from import - _referenceframe = referenceframe; - fileEpsg = epsgStringFromName(trimstr(post_string())); - } } // epoch_pimpl @@ -1367,12 +1360,15 @@ void epoch_pimpl::pre() // In this case, post_string() will return "01.01.1994" void epoch_pimpl::post_type(string& epoch, string& fileEpoch, bool userspecifiedreferenceframe, bool overridereferenceframe, bool firstFile) { + // 1. Get the DnaXmlFormat epoch attribute value from the file + _epoch = trimstr(post_string()); + if (_epoch.empty()) + // Set to the default reference frame passed from import + _epoch = epoch; + fileEpoch = _epoch; + if (firstFile) { - // 1. Get the DnaXmlFormat epoch attribute value from the file - _epoch = trimstr(post_string()); - fileEpoch = _epoch; - // 2. Does the user want to override the default datum? if (overridereferenceframe) // Do nothing, just return as epoch will become @@ -1392,10 +1388,7 @@ void epoch_pimpl::post_type(string& epoch, string& fileEpoch, bool userspecified // if (!_epoch.empty()) // Set the DynaML parser epoch to the file's DnaXmlFormat epoch attribute - epoch = _epoch; - else - // Set to the default epoch passed from import - _epoch = epoch; + epoch = _epoch; } } else diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index aad040ec..4ccdeaf0 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -383,6 +383,7 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA else fileEpoch = epoch_version; + // Is this the first file? If so, set the project datum from the file's datum if (firstFile) { // 2. Does the user want to override the datum contained in the files with From eb4900faf2897adfbaf7f34d07861b914bcc5c5b Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 21 Aug 2024 15:52:07 +1000 Subject: [PATCH 012/102] Update GUI reporting --- .../dnaimportwrapper/dnaimportwrapper.cpp | 16 ++++++++-------- .../dnareftranwrapper/dnareftranwrapper.cpp | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index dfdb2b4b..dcc64f5b 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -571,13 +571,13 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti if (!p.g.quiet) { cout << "+ Exporting stations and measurements to:" << endl << - " " << leafStr(p.i.xml_stnfile) << ", and" << endl << - " " << leafStr(p.i.xml_msrfile) << "... "; + " - " << leafStr(p.i.xml_stnfile) << endl << + " - " << leafStr(p.i.xml_msrfile) << "... "; cout.flush(); } *imp_file << "+ Exporting stations and measurements to:" << endl << - " " << leafStr(p.i.xml_stnfile) << ", and " << endl << - " " << leafStr(p.i.xml_msrfile) << "... "; + " - " << leafStr(p.i.xml_stnfile) << endl << + " - " << leafStr(p.i.xml_msrfile) << "... "; parserDynaML->SerialiseDynaMLSepfromMemory( vstationsTotal, vmeasurementsTotal, p.i.xml_stnfile, p.i.xml_msrfile, p, vinput_file_meta, (p.i.flag_unused_stn ? true : false)); @@ -597,13 +597,13 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti if (!p.g.quiet) { cout << "+ Exporting stations and measurements to:" << endl << - " " << leafStr(p.i.dna_stnfile) << ", and" << endl << - " " << leafStr(p.i.dna_msrfile) << "... "; + " - " << leafStr(p.i.dna_stnfile) << endl << + " - " << leafStr(p.i.dna_msrfile) << "... "; cout.flush(); } *imp_file << "+ Exporting stations and measurements to:" << endl << - " " << leafStr(p.i.dna_stnfile) << ", and" << endl << - " " << leafStr(p.i.dna_msrfile) << "... "; + " - " << leafStr(p.i.dna_stnfile) << endl << + " - " << leafStr(p.i.dna_msrfile) << "... "; parserDynaML->SerialiseDNA( vstationsTotal, vmeasurementsTotal, p.i.dna_stnfile, p.i.dna_msrfile, p, vinput_file_meta, (p.i.flag_unused_stn ? true : false)); diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index f162d8a7..f0c6bb71 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -693,12 +693,12 @@ int main(int argc, char* argv[]) if (!p.g.quiet) { cout << "+ Exporting stations and measurements to:" << endl << - " " << leafStr(p.i.xml_stnfile) << ", and" << endl << - " " << leafStr(p.i.xml_msrfile) << "... "; + " - " << leafStr(p.i.xml_stnfile) << endl << + " - " << leafStr(p.i.xml_msrfile) << "... "; cout.flush(); rft_file << "+ Exporting stations and measurements to:" << endl << - " " << leafStr(p.i.xml_stnfile) << ", and " << endl << - " " << leafStr(p.i.xml_msrfile) << "... "; + " - " << leafStr(p.i.xml_stnfile) << endl << + " - " << leafStr(p.i.xml_msrfile) << "... "; } refTran.SerialiseDynaML( p.i.xml_stnfile, p.i.xml_msrfile, @@ -730,13 +730,13 @@ int main(int argc, char* argv[]) if (!p.g.quiet) { cout << "+ Exporting stations and measurements to:" << endl << - " " << leafStr(p.i.dna_stnfile) << ", and" << endl << - " " << leafStr(p.i.dna_msrfile) << "... "; + " - " << leafStr(p.i.dna_stnfile) << endl << + " - " << leafStr(p.i.dna_msrfile) << "... "; cout.flush(); } rft_file << "+ Exporting stations and measurements to:" << endl << - " " << leafStr(p.i.dna_stnfile) << ", and" << endl << - " " << leafStr(p.i.dna_msrfile) << "... "; + " - " << leafStr(p.i.dna_stnfile) << endl << + " - " << leafStr(p.i.dna_msrfile) << "... "; refTran.SerialiseDNA( p.i.dna_stnfile, p.i.dna_msrfile, From c12c691c2e7a3024eef2af4cb8e90c29a2164a41 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 21 Aug 2024 16:09:58 +1000 Subject: [PATCH 013/102] Enable datum override using first file --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 12 +++++++ .../dynadjust/dnaimport/dnaparser_pimpl.cxx | 31 ++++++++++++++----- dynadjust/include/config/dnaversion.hpp | 4 ++- dynadjust/include/io/dnaiodna.cpp | 3 +- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index 996878a5..35f01659 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -1069,6 +1069,18 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 import_file_mutex.unlock(); throw XMLInteropException(e.what(), 0); } + + if (projectSettings_.i.override_input_rfame && !projectSettings_.i.user_supplied_frame) + { + if (firstFile) + { + projectSettings_.i.reference_frame = datumFromEpsgString(fileEpsg); + projectSettings_.r.reference_frame = projectSettings_.i.reference_frame; + projectSettings_.r.epoch = fileEpoch; + m_strProjectDefaultEpoch = fileEpoch; + m_strProjectDefaultEpsg = fileEpsg; + } + } // Station file if (idt == stn_data || diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index cc42a331..87b2f38d 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -1324,10 +1324,17 @@ void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, b // 2. Does the user want to override the datum contained in the files with // the default? if (overridereferenceframe) - // If so, do nothing, just return as referenceframe will become - // the default for all stations and measurements loaded - // from the file. - return; + { + // Has a reference frame been supplied? + if (userspecifiedreferenceframe) + // If so, do nothing, just return as referenceframe will become + // the default for all stations and measurements loaded + // from the file. + return; + + if (!_referenceframe.empty()) + referenceframe = _referenceframe; + } // 3. Does the user want the referenceframe attribute in the file to become the default? if (!userspecifiedreferenceframe) @@ -1371,10 +1378,18 @@ void epoch_pimpl::post_type(string& epoch, string& fileEpoch, bool userspecified { // 2. Does the user want to override the default datum? if (overridereferenceframe) - // Do nothing, just return as epoch will become - // the default for all stations and measurements loaded - // from the file. - return; + { + // Has a reference frame been supplied? + if (userspecifiedreferenceframe) + // Do nothing, just return as epoch will become + // the default for all stations and measurements loaded + // from the file. + return; + + if (!_epoch.empty()) + // Set the DynaML parser epoch to the file's DnaXmlFormat epoch attribute + epoch = _epoch; + } // 3. Does the user want the epoch attribute in the file to become the default? if (!userspecifiedreferenceframe) diff --git a/dynadjust/include/config/dnaversion.hpp b/dynadjust/include/config/dnaversion.hpp index da805126..f45092b6 100644 --- a/dynadjust/include/config/dnaversion.hpp +++ b/dynadjust/include/config/dnaversion.hpp @@ -386,8 +386,10 @@ const char* const __plot_dll_name__ = "libdnaplot.so"; #define __COMPILER_VERSION__ "17.9, VS2022" #elif (_MSC_VER == 1940) #define __COMPILER_VERSION__ "17.10, VS2022" +#elif (_MSC_VER == 1941) +#define __COMPILER_VERSION__ "17.11, VS2022" -#elif (_MSC_VER > 1940) +#elif (_MSC_VER > 1941) #define __COMPILER_VERSION__ _MSC_VER #endif #else diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index 4ccdeaf0..3d84a5cf 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -392,7 +392,8 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA // If so, do nothing, just return as referenceframe will become // the default for all stations and measurements loaded // from the file. - break; + if (user_supplied_frame) + break; // 3. Does the user want the referenceframe attribute in the file to become the default? if (!user_supplied_frame) From 493b0a63ab77fbb0819a7a8cacb801ce0d2d4918 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:25:18 +1000 Subject: [PATCH 014/102] Fix N-stat sorting for X msrs --- .../include/functions/dnatemplatefuncs.hpp | 93 ++++++++++++++----- 1 file changed, 70 insertions(+), 23 deletions(-) diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index eeb63770..d0b65e71 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -828,23 +828,35 @@ class CompareMeasNstat_PairFirst if (isCompoundMeasAll(_m->at(lhs.first).measType) && notCompoundMeasAll(_m->at(rhs.first).measType)) { double lhsValue = 0.0; + U increment(0); + + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + switch (_m->at(lhs.first).measType) { case 'G': case 'X': - case 'Y': - //lhsValue = magnitude(_m->at(lhs.first).NStat, _m->at(lhs.first+1).NStat, _m->at(lhs.first+2).NStat); - lhsValue = max(fabs(_m->at(lhs.first).NStat), fabs(_m->at(lhs.first + 1).NStat)); - lhsValue = max(lhsValue, fabs(_m->at(lhs.first + 2).NStat)); + case 'Y': + lhsValue = fabs(_m->at(lhs.first + increment).NStat); // X + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment + 1).NStat) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).NStat); + if (fabs(_m->at(lhs.first + increment + 2).NStat) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).NStat); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } break; case 'D': //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); lhsValue = fabs(_m->at(lhs.first).NStat); - for (UINT32 d(1); d<_m->at(lhs.first).vectorCount1; ++d) + for (UINT32 d(1); d < vector_count; ++d) { //TRACE("%.9f\n", _m->at(lhs.first+d).term1); - if (fabs(_m->at(lhs.first+d).NStat) > lhsValue) - lhsValue = fabs( _m->at(lhs.first+d).NStat); + if (fabs(_m->at(lhs.first + d).NStat) > lhsValue) + lhsValue = fabs( _m->at(lhs.first + d).NStat); } break; } @@ -853,24 +865,36 @@ class CompareMeasNstat_PairFirst } else if (notCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { - double rhsValue = 0.0; + double rhsValue = 0.0; + U increment(0); + + UINT32 vector_count(_m->at(rhs.first).vectorCount1), covariance_count; + switch (_m->at(rhs.first).measType) { case 'G': case 'X': - case 'Y': - //rhsValue = magnitude(_m->at(rhs.first).NStat, _m->at(rhs.first+1).NStat, _m->at(rhs.first+2).NStat); - rhsValue = max(fabs(_m->at(rhs.first).NStat), fabs(_m->at(rhs.first + 1).NStat)); - rhsValue = max(rhsValue, fabs(_m->at(rhs.first + 2).NStat)); + case 'Y': + rhsValue = fabs(_m->at(rhs.first + increment).NStat); // X + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment + 1).NStat) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).NStat); + if (fabs(_m->at(rhs.first + increment + 2).NStat) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).NStat); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } break; case 'D': //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); rhsValue = fabs(_m->at(rhs.first).NStat); - for (UINT32 d(1); d<_m->at(rhs.first).vectorCount1; ++d) + for (UINT32 d(1); d < vector_count; ++d) { //TRACE("%.9f\n", _m->at(lhs.first+d).term1); - if (fabs(_m->at(rhs.first+d).NStat) > rhsValue) - rhsValue = fabs(_m->at(rhs.first+d).NStat); + if (fabs(_m->at(rhs.first + d).NStat) > rhsValue) + rhsValue = fabs(_m->at(rhs.first + d).NStat); } break; } @@ -880,19 +904,31 @@ class CompareMeasNstat_PairFirst else if (isCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { double lhsValue = 0.0; + U increment(0); + + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + switch (_m->at(lhs.first).measType) { case 'G': case 'X': case 'Y': - //lhsValue = magnitude(_m->at(lhs.first).NStat, _m->at(lhs.first+1).NStat, _m->at(lhs.first+2).NStat); - lhsValue = max(fabs(_m->at(lhs.first).NStat), fabs(_m->at(lhs.first + 1).NStat)); - lhsValue = max(lhsValue, fabs(_m->at(lhs.first + 2).NStat)); + lhsValue = fabs(_m->at(lhs.first + increment).NStat); // X + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment + 1).NStat) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).NStat); + if (fabs(_m->at(lhs.first + increment + 2).NStat) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).NStat); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } break; case 'D': //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); lhsValue = fabs(_m->at(lhs.first).NStat); - for (UINT32 d(1); d<_m->at(lhs.first).vectorCount1; ++d) + for (UINT32 d(1); d < vector_count; ++d) { //TRACE("%.9f\n", _m->at(lhs.first+d).term1); if (fabs(_m->at(lhs.first+d).NStat) > lhsValue) @@ -902,19 +938,30 @@ class CompareMeasNstat_PairFirst } double rhsValue = 0.0; + increment = 0; + vector_count = _m->at(rhs.first).vectorCount1; + switch (_m->at(rhs.first).measType) { case 'G': case 'X': case 'Y': - //rhsValue = magnitude(_m->at(rhs.first).NStat, _m->at(rhs.first+1).NStat, _m->at(rhs.first+2).NStat); - rhsValue = max(fabs(_m->at(rhs.first).NStat), fabs(_m->at(rhs.first + 1).NStat)); - rhsValue = max(rhsValue, fabs(_m->at(rhs.first + 2).NStat)); + rhsValue = fabs(_m->at(rhs.first + increment).NStat); // X + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment + 1).NStat) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).NStat); + if (fabs(_m->at(rhs.first + increment + 2).NStat) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).NStat); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } break; case 'D': //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); rhsValue = fabs(_m->at(rhs.first).NStat); - for (UINT32 d(1); d<_m->at(rhs.first).vectorCount1; ++d) + for (UINT32 d(1); d < vector_count; ++d) { //TRACE("%.9f\n", _m->at(lhs.first+d).term1); if (fabs(_m->at(rhs.first+d).NStat) > rhsValue) From 7e9ab9060b27cf9b83454ccd639f96cced49d0d7 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 23 Aug 2024 17:33:47 +1000 Subject: [PATCH 015/102] Reset X Nstat value --- .../include/functions/dnatemplatefuncs.hpp | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index d0b65e71..9b4cef53 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -828,22 +828,23 @@ class CompareMeasNstat_PairFirst if (isCompoundMeasAll(_m->at(lhs.first).measType) && notCompoundMeasAll(_m->at(rhs.first).measType)) { double lhsValue = 0.0; - U increment(0); - + U increment(0); UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + // Get the largest LHS value from the cluster switch (_m->at(lhs.first).measType) { case 'G': case 'X': case 'Y': - lhsValue = fabs(_m->at(lhs.first + increment).NStat); // X for (UINT32 g(0); g < vector_count; ++g) - { + { covariance_count = _m->at(lhs.first + increment).vectorCount2; - if (fabs(_m->at(lhs.first + increment + 1).NStat) > lhsValue) // Y + if (fabs(_m->at(lhs.first + increment).NStat) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).NStat); + if (fabs(_m->at(lhs.first + increment + 1).NStat) > lhsValue) // Y lhsValue = fabs(_m->at(lhs.first + increment + 1).NStat); - if (fabs(_m->at(lhs.first + increment + 2).NStat) > lhsValue) // Z + if (fabs(_m->at(lhs.first + increment + 2).NStat) > lhsValue) // Z lhsValue = fabs(_m->at(lhs.first + increment + 2).NStat); increment += 3; // move to covariances increment += (covariance_count * 3); // skip over covariances @@ -860,28 +861,29 @@ class CompareMeasNstat_PairFirst } break; } - + //TRACE("LHS: %.2f; RHS: %.2f\n", fabs(lhsValue), fabs(_m->at(rhs.first).NStat)); return fabs(lhsValue) > fabs(_m->at(rhs.first).NStat); } else if (notCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { double rhsValue = 0.0; - U increment(0); - + U increment(0); UINT32 vector_count(_m->at(rhs.first).vectorCount1), covariance_count; + // Get the largest RHS value from the cluster switch (_m->at(rhs.first).measType) { case 'G': case 'X': case 'Y': - rhsValue = fabs(_m->at(rhs.first + increment).NStat); // X for (UINT32 g(0); g < vector_count; ++g) { covariance_count = _m->at(rhs.first + increment).vectorCount2; - if (fabs(_m->at(rhs.first + increment + 1).NStat) > rhsValue) // Y + if (fabs(_m->at(rhs.first + increment).NStat) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).NStat); + if (fabs(_m->at(rhs.first + increment + 1).NStat) > rhsValue) // Y rhsValue = fabs(_m->at(rhs.first + increment + 1).NStat); - if (fabs(_m->at(rhs.first + increment + 2).NStat) > rhsValue) // Z + if (fabs(_m->at(rhs.first + increment + 2).NStat) > rhsValue) // Z rhsValue = fabs(_m->at(rhs.first + increment + 2).NStat); increment += 3; // move to covariances increment += (covariance_count * 3); // skip over covariances @@ -905,18 +907,19 @@ class CompareMeasNstat_PairFirst { double lhsValue = 0.0; U increment(0); - UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + // Get the largest LHS value from the cluster switch (_m->at(lhs.first).measType) { case 'G': case 'X': case 'Y': - lhsValue = fabs(_m->at(lhs.first + increment).NStat); // X for (UINT32 g(0); g < vector_count; ++g) { covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).NStat) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).NStat); if (fabs(_m->at(lhs.first + increment + 1).NStat) > lhsValue) // Y lhsValue = fabs(_m->at(lhs.first + increment + 1).NStat); if (fabs(_m->at(lhs.first + increment + 2).NStat) > lhsValue) // Z @@ -941,18 +944,20 @@ class CompareMeasNstat_PairFirst increment = 0; vector_count = _m->at(rhs.first).vectorCount1; + // Get the largest RHS value from the cluster switch (_m->at(rhs.first).measType) { case 'G': case 'X': - case 'Y': - rhsValue = fabs(_m->at(rhs.first + increment).NStat); // X + case 'Y': for (UINT32 g(0); g < vector_count; ++g) { covariance_count = _m->at(rhs.first + increment).vectorCount2; - if (fabs(_m->at(rhs.first + increment + 1).NStat) > rhsValue) // Y + if (fabs(_m->at(rhs.first + increment).NStat) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).NStat); + if (fabs(_m->at(rhs.first + increment + 1).NStat) > rhsValue) // Y rhsValue = fabs(_m->at(rhs.first + increment + 1).NStat); - if (fabs(_m->at(rhs.first + increment + 2).NStat) > rhsValue) // Z + if (fabs(_m->at(rhs.first + increment + 2).NStat) > rhsValue) // Z rhsValue = fabs(_m->at(rhs.first + increment + 2).NStat); increment += 3; // move to covariances increment += (covariance_count * 3); // skip over covariances From 8036ecd94aca59237b9f185348af7a1f2dc16e39 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:30:27 +1000 Subject: [PATCH 016/102] Fix adj output sorting on msr correction --- .../include/functions/dnatemplatefuncs.hpp | 314 ++++++++++++++++-- 1 file changed, 292 insertions(+), 22 deletions(-) diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index 9b4cef53..df91e02e 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -761,24 +761,159 @@ class CompareMeasResidual_PairFirst CompareMeasResidual_PairFirst(vector* m) : _m(m) {} bool operator()(const pair >& lhs, const pair >& rhs) { - if (isCompoundMeas(_m->at(lhs.first).measType) && notCompoundMeas(_m->at(rhs.first).measType)) + if (isCompoundMeasAll(_m->at(lhs.first).measType) && notCompoundMeasAll(_m->at(rhs.first).measType)) { - double lhsValue(magnitude(_m->at(lhs.first).measCorr, _m->at(lhs.first+1).measCorr, _m->at(lhs.first+2).measCorr)); - return lhsValue > _m->at(rhs.first).measCorr; + double lhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + + // Get the largest LHS value from the cluster + switch (_m->at(lhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).measCorr) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).measCorr); + if (fabs(_m->at(lhs.first + increment + 1).measCorr) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).measCorr); + if (fabs(_m->at(lhs.first + increment + 2).measCorr) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).measCorr); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); + lhsValue = fabs(_m->at(lhs.first).measCorr); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(lhs.first + d).measCorr) > lhsValue) + lhsValue = fabs(_m->at(lhs.first + d).measCorr); + } + break; + } + //TRACE("LHS: %.2f; RHS: %.2f\n", fabs(lhsValue), fabs(_m->at(rhs.first).measCorr)); + return fabs(lhsValue) > fabs(_m->at(rhs.first).measCorr); } - else if (notCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) + else if (notCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { - double rhsValue(magnitude(_m->at(rhs.first).measCorr, _m->at(rhs.first+1).measCorr, _m->at(rhs.first+2).measCorr)); - return _m->at(lhs.first).measCorr > rhsValue; + double rhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(rhs.first).vectorCount1), covariance_count; + + // Get the largest RHS value from the cluster + switch (_m->at(rhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment).measCorr) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).measCorr); + if (fabs(_m->at(rhs.first + increment + 1).measCorr) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).measCorr); + if (fabs(_m->at(rhs.first + increment + 2).measCorr) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).measCorr); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); + rhsValue = fabs(_m->at(rhs.first).measCorr); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(rhs.first + d).measCorr) > rhsValue) + rhsValue = fabs(_m->at(rhs.first + d).measCorr); + } + break; + } + + return fabs(_m->at(lhs.first).measCorr) > fabs(rhsValue); } - else if (isCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) + else if (isCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { - double lhsValue(magnitude(_m->at(lhs.first).measCorr, _m->at(lhs.first+1).measCorr, _m->at(lhs.first+2).measCorr)); - double rhsValue(magnitude(_m->at(rhs.first).measCorr, _m->at(rhs.first+1).measCorr, _m->at(rhs.first+2).measCorr)); - return lhsValue > rhsValue; + double lhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + + // Get the largest LHS value from the cluster + switch (_m->at(lhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).measCorr) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).measCorr); + if (fabs(_m->at(lhs.first + increment + 1).measCorr) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).measCorr); + if (fabs(_m->at(lhs.first + increment + 2).measCorr) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).measCorr); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); + lhsValue = fabs(_m->at(lhs.first).measCorr); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(lhs.first + d).measCorr) > lhsValue) + lhsValue = fabs(_m->at(lhs.first + d).measCorr); + } + break; + } + + double rhsValue = 0.0; + increment = 0; + vector_count = _m->at(rhs.first).vectorCount1; + + // Get the largest RHS value from the cluster + switch (_m->at(rhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment).measCorr) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).measCorr); + if (fabs(_m->at(rhs.first + increment + 1).measCorr) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).measCorr); + if (fabs(_m->at(rhs.first + increment + 2).measCorr) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).measCorr); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); + rhsValue = fabs(_m->at(rhs.first).measCorr); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(rhs.first + d).measCorr) > rhsValue) + rhsValue = fabs(_m->at(rhs.first + d).measCorr); + } + } + + return fabs(lhsValue) > fabs(rhsValue); } else - return _m->at(lhs.first).measCorr > _m->at(rhs.first).measCorr; + return fabs(_m->at(lhs.first).measCorr) > fabs(_m->at(rhs.first).measCorr); } private: vector* _m; @@ -793,24 +928,159 @@ class CompareMeasAdjSD_PairFirst CompareMeasAdjSD_PairFirst(vector* m) : _m(m) {} bool operator()(const pair >& lhs, const pair >& rhs) { - if (isCompoundMeas(_m->at(lhs.first).measType) && notCompoundMeas(_m->at(rhs.first).measType)) + if (isCompoundMeasAll(_m->at(lhs.first).measType) && notCompoundMeasAll(_m->at(rhs.first).measType)) { - double lhsValue(magnitude(_m->at(lhs.first).measAdjPrec, _m->at(lhs.first+1).measAdjPrec, _m->at(lhs.first+2).measAdjPrec)); - return lhsValue > _m->at(rhs.first).measAdjPrec; + double lhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + + // Get the largest LHS value from the cluster + switch (_m->at(lhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).measAdjPrec) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).measAdjPrec); + if (fabs(_m->at(lhs.first + increment + 1).measAdjPrec) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).measAdjPrec); + if (fabs(_m->at(lhs.first + increment + 2).measAdjPrec) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).measAdjPrec); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); + lhsValue = fabs(_m->at(lhs.first).measAdjPrec); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(lhs.first + d).measAdjPrec) > lhsValue) + lhsValue = fabs(_m->at(lhs.first + d).measAdjPrec); + } + break; + } + //TRACE("LHS: %.2f; RHS: %.2f\n", fabs(lhsValue), fabs(_m->at(rhs.first).measAdjPrec)); + return fabs(lhsValue) > fabs(_m->at(rhs.first).measAdjPrec); } - else if (notCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) + else if (notCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { - double rhsValue(magnitude(_m->at(rhs.first).measAdjPrec, _m->at(rhs.first+1).measAdjPrec, _m->at(rhs.first+2).measAdjPrec)); - return _m->at(lhs.first).measAdjPrec > rhsValue; + double rhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(rhs.first).vectorCount1), covariance_count; + + // Get the largest RHS value from the cluster + switch (_m->at(rhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment).measAdjPrec) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).measAdjPrec); + if (fabs(_m->at(rhs.first + increment + 1).measAdjPrec) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).measAdjPrec); + if (fabs(_m->at(rhs.first + increment + 2).measAdjPrec) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).measAdjPrec); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); + rhsValue = fabs(_m->at(rhs.first).measAdjPrec); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(rhs.first + d).measAdjPrec) > rhsValue) + rhsValue = fabs(_m->at(rhs.first + d).measAdjPrec); + } + break; + } + + return fabs(_m->at(lhs.first).measAdjPrec) > fabs(rhsValue); } - else if (isCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) + else if (isCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { - double lhsValue(magnitude(_m->at(lhs.first).measAdjPrec, _m->at(lhs.first+1).measAdjPrec, _m->at(lhs.first+2).measAdjPrec)); - double rhsValue(magnitude(_m->at(rhs.first).measAdjPrec, _m->at(rhs.first+1).measAdjPrec, _m->at(rhs.first+2).measAdjPrec)); - return lhsValue > rhsValue; + double lhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + + // Get the largest LHS value from the cluster + switch (_m->at(lhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).measAdjPrec) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).measAdjPrec); + if (fabs(_m->at(lhs.first + increment + 1).measAdjPrec) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).measAdjPrec); + if (fabs(_m->at(lhs.first + increment + 2).measAdjPrec) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).measAdjPrec); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); + lhsValue = fabs(_m->at(lhs.first).measAdjPrec); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(lhs.first + d).measAdjPrec) > lhsValue) + lhsValue = fabs(_m->at(lhs.first + d).measAdjPrec); + } + break; + } + + double rhsValue = 0.0; + increment = 0; + vector_count = _m->at(rhs.first).vectorCount1; + + // Get the largest RHS value from the cluster + switch (_m->at(rhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment).measAdjPrec) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).measAdjPrec); + if (fabs(_m->at(rhs.first + increment + 1).measAdjPrec) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).measAdjPrec); + if (fabs(_m->at(rhs.first + increment + 2).measAdjPrec) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).measAdjPrec); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); + rhsValue = fabs(_m->at(rhs.first).measAdjPrec); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(rhs.first + d).measAdjPrec) > rhsValue) + rhsValue = fabs(_m->at(rhs.first + d).measAdjPrec); + } + } + + return fabs(lhsValue) > fabs(rhsValue); } else - return _m->at(lhs.first).measAdjPrec > _m->at(rhs.first).measAdjPrec; + return fabs(_m->at(lhs.first).measAdjPrec) > fabs(_m->at(rhs.first).measAdjPrec); } private: vector* _m; From 1da9a25c3ffcd4eadca8d4f2cf528e941b65d105 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:08:56 +1000 Subject: [PATCH 017/102] Fix adj output sorting on msr correction --- .../include/functions/dnatemplatefuncs.hpp | 265 +++++++++++++++--- 1 file changed, 226 insertions(+), 39 deletions(-) diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index eeb63770..149fcd61 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -759,29 +759,164 @@ class CompareMeasResidual_PairFirst { public: CompareMeasResidual_PairFirst(vector* m) - : _m(m) {} + : _m(m) {} bool operator()(const pair >& lhs, const pair >& rhs) { - if (isCompoundMeas(_m->at(lhs.first).measType) && notCompoundMeas(_m->at(rhs.first).measType)) + if (isCompoundMeasAll(_m->at(lhs.first).measType) && notCompoundMeasAll(_m->at(rhs.first).measType)) { - double lhsValue(magnitude(_m->at(lhs.first).measCorr, _m->at(lhs.first+1).measCorr, _m->at(lhs.first+2).measCorr)); - return lhsValue > _m->at(rhs.first).measCorr; + double lhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + + // Get the largest LHS value from the cluster + switch (_m->at(lhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).measCorr) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).measCorr); + if (fabs(_m->at(lhs.first + increment + 1).measCorr) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).measCorr); + if (fabs(_m->at(lhs.first + increment + 2).measCorr) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).measCorr); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); + lhsValue = fabs(_m->at(lhs.first).measCorr); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(lhs.first + d).measCorr) > lhsValue) + lhsValue = fabs(_m->at(lhs.first + d).measCorr); + } + break; + } + //TRACE("LHS: %.2f; RHS: %.2f\n", fabs(lhsValue), fabs(_m->at(rhs.first).measCorr)); + return fabs(lhsValue) > fabs(_m->at(rhs.first).measCorr); } - else if (notCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) + else if (notCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { - double rhsValue(magnitude(_m->at(rhs.first).measCorr, _m->at(rhs.first+1).measCorr, _m->at(rhs.first+2).measCorr)); - return _m->at(lhs.first).measCorr > rhsValue; + double rhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(rhs.first).vectorCount1), covariance_count; + + // Get the largest RHS value from the cluster + switch (_m->at(rhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment).measCorr) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).measCorr); + if (fabs(_m->at(rhs.first + increment + 1).measCorr) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).measCorr); + if (fabs(_m->at(rhs.first + increment + 2).measCorr) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).measCorr); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); + rhsValue = fabs(_m->at(rhs.first).measCorr); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(rhs.first + d).measCorr) > rhsValue) + rhsValue = fabs(_m->at(rhs.first + d).measCorr); + } + break; + } + + return fabs(_m->at(lhs.first).measCorr) > fabs(rhsValue); } - else if (isCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) + else if (isCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { - double lhsValue(magnitude(_m->at(lhs.first).measCorr, _m->at(lhs.first+1).measCorr, _m->at(lhs.first+2).measCorr)); - double rhsValue(magnitude(_m->at(rhs.first).measCorr, _m->at(rhs.first+1).measCorr, _m->at(rhs.first+2).measCorr)); - return lhsValue > rhsValue; + double lhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + + // Get the largest LHS value from the cluster + switch (_m->at(lhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).measCorr) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).measCorr); + if (fabs(_m->at(lhs.first + increment + 1).measCorr) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).measCorr); + if (fabs(_m->at(lhs.first + increment + 2).measCorr) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).measCorr); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); + lhsValue = fabs(_m->at(lhs.first).measCorr); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(lhs.first + d).measCorr) > lhsValue) + lhsValue = fabs(_m->at(lhs.first + d).measCorr); + } + break; + } + + double rhsValue = 0.0; + increment = 0; + vector_count = _m->at(rhs.first).vectorCount1; + + // Get the largest RHS value from the cluster + switch (_m->at(rhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment).measCorr) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).measCorr); + if (fabs(_m->at(rhs.first + increment + 1).measCorr) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).measCorr); + if (fabs(_m->at(rhs.first + increment + 2).measCorr) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).measCorr); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); + rhsValue = fabs(_m->at(rhs.first).measCorr); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(rhs.first + d).measCorr) > rhsValue) + rhsValue = fabs(_m->at(rhs.first + d).measCorr); + } + } + + return fabs(lhsValue) > fabs(rhsValue); } else - return _m->at(lhs.first).measCorr > _m->at(rhs.first).measCorr; + return fabs(_m->at(lhs.first).measCorr) > fabs(_m->at(rhs.first).measCorr); } private: - vector* _m; + vector* _m; }; @@ -802,7 +937,7 @@ class CompareMeasAdjSD_PairFirst { double rhsValue(magnitude(_m->at(rhs.first).measAdjPrec, _m->at(rhs.first+1).measAdjPrec, _m->at(rhs.first+2).measAdjPrec)); return _m->at(lhs.first).measAdjPrec > rhsValue; - } + } else if (isCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) { double lhsValue(magnitude(_m->at(lhs.first).measAdjPrec, _m->at(lhs.first+1).measAdjPrec, _m->at(lhs.first+2).measAdjPrec)); @@ -828,49 +963,75 @@ class CompareMeasNstat_PairFirst if (isCompoundMeasAll(_m->at(lhs.first).measType) && notCompoundMeasAll(_m->at(rhs.first).measType)) { double lhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + + // Get the largest LHS value from the cluster switch (_m->at(lhs.first).measType) { case 'G': case 'X': - case 'Y': - //lhsValue = magnitude(_m->at(lhs.first).NStat, _m->at(lhs.first+1).NStat, _m->at(lhs.first+2).NStat); - lhsValue = max(fabs(_m->at(lhs.first).NStat), fabs(_m->at(lhs.first + 1).NStat)); - lhsValue = max(lhsValue, fabs(_m->at(lhs.first + 2).NStat)); + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).NStat) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).NStat); + if (fabs(_m->at(lhs.first + increment + 1).NStat) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).NStat); + if (fabs(_m->at(lhs.first + increment + 2).NStat) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).NStat); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } break; case 'D': //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); lhsValue = fabs(_m->at(lhs.first).NStat); - for (UINT32 d(1); d<_m->at(lhs.first).vectorCount1; ++d) + for (UINT32 d(1); d < vector_count; ++d) { //TRACE("%.9f\n", _m->at(lhs.first+d).term1); - if (fabs(_m->at(lhs.first+d).NStat) > lhsValue) - lhsValue = fabs( _m->at(lhs.first+d).NStat); + if (fabs(_m->at(lhs.first + d).NStat) > lhsValue) + lhsValue = fabs( _m->at(lhs.first + d).NStat); } break; } - + //TRACE("LHS: %.2f; RHS: %.2f\n", fabs(lhsValue), fabs(_m->at(rhs.first).NStat)); return fabs(lhsValue) > fabs(_m->at(rhs.first).NStat); } else if (notCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { - double rhsValue = 0.0; + double rhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(rhs.first).vectorCount1), covariance_count; + + // Get the largest RHS value from the cluster switch (_m->at(rhs.first).measType) { case 'G': case 'X': - case 'Y': - //rhsValue = magnitude(_m->at(rhs.first).NStat, _m->at(rhs.first+1).NStat, _m->at(rhs.first+2).NStat); - rhsValue = max(fabs(_m->at(rhs.first).NStat), fabs(_m->at(rhs.first + 1).NStat)); - rhsValue = max(rhsValue, fabs(_m->at(rhs.first + 2).NStat)); + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment).NStat) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).NStat); + if (fabs(_m->at(rhs.first + increment + 1).NStat) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).NStat); + if (fabs(_m->at(rhs.first + increment + 2).NStat) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).NStat); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } break; case 'D': //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); rhsValue = fabs(_m->at(rhs.first).NStat); - for (UINT32 d(1); d<_m->at(rhs.first).vectorCount1; ++d) + for (UINT32 d(1); d < vector_count; ++d) { //TRACE("%.9f\n", _m->at(lhs.first+d).term1); - if (fabs(_m->at(rhs.first+d).NStat) > rhsValue) - rhsValue = fabs(_m->at(rhs.first+d).NStat); + if (fabs(_m->at(rhs.first + d).NStat) > rhsValue) + rhsValue = fabs(_m->at(rhs.first + d).NStat); } break; } @@ -880,19 +1041,32 @@ class CompareMeasNstat_PairFirst else if (isCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { double lhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + + // Get the largest LHS value from the cluster switch (_m->at(lhs.first).measType) { case 'G': case 'X': case 'Y': - //lhsValue = magnitude(_m->at(lhs.first).NStat, _m->at(lhs.first+1).NStat, _m->at(lhs.first+2).NStat); - lhsValue = max(fabs(_m->at(lhs.first).NStat), fabs(_m->at(lhs.first + 1).NStat)); - lhsValue = max(lhsValue, fabs(_m->at(lhs.first + 2).NStat)); + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).NStat) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).NStat); + if (fabs(_m->at(lhs.first + increment + 1).NStat) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).NStat); + if (fabs(_m->at(lhs.first + increment + 2).NStat) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).NStat); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } break; case 'D': //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); lhsValue = fabs(_m->at(lhs.first).NStat); - for (UINT32 d(1); d<_m->at(lhs.first).vectorCount1; ++d) + for (UINT32 d(1); d < vector_count; ++d) { //TRACE("%.9f\n", _m->at(lhs.first+d).term1); if (fabs(_m->at(lhs.first+d).NStat) > lhsValue) @@ -902,19 +1076,32 @@ class CompareMeasNstat_PairFirst } double rhsValue = 0.0; + increment = 0; + vector_count = _m->at(rhs.first).vectorCount1; + + // Get the largest RHS value from the cluster switch (_m->at(rhs.first).measType) { case 'G': case 'X': - case 'Y': - //rhsValue = magnitude(_m->at(rhs.first).NStat, _m->at(rhs.first+1).NStat, _m->at(rhs.first+2).NStat); - rhsValue = max(fabs(_m->at(rhs.first).NStat), fabs(_m->at(rhs.first + 1).NStat)); - rhsValue = max(rhsValue, fabs(_m->at(rhs.first + 2).NStat)); + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment).NStat) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).NStat); + if (fabs(_m->at(rhs.first + increment + 1).NStat) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).NStat); + if (fabs(_m->at(rhs.first + increment + 2).NStat) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).NStat); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } break; case 'D': //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); rhsValue = fabs(_m->at(rhs.first).NStat); - for (UINT32 d(1); d<_m->at(rhs.first).vectorCount1; ++d) + for (UINT32 d(1); d < vector_count; ++d) { //TRACE("%.9f\n", _m->at(lhs.first+d).term1); if (fabs(_m->at(rhs.first+d).NStat) > rhsValue) From 480498c81993b94bfeab16e6d8ea48af470a54bc Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:26:55 +1000 Subject: [PATCH 018/102] Fix adj output sorting on msr adj sd --- .../include/functions/dnatemplatefuncs.hpp | 161 ++++++++++++++++-- 1 file changed, 148 insertions(+), 13 deletions(-) diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index f39240a1..1b0dd4ed 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -926,29 +926,164 @@ class CompareMeasAdjSD_PairFirst { public: CompareMeasAdjSD_PairFirst(vector* m) - : _m(m) {} + : _m(m) {} bool operator()(const pair >& lhs, const pair >& rhs) { - if (isCompoundMeas(_m->at(lhs.first).measType) && notCompoundMeas(_m->at(rhs.first).measType)) + if (isCompoundMeasAll(_m->at(lhs.first).measType) && notCompoundMeasAll(_m->at(rhs.first).measType)) { - double lhsValue(magnitude(_m->at(lhs.first).measAdjPrec, _m->at(lhs.first+1).measAdjPrec, _m->at(lhs.first+2).measAdjPrec)); - return lhsValue > _m->at(rhs.first).measAdjPrec; + double lhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + + // Get the largest LHS value from the cluster + switch (_m->at(lhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).measAdjPrec) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).measAdjPrec); + if (fabs(_m->at(lhs.first + increment + 1).measAdjPrec) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).measAdjPrec); + if (fabs(_m->at(lhs.first + increment + 2).measAdjPrec) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).measAdjPrec); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); + lhsValue = fabs(_m->at(lhs.first).measAdjPrec); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(lhs.first + d).measAdjPrec) > lhsValue) + lhsValue = fabs(_m->at(lhs.first + d).measAdjPrec); + } + break; + } + //TRACE("LHS: %.2f; RHS: %.2f\n", fabs(lhsValue), fabs(_m->at(rhs.first).measAdjPrec)); + return fabs(lhsValue) > fabs(_m->at(rhs.first).measAdjPrec); } - else if (notCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) + else if (notCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { - double rhsValue(magnitude(_m->at(rhs.first).measAdjPrec, _m->at(rhs.first+1).measAdjPrec, _m->at(rhs.first+2).measAdjPrec)); - return _m->at(lhs.first).measAdjPrec > rhsValue; + double rhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(rhs.first).vectorCount1), covariance_count; + + // Get the largest RHS value from the cluster + switch (_m->at(rhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment).measAdjPrec) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).measAdjPrec); + if (fabs(_m->at(rhs.first + increment + 1).measAdjPrec) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).measAdjPrec); + if (fabs(_m->at(rhs.first + increment + 2).measAdjPrec) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).measAdjPrec); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); + rhsValue = fabs(_m->at(rhs.first).measAdjPrec); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(rhs.first + d).measAdjPrec) > rhsValue) + rhsValue = fabs(_m->at(rhs.first + d).measAdjPrec); + } + break; + } + + return fabs(_m->at(lhs.first).measAdjPrec) > fabs(rhsValue); } - else if (isCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) + else if (isCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { - double lhsValue(magnitude(_m->at(lhs.first).measAdjPrec, _m->at(lhs.first+1).measAdjPrec, _m->at(lhs.first+2).measAdjPrec)); - double rhsValue(magnitude(_m->at(rhs.first).measAdjPrec, _m->at(rhs.first+1).measAdjPrec, _m->at(rhs.first+2).measAdjPrec)); - return lhsValue > rhsValue; + double lhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + + // Get the largest LHS value from the cluster + switch (_m->at(lhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).measAdjPrec) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).measAdjPrec); + if (fabs(_m->at(lhs.first + increment + 1).measAdjPrec) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).measAdjPrec); + if (fabs(_m->at(lhs.first + increment + 2).measAdjPrec) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).measAdjPrec); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); + lhsValue = fabs(_m->at(lhs.first).measAdjPrec); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(lhs.first + d).measAdjPrec) > lhsValue) + lhsValue = fabs(_m->at(lhs.first + d).measAdjPrec); + } + break; + } + + double rhsValue = 0.0; + increment = 0; + vector_count = _m->at(rhs.first).vectorCount1; + + // Get the largest RHS value from the cluster + switch (_m->at(rhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment).measAdjPrec) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).measAdjPrec); + if (fabs(_m->at(rhs.first + increment + 1).measAdjPrec) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).measAdjPrec); + if (fabs(_m->at(rhs.first + increment + 2).measAdjPrec) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).measAdjPrec); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); + rhsValue = fabs(_m->at(rhs.first).measAdjPrec); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(rhs.first + d).measAdjPrec) > rhsValue) + rhsValue = fabs(_m->at(rhs.first + d).measAdjPrec); + } + } + + return fabs(lhsValue) > fabs(rhsValue); } else - return _m->at(lhs.first).measAdjPrec > _m->at(rhs.first).measAdjPrec; + return fabs(_m->at(lhs.first).measAdjPrec) > fabs(_m->at(rhs.first).measAdjPrec); } private: - vector* _m; + vector* _m; }; From d34f4beec9ad2af532af762849c170028ef7f2bb Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:55:45 +1000 Subject: [PATCH 019/102] Fix adj output sorting on msr value --- .../include/functions/dnatemplatefuncs.hpp | 157 ++++++++++++++++-- 1 file changed, 146 insertions(+), 11 deletions(-) diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index 1b0dd4ed..330f1dd8 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -729,24 +729,159 @@ class CompareMeasValue_PairFirst CompareMeasValue_PairFirst(vector* m) : _m(m) {} bool operator()(const pair >& lhs, const pair >& rhs) { - if (isCompoundMeas(_m->at(lhs.first).measType) && notCompoundMeas(_m->at(rhs.first).measType)) + if (isCompoundMeasAll(_m->at(lhs.first).measType) && notCompoundMeasAll(_m->at(rhs.first).measType)) { - double lhsValue(magnitude(_m->at(lhs.first).term1, _m->at(lhs.first+1).term1, _m->at(lhs.first+2).term1)); - return lhsValue > _m->at(rhs.first).term1; + double lhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + + // Get the largest LHS value from the cluster + switch (_m->at(lhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).term1) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).term1); + if (fabs(_m->at(lhs.first + increment + 1).term1) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).term1); + if (fabs(_m->at(lhs.first + increment + 2).term1) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).term1); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); + lhsValue = fabs(_m->at(lhs.first).term1); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(lhs.first + d).term1) > lhsValue) + lhsValue = fabs(_m->at(lhs.first + d).term1); + } + break; + } + //TRACE("LHS: %.2f; RHS: %.2f\n", fabs(lhsValue), fabs(_m->at(rhs.first).term1)); + return fabs(lhsValue) > fabs(_m->at(rhs.first).term1); } - else if (notCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) + else if (notCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { - double rhsValue(magnitude(_m->at(rhs.first).term1, _m->at(rhs.first+1).term1, _m->at(rhs.first+2).term1)); - return _m->at(lhs.first).term1 > rhsValue; + double rhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(rhs.first).vectorCount1), covariance_count; + + // Get the largest RHS value from the cluster + switch (_m->at(rhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment).term1) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).term1); + if (fabs(_m->at(rhs.first + increment + 1).term1) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).term1); + if (fabs(_m->at(rhs.first + increment + 2).term1) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).term1); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); + rhsValue = fabs(_m->at(rhs.first).term1); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(rhs.first + d).term1) > rhsValue) + rhsValue = fabs(_m->at(rhs.first + d).term1); + } + break; + } + + return fabs(_m->at(lhs.first).term1) > fabs(rhsValue); } - else if (isCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) + else if (isCompoundMeasAll(_m->at(lhs.first).measType) && isCompoundMeasAll(_m->at(rhs.first).measType)) { - double lhsValue(magnitude(_m->at(lhs.first).term1, _m->at(lhs.first+1).term1, _m->at(lhs.first+2).term1)); - double rhsValue(magnitude(_m->at(rhs.first).term1, _m->at(rhs.first+1).term1, _m->at(rhs.first+2).term1)); - return lhsValue > rhsValue; + double lhsValue = 0.0; + U increment(0); + UINT32 vector_count(_m->at(lhs.first).vectorCount1), covariance_count; + + // Get the largest LHS value from the cluster + switch (_m->at(lhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(lhs.first + increment).vectorCount2; + if (fabs(_m->at(lhs.first + increment).term1) > lhsValue) // X + lhsValue = fabs(_m->at(lhs.first + increment).term1); + if (fabs(_m->at(lhs.first + increment + 1).term1) > lhsValue) // Y + lhsValue = fabs(_m->at(lhs.first + increment + 1).term1); + if (fabs(_m->at(lhs.first + increment + 2).term1) > lhsValue) // Z + lhsValue = fabs(_m->at(lhs.first + increment + 2).term1); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(lhs.first).term1)); + lhsValue = fabs(_m->at(lhs.first).term1); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(lhs.first + d).term1) > lhsValue) + lhsValue = fabs(_m->at(lhs.first + d).term1); + } + break; + } + + double rhsValue = 0.0; + increment = 0; + vector_count = _m->at(rhs.first).vectorCount1; + + // Get the largest RHS value from the cluster + switch (_m->at(rhs.first).measType) + { + case 'G': + case 'X': + case 'Y': + for (UINT32 g(0); g < vector_count; ++g) + { + covariance_count = _m->at(rhs.first + increment).vectorCount2; + if (fabs(_m->at(rhs.first + increment).term1) > rhsValue) // X + rhsValue = fabs(_m->at(rhs.first + increment).term1); + if (fabs(_m->at(rhs.first + increment + 1).term1) > rhsValue) // Y + rhsValue = fabs(_m->at(rhs.first + increment + 1).term1); + if (fabs(_m->at(rhs.first + increment + 2).term1) > rhsValue) // Z + rhsValue = fabs(_m->at(rhs.first + increment + 2).term1); + increment += 3; // move to covariances + increment += (covariance_count * 3); // skip over covariances + } + break; + case 'D': + //TRACE("%.9f\n", radians_to_degrees_(_m->at(rhs.first).term1)); + rhsValue = fabs(_m->at(rhs.first).term1); + for (UINT32 d(1); d < vector_count; ++d) + { + //TRACE("%.9f\n", _m->at(lhs.first+d).term1); + if (fabs(_m->at(rhs.first + d).term1) > rhsValue) + rhsValue = fabs(_m->at(rhs.first + d).term1); + } + } + + return fabs(lhsValue) > fabs(rhsValue); } else - return _m->at(lhs.first).term1 > _m->at(rhs.first).term1; + return fabs(_m->at(lhs.first).term1) > fabs(_m->at(rhs.first).term1); } private: vector* _m; From cbbb9fddb127e072ec33aed2a37b027f28709b45 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 27 Aug 2024 13:19:50 +1000 Subject: [PATCH 020/102] Remove unnecessary option to sort adj msr by outlier (use n-stat instead) --- dynadjust/dynadjust/dnaadjust/dnaadjust.cpp | 19 ++--------- dynadjust/dynadjust/dnaadjust/dnaadjust.hpp | 1 - .../dnaadjustwrapper/dnaadjustwrapper.cpp | 3 +- dynadjust/include/config/dnatypes-gui.hpp | 3 +- .../include/functions/dnatemplatefuncs.hpp | 33 ------------------- 5 files changed, 5 insertions(+), 54 deletions(-) diff --git a/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp b/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp index c47f68a9..73b0707c 100644 --- a/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp +++ b/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp @@ -12304,9 +12304,6 @@ void dna_adjust::PrintAdjMeasurements(v_uint32_u32u32_pair msr_block, bool print // Should the adjusted measurements be sorted? switch (projectSettings_.o._sort_adj_msr) { - case orig_adj_msr_sort_ui: - sort(msr_block.begin(), msr_block.end()); - break; case type_adj_msr_sort_ui: SortMeasurementsbyType(msr_block); break; @@ -12328,8 +12325,9 @@ void dna_adjust::PrintAdjMeasurements(v_uint32_u32u32_pair msr_block, bool print case n_st_adj_msr_sort_ui: SortMeasurementsbyNstat(msr_block); break; - case outl_adj_msr_sort_ui: - SortMeasurementsbyOutlier(msr_block); + case orig_adj_msr_sort_ui: + default: + sort(msr_block.begin(), msr_block.end()); break; } } @@ -12363,9 +12361,6 @@ void dna_adjust::PrintAdjMeasurements(v_uint32_u32u32_pair msr_block, bool print case n_st_adj_msr_sort_ui: ss << "measurement n-statistic"; break; - case outl_adj_msr_sort_ui: - ss << "measurement outlier"; - break; } @@ -14937,14 +14932,6 @@ void dna_adjust::SortMeasurementsbyNstat(v_uint32_u32u32_pair& msr_block) } -void dna_adjust::SortMeasurementsbyOutlier(v_uint32_u32u32_pair& msr_block) -{ - if (msr_block.size() < 2) - return; - CompareMeasOutlier_PairFirst measoutlierCompareFunc(&bmsBinaryRecords_, criticalValue_); - sort(msr_block.begin(), msr_block.end(), measoutlierCompareFunc); -} - } // namespace networkadjust } // namespace dynadjust diff --git a/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp b/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp index 4c6c3034..930bd0b5 100644 --- a/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp +++ b/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp @@ -480,7 +480,6 @@ class dna_adjust { void SortMeasurementsbyResidual(v_uint32_u32u32_pair& msr_block); void SortMeasurementsbyAdjSD(v_uint32_u32u32_pair& msr_block); void SortMeasurementsbyNstat(v_uint32_u32u32_pair& msr_block); - void SortMeasurementsbyOutlier(v_uint32_u32u32_pair& msr_block); // Adjustment station sorting void SortStationsbyFileOrder(vUINT32& v_blockStations); diff --git a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp index ae16fed0..66965890 100644 --- a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp +++ b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp @@ -871,8 +871,7 @@ int main(int argc, char* argv[]) StringFromT(meas_adj_msr_sort_ui) + ": Measurement value\n " + StringFromT(corr_adj_msr_sort_ui) + ": Correction\n " + StringFromT(a_sd_adj_msr_sort_ui) + ": Adjusted std. dev.\n " + - StringFromT(n_st_adj_msr_sort_ui) + ": N-statistic\n " + - StringFromT(outl_adj_msr_sort_ui) + ": Suspected outlier").c_str()) + StringFromT(n_st_adj_msr_sort_ui) + ": N-statistic").c_str()) (OUTPUT_ADJ_STN_BLOCKS, "For phased adjustments, output adjusted coordinates according to each block.") (OUTPUT_ADJ_MSR_BLOCKS, diff --git a/dynadjust/include/config/dnatypes-gui.hpp b/dynadjust/include/config/dnatypes-gui.hpp index 5819b05c..392d2059 100644 --- a/dynadjust/include/config/dnatypes-gui.hpp +++ b/dynadjust/include/config/dnatypes-gui.hpp @@ -53,8 +53,7 @@ typedef enum ADJ_MSR_SORT_UI meas_adj_msr_sort_ui = 4, corr_adj_msr_sort_ui = 5, a_sd_adj_msr_sort_ui = 6, - n_st_adj_msr_sort_ui = 7, - outl_adj_msr_sort_ui = 8 + n_st_adj_msr_sort_ui = 7 } _ADJ_MSR_SORT_UI_; typedef enum MSR_TO_STN_SORT_UI diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index 330f1dd8..bfda3567 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -1389,39 +1389,6 @@ class CompareMeasNstat_PairFirst }; -// M = measurement_t, U = UINT32, T = double -template -class CompareMeasOutlier_PairFirst -{ -public: - CompareMeasOutlier_PairFirst(vector* m, const T t) - : _m(m), _t(t) {} - bool operator()(const pair >& lhs, const pair >& rhs) { - if (isCompoundMeas(_m->at(lhs.first).measType) && notCompoundMeas(_m->at(rhs.first).measType)) - { - bool lhs_pass((fabs(_m->at(lhs.first).NStat) < _t) || (fabs(_m->at(lhs.first+1).NStat) < _t) || (fabs(_m->at(lhs.first+2).NStat) < _t)); - return (lhs_pass < (fabs(_m->at(rhs.first).NStat) < _t)); - } - else if (notCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) - { - bool rhs_pass((fabs(_m->at(rhs.first).NStat) < _t) || (fabs(_m->at(rhs.first+1).NStat) < _t) || (fabs(_m->at(rhs.first+2).NStat) < _t)); - return ((fabs(_m->at(lhs.first).NStat) < _t) < rhs_pass); - } - else if (isCompoundMeas(_m->at(lhs.first).measType) && isCompoundMeas(_m->at(rhs.first).measType)) - { - bool lhs_pass((fabs(_m->at(lhs.first).NStat) < _t) || (fabs(_m->at(lhs.first+1).NStat) < _t) || (fabs(_m->at(lhs.first+2).NStat) < _t)); - bool rhs_pass((fabs(_m->at(rhs.first).NStat) < _t) || (fabs(_m->at(rhs.first+1).NStat) < _t) || (fabs(_m->at(rhs.first+2).NStat) < _t)); - return lhs_pass < rhs_pass; - } - else - return ((fabs(_m->at(lhs.first).NStat) < _t) < (fabs(_m->at(rhs.first).NStat) < _t)); - } -private: - vector* _m; - T _t; -}; - - // S = station_t, U = UINT32 template class CompareStnFileOrder From 7c7dfae4098025726762297fb9922dd553e4de96 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 27 Aug 2024 14:58:46 +1000 Subject: [PATCH 021/102] Make reference-frame argument optional --- .../dnareftranwrapper/dnareftranwrapper.cpp | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index f0c6bb71..c43e28ab 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -118,18 +118,18 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (!vm.count(REFERENCE_FRAME)) { - //cout << endl << "- Nothing to do - reference frame was not supplied. " << endl << endl; + //cout << endl << "- Reference frame was not supplied. Using project default (" << p.r.reference_frame << ")" << endl << endl; //return EXIT_FAILURE; - try - { - // Okay, no frame supplied, check the frame in the project settings. - // The following throws an exception if the frame is unknown - string epsg = epsgStringFromName(p.r.reference_frame); - } - catch (const runtime_error& e) { - cout << endl << "- Error: " << e.what() << endl; - return EXIT_FAILURE; - } + //try + //{ + // // Okay, no frame supplied, check the frame in the project settings. + // // The following throws an exception if the frame is unknown + // string epsg = epsgStringFromName(p.r.reference_frame); + //} + //catch (const runtime_error& e) { + // cout << endl << "- Error: " << e.what() << endl; + // return EXIT_FAILURE; + //} } if (!vm.count(EPOCH)) @@ -439,7 +439,11 @@ int main(int argc, char* argv[]) cout << setw(PRINT_VAR_PAD) << left << " Output folder: " << p.g.output_folder << endl; cout << setw(PRINT_VAR_PAD) << left << " Binary station file: " << p.r.bst_file << endl; cout << setw(PRINT_VAR_PAD) << left << " Binary measurement file: " << p.r.bms_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Target reference frame: " << p.r.reference_frame << endl; + cout << setw(PRINT_VAR_PAD) << left << " Target reference frame: " << p.r.reference_frame; + if (vm.count(REFERENCE_FRAME)) + cout << " (user supplied)" << endl; + else + cout << " (project default)" << endl; // try to parse user supplied string. If this fails, then there's not much point in attempting // to transform stations and measurements From c565a7898738881653d9cd5aca89f9ab1d6c9747 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 30 Aug 2024 17:19:06 +1000 Subject: [PATCH 022/102] Prevent create-stage-files option in report results mode --- .../dnaadjustwrapper/dnaadjustwrapper.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp index 66965890..a3504326 100644 --- a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp +++ b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp @@ -1244,7 +1244,22 @@ int main(int argc, char* argv[]) cout << endl; if (p.a.report_mode) + { cout << "+ Report last adjustment results" << endl; + + // Has report mode been requested as well as an argument to recreate stage files? + // If so, return an error message and exit as this will lead to reporting of + // incorrect (zero!) results + if (p.a.recreate_stage_files) + { + cout << endl << + "- Error: The option --" << RECREATE_STAGE_FILES << " cannot be used in Report results mode" << endl << + " as it will erase the results from the latest adjustment and create new stage" << endl << + " files initialised to zero." << endl << endl; + cout_mutex.unlock(); + return EXIT_FAILURE; + } + } cout_mutex.unlock(); } From 32c8e23cefa72c762cc360fe9de3bd269b66aa4f Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 2 Sep 2024 20:03:49 +1000 Subject: [PATCH 023/102] Improve locating MKL for cmake builds --- dynadjust/CMakeLists.txt | 34 +++++++++++++++++---------------- resources/make_dynadjust_gcc.sh | 16 +++++++++++++++- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/dynadjust/CMakeLists.txt b/dynadjust/CMakeLists.txt index 44be6e08..64e94537 100644 --- a/dynadjust/CMakeLists.txt +++ b/dynadjust/CMakeLists.txt @@ -94,7 +94,7 @@ endif () message (" ") message (STATUS "Looking for intel math kernel library (mkl)...") -find_package(MKL CONFIG REQUIRED) +find_package(MKL CONFIG REQUIRED PATHS $ENV{MKLROOT}) if (CMAKE_SYSTEM_NAME MATCHES "Darwin") find_library(IOMP5_LIB iomp5 PATHS /opt/intel/lib) @@ -154,21 +154,23 @@ if (DNA_BUILD_ERROR) message (" ") message (STATUS "**********************************************") message (STATUS "Cannot build DynaAjust ${DYNADJUST_VERSION}. Missing components:") -if (XERCES_FIND_ERROR) - message (STATUS " xerces-c") -endif () -if (XSD_FIND_ERROR) - message (STATUS " xsd headers") -endif () -if (BOOST_FIND_ERROR) - message (STATUS " boost") -endif () -if (MKL_FIND_ERROR) - message (STATUS " mkl") -endif () -if (IOMP5_FIND_ERROR) - message (STATUS " iomp5") -endif () + + if (XERCES_FIND_ERROR) + message (STATUS " xerces-c") + endif () + if (XSD_FIND_ERROR) + message (STATUS " xsd headers") + endif () + if (BOOST_FIND_ERROR) + message (STATUS " boost") + endif () + if (MKL_FIND_ERROR) + message (STATUS " mkl") + endif () + if (IOMP5_FIND_ERROR) + message (STATUS " iomp5") + endif () + message (" ") message (FATAL_ERROR "Build terminating.") endif () diff --git a/resources/make_dynadjust_gcc.sh b/resources/make_dynadjust_gcc.sh index 1b23cac0..5dc1f69a 100755 --- a/resources/make_dynadjust_gcc.sh +++ b/resources/make_dynadjust_gcc.sh @@ -260,12 +260,26 @@ fi cd "$_build_dir" -# 3. copy files: +# 3. copy cmake files: echo "Copying Find*.cmake files to build directory..." cp ../FindXercesC.cmake ./ #cp ../FindMKL.cmake ./ cp ../FindXSD.cmake ./ +# check if MKLROOT environment variable has been set, which means +# intel MKL has been installed. +if [ -z "$MKLROOT" ] +then + # If not, find setvars.h and execute to set environment variables + if [ -e /opt/intel/oneapi/setvars.sh ] + then + echo "Setting environment variables for intel..." + source /opt/intel/oneapi/setvars.sh + fi +else + echo "Intel root: $MKLROOT" +fi + REL_BUILD_TYPE="Release" DBG_BUILD_TYPE="Debug" THIS_BUILD_TYPE=$REL_BUILD_TYPE From 5916e903e23bb73c43e568721335b9ce2914021c Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 3 Sep 2024 12:42:35 +1000 Subject: [PATCH 024/102] Replace deprecated function --- dynadjust/include/functions/dnafilepathfuncs.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/include/functions/dnafilepathfuncs.hpp b/dynadjust/include/functions/dnafilepathfuncs.hpp index c8ff9a09..b4fab9b7 100644 --- a/dynadjust/include/functions/dnafilepathfuncs.hpp +++ b/dynadjust/include/functions/dnafilepathfuncs.hpp @@ -62,7 +62,7 @@ T formPath(const T& folder, const T file) template T leafStr(const T& filePath) { - return path(filePath).leaf().string(); + return path(filePath).filename().string(); } #endif //DNAFILEPATHFUNCS_H_ \ No newline at end of file From 8c7fbc98a62c9e15578e0f261bc34f7fcf2383be Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 3 Sep 2024 12:45:41 +1000 Subject: [PATCH 025/102] Remove unused variable --- dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index dcc64f5b..adea8c02 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -808,7 +808,6 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* size_t i, nfiles(p.i.input_files.size()); // for each file... string epsgCode, input_file, ss, status_msg; - vstring input_files; ostringstream ss_time, ss_msg; input_file_meta_t input_file_meta; milliseconds elapsed_time(milliseconds(0)); @@ -837,7 +836,6 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* } } - input_files.push_back(input_file); ss = leafStr(p.i.input_files.at(i)) + "... "; if (!p.g.quiet) cout << " " << setw(strlen_arg) << left << ss; From b535bbd4160afdab2c96602adfdb8965bc4879e7 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 3 Sep 2024 12:49:52 +1000 Subject: [PATCH 026/102] Fix DBID output on printing alternate GNSS units --- dynadjust/dynadjust/dnaadjust/dnaadjust.cpp | 128 ++++++++++++-------- dynadjust/dynadjust/dnaadjust/dnaadjust.hpp | 8 +- 2 files changed, 83 insertions(+), 53 deletions(-) diff --git a/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp b/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp index 73b0707c..092a603a 100644 --- a/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp +++ b/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp @@ -10675,10 +10675,6 @@ void dna_adjust::PrintCompMeasurements(const UINT32& block, const string& type) UINT32 design_row(0); - // Initialise database id iterator - if (projectSettings_.o._database_ids) - _it_dbid = v_msr_db_map_.begin(); - for (_it_block_msr=v_CML_.at(block).begin(); _it_block_msr!=v_CML_.at(block).end(); ++_it_block_msr) { if (InitialiseandValidateMsrPointer(_it_block_msr, _it_msr)) @@ -12096,10 +12092,6 @@ void dna_adjust::PrintIgnoredAdjMeasurements(bool printHeader) UpdateIgnoredMeasurements(&_it_msr, storeOriginalMeasurement); } - // Initialise database id iterator - if (projectSettings_.o._database_ids) - _it_dbid = v_msr_db_map_.begin(); - // Print measurements for (_it_ign = ignored_msrs.begin(); _it_ign != ignored_msrs.end(); ++_it_ign) { @@ -12370,10 +12362,6 @@ void dna_adjust::PrintAdjMeasurements(v_uint32_u32u32_pair msr_block, bool print UINT32 clusterID(MAX_UINT32_VALUE); - // Initialise database id iterator - if (projectSettings_.o._database_ids) - _it_dbid = v_msr_db_map_.begin(); - for (_it_block_msr=msr_block.begin(); _it_block_msr!=msr_block.end(); ++_it_block_msr) { _it_msr = bmsBinaryRecords_.begin() + (_it_block_msr->first); @@ -12462,7 +12450,8 @@ void dna_adjust::PrintCompMeasurementsAngular(const char cardinal, const double& PrintMeasurementCorrection(cardinal, _it_msr); // Print measurement database ids - PrintMeasurementDatabaseID(_it_msr); + if (projectSettings_.o._database_ids) + PrintMeasurementDatabaseID(_it_msr); adj_file << endl; } @@ -12485,7 +12474,8 @@ void dna_adjust::PrintCompMeasurementsLinear(const char cardinal, const double& PrintMeasurementCorrection(cardinal, _it_msr); // Print measurement database ids - PrintMeasurementDatabaseID(_it_msr); + if (projectSettings_.o._database_ids) + PrintMeasurementDatabaseID(_it_msr); adj_file << endl; } @@ -12595,6 +12585,7 @@ void dna_adjust::PrintCompMeasurements_D(it_vmsr_t& _it_msr, UINT32& design_row) adj_file << setw(PAD3) << left << ignoreFlag << setw(PAD2) << left << angle_count; + // Print measurement database ids if (projectSettings_.o._database_ids) { // Measured + Computed + Correction + Meas SD + Pre Adj Corr @@ -13040,23 +13031,23 @@ void dna_adjust::PrintMeasurementsAngular(const char cardinal, const double& mea } -void dna_adjust::PrintAdjMeasurementsAngular(const char cardinal, const it_vmsr_t& _it_msr) +void dna_adjust::PrintAdjMeasurementsAngular(const char cardinal, const it_vmsr_t& _it_msr, bool initialise_dbindex) { // Print adjusted angular measurements PrintMeasurementsAngular(cardinal, _it_msr->measAdj, _it_msr->measCorr, _it_msr); // Print adjusted statistics - PrintAdjMeasurementStatistics(cardinal, _it_msr); + PrintAdjMeasurementStatistics(cardinal, _it_msr, initialise_dbindex); } -void dna_adjust::PrintAdjMeasurementsLinear(const char cardinal, const it_vmsr_t& _it_msr) +void dna_adjust::PrintAdjMeasurementsLinear(const char cardinal, const it_vmsr_t& _it_msr, bool initialise_dbindex) { // Print adjusted linear measurements PrintMeasurementsLinear(cardinal, _it_msr->measAdj, _it_msr->measCorr, _it_msr); // Print adjusted statistics - PrintAdjMeasurementStatistics(cardinal, _it_msr); + PrintAdjMeasurementStatistics(cardinal, _it_msr, initialise_dbindex); } @@ -13220,36 +13211,37 @@ void dna_adjust::PrintMeasurementCorrection(const char cardinal, const it_vmsr_t } -void dna_adjust::PrintMeasurementDatabaseID(const it_vmsr_t& _it_msr) +void dna_adjust::PrintMeasurementDatabaseID(const it_vmsr_t& _it_msr, bool initialise_dbindex) { - if (projectSettings_.o._database_ids) + // set iterator to the database index + if (initialise_dbindex) { - size_t dbindex = std::distance(bmsBinaryRecords_.begin(), _it_msr); - _it_dbid = v_msr_db_map_.begin() + dbindex; + size_t dbindx = std::distance(bmsBinaryRecords_.begin(), _it_msr); + _it_dbid = v_msr_db_map_.begin() + dbindx; + } + + // Print measurement id + if (_it_dbid->is_msr_id_set) + adj_file << setw(STDDEV) << right << _it_dbid->msr_id; + else + adj_file << setw(STDDEV) << " "; - // Print measurement id - if (_it_dbid->is_msr_id_set) - adj_file << setw(STDDEV) << right << _it_dbid->msr_id; + // Print cluster id? + switch (_it_msr->measType) + { + case 'D': + case 'G': + case 'X': + case 'Y': + if (_it_dbid->is_cls_id_set) + adj_file << setw(STDDEV) << right << _it_dbid->cluster_id; else adj_file << setw(STDDEV) << " "; - - // Print cluster id? - switch (_it_msr->measType) - { - case 'D': - case 'G': - case 'X': - case 'Y': - if (_it_dbid->is_cls_id_set) - adj_file << setw(STDDEV) << right << _it_dbid->cluster_id; - else - adj_file << setw(STDDEV) << " "; - } } } -void dna_adjust::PrintAdjMeasurementStatistics(const char cardinal, const it_vmsr_t& _it_msr) +void dna_adjust::PrintAdjMeasurementStatistics(const char cardinal, const it_vmsr_t& _it_msr, bool initialise_dbindex) { UINT16 PRECISION_STAT(2); @@ -13280,7 +13272,8 @@ void dna_adjust::PrintAdjMeasurementStatistics(const char cardinal, const it_vms adj_file << setw(OUTLIER) << right << " "; // Print measurement database ids - PrintMeasurementDatabaseID(_it_msr); + if (projectSettings_.o._database_ids) + PrintMeasurementDatabaseID(_it_msr, initialise_dbindex); adj_file << endl; } @@ -13738,6 +13731,7 @@ void dna_adjust::PrintAdjGNSSAlternateUnits(it_vmsr_t& _it_msr, const uint32_uin bstBinaryRecords_.at(_it_msr->station1).currentLatitude, bstBinaryRecords_.at(_it_msr->station1).currentLongitude); + // return iterator to the X component of the GNSS measurement _it_msr -= 2; switch (projectSettings_.o._adj_gnss_units) @@ -13768,7 +13762,11 @@ void dna_adjust::PrintAdjGNSSAlternateUnits(it_vmsr_t& _it_msr, const uint32_uin // Update Pelzer reliability, N-Stat, T-Stat UpdateMsrRecordStats(_it_gnss_msr, _it_gnss_msr->term2); - PrintAdjMeasurementsLinear('e', _it_gnss_msr); + // Initialise database id iterator + if (projectSettings_.o._database_ids) + _it_dbid = v_msr_db_map_.begin() + std::distance(bmsBinaryRecords_.begin(), _it_msr); + + PrintAdjMeasurementsLinear('e', _it_gnss_msr, false); // N _it_msr++; @@ -13784,7 +13782,11 @@ void dna_adjust::PrintAdjGNSSAlternateUnits(it_vmsr_t& _it_msr, const uint32_uin // Update Pelzer reliability, N-Stat, T-Stat UpdateMsrRecordStats(_it_gnss_msr, _it_gnss_msr->term3); - PrintAdjMeasurementsLinear('n', _it_gnss_msr); + // Initialise database id iterator + if (projectSettings_.o._database_ids) + _it_dbid = v_msr_db_map_.begin() + std::distance(bmsBinaryRecords_.begin(), _it_msr); + + PrintAdjMeasurementsLinear('n', _it_gnss_msr, false); // U _it_msr++; @@ -13800,7 +13802,11 @@ void dna_adjust::PrintAdjGNSSAlternateUnits(it_vmsr_t& _it_msr, const uint32_uin // Update Pelzer reliability, N-Stat, T-Stat UpdateMsrRecordStats(_it_gnss_msr, _it_gnss_msr->term4); - PrintAdjMeasurementsLinear('u', _it_gnss_msr); + // Initialise database id iterator + if (projectSettings_.o._database_ids) + _it_dbid = v_msr_db_map_.begin() + std::distance(bmsBinaryRecords_.begin(), _it_msr); + + PrintAdjMeasurementsLinear('u', _it_gnss_msr, false); break; case AED_adj_gnss_ui: @@ -13845,7 +13851,11 @@ void dna_adjust::PrintAdjGNSSAlternateUnits(it_vmsr_t& _it_msr, const uint32_uin // Update Pelzer reliability, N-Stat, T-Stat UpdateMsrRecordStats(_it_gnss_msr, _it_gnss_msr->term2); - PrintAdjMeasurementsAngular('a', _it_gnss_msr); + // Initialise database id iterator + if (projectSettings_.o._database_ids) + _it_dbid = v_msr_db_map_.begin() + std::distance(bmsBinaryRecords_.begin(), _it_msr); + + PrintAdjMeasurementsAngular('a', _it_gnss_msr, false); // Print vertical angle _it_msr++; @@ -13861,7 +13871,11 @@ void dna_adjust::PrintAdjGNSSAlternateUnits(it_vmsr_t& _it_msr, const uint32_uin // Update Pelzer reliability, N-Stat, T-Stat UpdateMsrRecordStats(_it_gnss_msr, _it_gnss_msr->term3); - PrintAdjMeasurementsAngular('v', _it_gnss_msr); + // Initialise database id iterator + if (projectSettings_.o._database_ids) + _it_dbid = v_msr_db_map_.begin() + std::distance(bmsBinaryRecords_.begin(), _it_msr); + + PrintAdjMeasurementsAngular('v', _it_gnss_msr, false); // Print slope distance _it_msr++; @@ -13879,7 +13893,11 @@ void dna_adjust::PrintAdjGNSSAlternateUnits(it_vmsr_t& _it_msr, const uint32_uin // Update Pelzer reliability, N-Stat, T-Stat UpdateMsrRecordStats(_it_gnss_msr, _it_gnss_msr->term4); - PrintAdjMeasurementsLinear('s', _it_gnss_msr); + // Initialise database id iterator + if (projectSettings_.o._database_ids) + _it_dbid = v_msr_db_map_.begin() + std::distance(bmsBinaryRecords_.begin(), _it_msr); + + PrintAdjMeasurementsLinear('s', _it_gnss_msr, false); break; case ADU_adj_gnss_ui: @@ -13923,7 +13941,11 @@ void dna_adjust::PrintAdjGNSSAlternateUnits(it_vmsr_t& _it_msr, const uint32_uin // Update Pelzer reliability, N-Stat, T-Stat UpdateMsrRecordStats(_it_gnss_msr, _it_gnss_msr->term2); - PrintAdjMeasurementsAngular('a', _it_gnss_msr); + // Initialise database id iterator + if (projectSettings_.o._database_ids) + _it_dbid = v_msr_db_map_.begin() + std::distance(bmsBinaryRecords_.begin(), _it_msr); + + PrintAdjMeasurementsAngular('a', _it_gnss_msr, false); // Print slope distance _it_msr++; @@ -13941,7 +13963,11 @@ void dna_adjust::PrintAdjGNSSAlternateUnits(it_vmsr_t& _it_msr, const uint32_uin // Update Pelzer reliability, N-Stat, T-Stat UpdateMsrRecordStats(_it_gnss_msr, _it_gnss_msr->term3); - PrintAdjMeasurementsLinear('s', _it_gnss_msr); + // Initialise database id iterator + if (projectSettings_.o._database_ids) + _it_dbid = v_msr_db_map_.begin() + std::distance(bmsBinaryRecords_.begin(), _it_msr); + + PrintAdjMeasurementsLinear('s', _it_gnss_msr, false); // Print up _it_msr++; @@ -13957,7 +13983,11 @@ void dna_adjust::PrintAdjGNSSAlternateUnits(it_vmsr_t& _it_msr, const uint32_uin // Update Pelzer reliability, N-Stat, T-Stat UpdateMsrRecordStats(_it_gnss_msr, _it_gnss_msr->term4); - PrintAdjMeasurementsLinear('u', _it_gnss_msr); + // Initialise database id iterator + if (projectSettings_.o._database_ids) + _it_dbid = v_msr_db_map_.begin() + std::distance(bmsBinaryRecords_.begin(), _it_msr); + + PrintAdjMeasurementsLinear('u', _it_gnss_msr, false); break; } } diff --git a/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp b/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp index 930bd0b5..6cfdbc5b 100644 --- a/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp +++ b/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp @@ -772,16 +772,16 @@ class dna_adjust { void PrintMeasurementsAngular(const char cardinal, const double& measurement, const double& correction, const it_vmsr_t& _it_msr, bool printAdjMsr = true); void PrintMeasurementsLinear(const char cardinal, const double& measurement, const double& correction, const it_vmsr_t& _it_msr, bool printAdjMsr = true); void PrintMeasurementCorrection(const char cardinal, const it_vmsr_t& _it_msr); - void PrintMeasurementDatabaseID(const it_vmsr_t& _it_msr); + void PrintMeasurementDatabaseID(const it_vmsr_t& _it_msr, bool initialise_dbindex=true); void FormUniqueMsrList(); void PrintAdjMeasurementsHeader(bool printHeader, const string& table_heading, printMeasurementsMode printMode, UINT32 block, bool printBlocks = false); void PrintAdjMeasurements(v_uint32_u32u32_pair msr_block, bool printHeader); - void PrintAdjMeasurementsAngular(const char cardinal, const it_vmsr_t& _it_msr); - void PrintAdjMeasurementsLinear(const char cardinal, const it_vmsr_t& _it_msr); + void PrintAdjMeasurementsAngular(const char cardinal, const it_vmsr_t& _it_msr, bool initialise_dbindex = true); + void PrintAdjMeasurementsLinear(const char cardinal, const it_vmsr_t& _it_msr, bool initialise_dbindex=true); void PrintAdjGNSSAlternateUnits(it_vmsr_t& _it_msr, const uint32_uint32_pair& b_pam); - void PrintAdjMeasurementStatistics(const char cardinal, const it_vmsr_t& _it_msr); + void PrintAdjMeasurementStatistics(const char cardinal, const it_vmsr_t& _it_msr, bool initialise_dbindex = true); void PrintIgnoredAdjMeasurements(bool printHeader); From d657f8cb0d4e41d8500e90e6c05b7e8ffaa8e936 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:29:37 +1000 Subject: [PATCH 027/102] Improve help-module search --- .../dnaadjustwrapper/dnaadjustwrapper.cpp | 35 ++++++++++++++----- .../dnageoidwrapper/dnageoidwrapper.cpp | 2 +- .../dnaimportwrapper/dnaimportwrapper.cpp | 2 +- .../dnaplotwrapper/dnaplotwrapper.cpp | 2 +- .../dnareftranwrapper/dnareftranwrapper.cpp | 4 +-- .../dnasegmentwrapper/dnasegmentwrapper.cpp | 2 +- dynadjust/dynadjust/dynadjust/dynadjust.cpp | 2 +- dynadjust/dynadjust/metadata/metadata.cpp | 2 +- .../include/config/dnaoptions-interface.hpp | 1 + 9 files changed, 35 insertions(+), 17 deletions(-) diff --git a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp index a3504326..b6197d76 100644 --- a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp +++ b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp @@ -956,7 +956,7 @@ int main(int argc, char* argv[]) string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) (VERSION_V, "Display the current program version") (HELP_H, "Show this help message") - (HELP_MODULE, value(), + (HELP_MODULE_H, value(), "Provide help for a specific help category.") ; @@ -1006,32 +1006,49 @@ int main(int argc, char* argv[]) cout << cmd_line_banner; string original_text = vm[HELP_MODULE].as(); string help_text = str_upper(original_text); + bool module_found(false); if (str_upper(ALL_MODULE_STDOPT).find(help_text) != string::npos) { cout << standard_options << endl; + module_found = true; } - else if (str_upper(ADJUST_MODULE_MODE).find(help_text) != string::npos) { + + if (str_upper(ADJUST_MODULE_MODE).find(help_text) != string::npos) { cout << adj_mode_options << endl; + module_found = true; } - else if (str_upper(ADJUST_MODULE_PHASED).find(help_text) != string::npos) { + + if (str_upper(ADJUST_MODULE_PHASED).find(help_text) != string::npos) { cout << phased_adj_options << endl; + module_found = true; } - else if (str_upper(ADJUST_MODULE_CONFIG).find(help_text) != string::npos) { + + if (str_upper(ADJUST_MODULE_CONFIG).find(help_text) != string::npos) { cout << adj_config_options << endl; + module_found = true; } - else if (str_upper(ADJUST_MODULE_STAGE).find(help_text) != string::npos) { + + if (str_upper(ADJUST_MODULE_STAGE).find(help_text) != string::npos) { cout << staged_adj_options << endl; + module_found = true; } - else if (str_upper(ALL_MODULE_OUTPUT).find(help_text) != string::npos) { + + if (str_upper(ALL_MODULE_OUTPUT).find(help_text) != string::npos) { cout << output_options << endl; + module_found = true; } - else if (str_upper(ALL_MODULE_EXPORT).find(help_text) != string::npos) { + + if (str_upper(ALL_MODULE_EXPORT).find(help_text) != string::npos) { cout << export_options << endl; + module_found = true; } - else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != string::npos) { + + if (str_upper(ALL_MODULE_GENERIC).find(help_text) != string::npos) { cout << generic_options << endl; + module_found = true; } - else { + + if (!module_found) { cout << endl << "- Error: Help module '" << original_text << "' is not in the list of options." << endl; return EXIT_FAILURE; diff --git a/dynadjust/dynadjust/dnageoidwrapper/dnageoidwrapper.cpp b/dynadjust/dynadjust/dnageoidwrapper/dnageoidwrapper.cpp index 63467312..79a69b09 100644 --- a/dynadjust/dynadjust/dnageoidwrapper/dnageoidwrapper.cpp +++ b/dynadjust/dynadjust/dnageoidwrapper/dnageoidwrapper.cpp @@ -649,7 +649,7 @@ int main(int argc, char* argv[]) string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) (VERSION_V, "Display the current program version") (HELP_H, "Show this help message") - (HELP_MODULE, value(), + (HELP_MODULE_H, value(), "Provide help for a specific help category.") ; diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index adea8c02..4384d73c 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -1183,7 +1183,7 @@ int main(int argc, char* argv[]) string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs.").c_str()) (VERSION_V, "Display the current program version.") (HELP_H, "Show this help message.") - (HELP_MODULE, value(), + (HELP_MODULE_H, value(), "Provide help for a specific help category.") ; diff --git a/dynadjust/dynadjust/dnaplotwrapper/dnaplotwrapper.cpp b/dynadjust/dynadjust/dnaplotwrapper/dnaplotwrapper.cpp index 1d1e3952..b520b8b8 100644 --- a/dynadjust/dynadjust/dnaplotwrapper/dnaplotwrapper.cpp +++ b/dynadjust/dynadjust/dnaplotwrapper/dnaplotwrapper.cpp @@ -339,7 +339,7 @@ int main(int argc, char* argv[]) string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) (VERSION_V, "Display the current program version") (HELP_H, "Show this help message") - (HELP_MODULE, value(), + (HELP_MODULE_H, value(), "Provide help for a specific help category.") ; diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index c43e28ab..4df0b250 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -137,7 +137,7 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& try { // Okay, no epoch supplied, so set the epoch to be the reference epoch of the reference frame - p.r.epoch = referenceepochFromEpsgCode(epsgCodeFromName(p.r.reference_frame)); + p.r.epoch = referenceepochFromEpsgCode(epsgCodeFromName(p.r.reference_frame)); } catch (const runtime_error& e) { cout << endl << "- Error: " << e.what() << endl; @@ -326,7 +326,7 @@ int main(int argc, char* argv[]) string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) (VERSION_V, "Display the current program version") (HELP_H, "Show this help message") - (HELP_MODULE, value(), + (HELP_MODULE_H, value(), "Provide help for a specific help category.") ; diff --git a/dynadjust/dynadjust/dnasegmentwrapper/dnasegmentwrapper.cpp b/dynadjust/dynadjust/dnasegmentwrapper/dnasegmentwrapper.cpp index e4aa5a7f..7016bd73 100644 --- a/dynadjust/dynadjust/dnasegmentwrapper/dnasegmentwrapper.cpp +++ b/dynadjust/dynadjust/dnasegmentwrapper/dnasegmentwrapper.cpp @@ -202,7 +202,7 @@ int main(int argc, char* argv[]) string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) (VERSION_V, "Display the current program version") (HELP_H, "Show this help message") - (HELP_MODULE, value(), + (HELP_MODULE_H, value(), "Provide help for a specific help category.") ; diff --git a/dynadjust/dynadjust/dynadjust/dynadjust.cpp b/dynadjust/dynadjust/dynadjust/dynadjust.cpp index aae2e10a..906c8f38 100644 --- a/dynadjust/dynadjust/dynadjust/dynadjust.cpp +++ b/dynadjust/dynadjust/dynadjust/dynadjust.cpp @@ -124,7 +124,7 @@ int main(int argc, char* argv[]) string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs.").c_str()) (VERSION_V, "Display the current program version.") (HELP_H, "Show this help message.") - (HELP_MODULE, value(), + (HELP_MODULE_H, value(), "Provide help for a specific help category.") ; diff --git a/dynadjust/dynadjust/metadata/metadata.cpp b/dynadjust/dynadjust/metadata/metadata.cpp index 53bfa844..94a102f1 100644 --- a/dynadjust/dynadjust/metadata/metadata.cpp +++ b/dynadjust/dynadjust/metadata/metadata.cpp @@ -374,7 +374,7 @@ int main(int argc, char* argv[]) string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs.").c_str()) (VERSION_V, "Display the current program version.") (HELP_H, "Show this help message.") - (HELP_MODULE, value(), + (HELP_MODULE_H, value(), "Provide help for a specific help category.") ; diff --git a/dynadjust/include/config/dnaoptions-interface.hpp b/dynadjust/include/config/dnaoptions-interface.hpp index 8632c558..07059a2d 100644 --- a/dynadjust/include/config/dnaoptions-interface.hpp +++ b/dynadjust/include/config/dnaoptions-interface.hpp @@ -74,6 +74,7 @@ const char* const BIN_MSR_FILE = "binary-msr-file"; const char* const BIN_MSR_FILE_M = "binary-msr-file,m"; const char* const CONVERT_BST_HT = "convert-stn-hts"; const char* const HELP_MODULE = "help-module"; +const char* const HELP_MODULE_H = "help-module,?"; const char* const HELP = "help"; const char* const HELP_H = "help,h"; const char* const VERSION = "version"; From 99fdea1a3b7ede5fd45860858d005ce4d764aecf Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:35:16 +1000 Subject: [PATCH 028/102] Improve initialisation of default datum --- .../dnareftranwrapper/dnareftranwrapper.cpp | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index 4df0b250..5d34f010 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -116,28 +116,53 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& return EXIT_FAILURE; } + p.g.project_file = formPath(p.g.output_folder, p.g.network_name, "dnaproj"); + p.r.rft_file = formPath(p.g.output_folder, p.g.network_name, "rft"); + + bool frameSupplied(true); + project_settings tmp; + if (!vm.count(REFERENCE_FRAME)) { + if (exists(p.g.project_file)) + { + try { + CDnaProjectFile projectFile(p.g.project_file, reftranSetting); + tmp = projectFile.GetSettings(); + p.r.reference_frame = tmp.r.reference_frame; + frameSupplied = false; + } + catch (const runtime_error& e) { + cout << endl << "- Error: " << e.what() << endl; + return EXIT_FAILURE; + } + } + //cout << endl << "- Reference frame was not supplied. Using project default (" << p.r.reference_frame << ")" << endl << endl; - //return EXIT_FAILURE; - //try - //{ - // // Okay, no frame supplied, check the frame in the project settings. - // // The following throws an exception if the frame is unknown - // string epsg = epsgStringFromName(p.r.reference_frame); - //} - //catch (const runtime_error& e) { - // cout << endl << "- Error: " << e.what() << endl; - // return EXIT_FAILURE; - //} + + try + { + // Okay, no frame supplied, check the frame in the project settings. + // The following throws an exception if the frame is unknown + string epsg = epsgStringFromName(p.r.reference_frame); + } + catch (const runtime_error& e) { + cout << endl << "- Error: " << e.what() << endl; + return EXIT_FAILURE; + } } if (!vm.count(EPOCH)) { try { - // Okay, no epoch supplied, so set the epoch to be the reference epoch of the reference frame + if (frameSupplied) + // Okay, frame supplied, but no epoch supplied. + // Set the epoch to be the reference epoch of the supplied reference frame p.r.epoch = referenceepochFromEpsgCode(epsgCodeFromName(p.r.reference_frame)); + else + // Take the epoch from the project file + p.r.epoch = tmp.r.epoch; } catch (const runtime_error& e) { cout << endl << "- Error: " << e.what() << endl; @@ -167,9 +192,6 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& } } - p.g.project_file = formPath(p.g.output_folder, p.g.network_name, "dnaproj"); - p.r.rft_file = formPath(p.g.output_folder, p.g.network_name, "rft"); - // binary station file location (input) if (vm.count(BIN_STN_FILE)) p.r.bst_file = formPath(p.g.input_folder, p.r.bst_file); From 49c0141f8b461fdf1423b4a8c342671bc65287e1 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:46:27 +1000 Subject: [PATCH 029/102] Minor enhancement --- dynadjust/include/config/dnaprojectfile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/include/config/dnaprojectfile.cpp b/dynadjust/include/config/dnaprojectfile.cpp index 4c38ea36..10e2b9a8 100644 --- a/dynadjust/include/config/dnaprojectfile.cpp +++ b/dynadjust/include/config/dnaprojectfile.cpp @@ -1699,7 +1699,7 @@ void CDnaProjectFile::PrintProjectFile() stringstream ss; // Write header line - dnaproj_header(dnaproj_file, settings_.g.network_name + " project file."); + dnaproj_header(dnaproj_file, settings_.g.network_name + " project file"); dnaproj_file << endl << endl; //////////////////////////////////////////////////////////////////////////////////////////////// From 81864b7dcf9c41fd4c21f505eb9582995fe1d08e Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:49:17 +1000 Subject: [PATCH 030/102] Improve handling of ignored directions and direction sets --- dynadjust/dynadjust/dnaadjust/dnaadjust.cpp | 277 ++++++++++++++++-- dynadjust/dynadjust/dnaadjust/dnaadjust.hpp | 2 +- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 27 +- .../dynadjust/dnaimport/dnaparser_pimpl.cxx | 78 +++-- dynadjust/include/config/dnatypes.hpp | 2 + .../include/functions/dnatemplatefuncs.hpp | 17 ++ .../functions/dnatemplatematrixfuncs.hpp | 30 +- dynadjust/include/io/dnaioseg.cpp | 2 +- .../measurement_types/dnadirection.cpp | 1 - .../measurement_types/dnadirectionset.cpp | 19 +- .../measurement_types/dnadirectionset.hpp | 2 + .../measurement_types/dnameasurement.hpp | 8 +- .../include/measurement_types/dnamsrtally.cpp | 4 +- 13 files changed, 389 insertions(+), 80 deletions(-) diff --git a/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp b/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp index 092a603a..a87c6f5c 100644 --- a/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp +++ b/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp @@ -1717,7 +1717,9 @@ void dna_adjust::UpdateNormals_A(const UINT32& stn1, const UINT32& stn2, const U void dna_adjust::UpdateNormals_D(const UINT32& block, it_vmsr_t& _it_msr, UINT32& design_row, matrix_2d* normals, matrix_2d* design, matrix_2d* AtVinv) { - UINT32 row, col, a, angle_count(_it_msr->vectorCount1 - 1); + UINT32 row, col, a, angle_count(_it_msr->vectorCount2 - 1); + UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); + vector stations; UINT32 stn1, stn2, stn3; @@ -1731,6 +1733,18 @@ void dna_adjust::UpdateNormals_D(const UINT32& block, it_vmsr_t& _it_msr, UINT32 // stations to assist formulation of covariances for (a=0; aignore) + { + while (skip < ignored) + { + skip++; + _it_msr++; + if (!_it_msr->ignore) + break; + } + } + it_angle->station3 = _it_msr->station2; stn1 = (v_blockStationsMap_.at(block)[it_angle->station1] * 3); @@ -1777,6 +1791,7 @@ void dna_adjust::UpdateNormals_D(const UINT32& block, it_vmsr_t& _it_msr, UINT32 // prepare for next angle angleRec.push_back(*_it_msr); it_angle = angleRec.end() - 1; + _it_msr++; } @@ -3219,7 +3234,7 @@ void dna_adjust::FormUniqueMsrList() break; // Single row per subtended angle (# directions less 1) case 'D': // Direction set - precadjmsr_row += (_it_msr->vectorCount1 - 1); + precadjmsr_row += (_it_msr->vectorCount2 - 1); break; // Three rows (6 elements for upper triangular) case 'G': // GPS Baseline @@ -4938,7 +4953,7 @@ void dna_adjust::FillDesignNormalMeasurementsMatrices(bool buildnewMatrices, con // When a target direction is found, continue to next element. if (_it_msr->measType == 'D') - if (_it_msr->vectorCount1 < 1) + if (_it_msr->vectorCount2 < 1) continue; // Build AtVinv, Normals and Meas minus Comp vectors @@ -5201,17 +5216,19 @@ void dna_adjust::LoadVarianceMatrix_D(it_vmsr_t _it_msr, matrix_2d* var_dirn, bo // scale1 = derived angle corrected for deflection of the vertical // scale2 = variance (angle) // scale3 = covariance (angle) + // vectorCount2 = number of non-ignored directions // preAdjMeas = original derived angle - UINT32 a, angle_count(_it_msr->vectorCount1 - 1); // number of directions excluding the RO + UINT32 a, angle_count(_it_msr->vectorCount2 - 1); // number of directions excluding the RO - matrix_2d A(angle_count, _it_msr->vectorCount1); - matrix_2d AV(angle_count, _it_msr->vectorCount1); + matrix_2d A(angle_count, _it_msr->vectorCount2); + matrix_2d AV(angle_count, _it_msr->vectorCount2); var_dirn->redim(angle_count, angle_count); var_dirn->zero(); double previousVariance(_it_msr->term2); + UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); if (projectSettings_.g.verbose > 5) debug_file << endl << "Std dev " << scientific << setprecision(16) << _it_msr->term2 << " (" << fixed << setprecision(2) << Seconds(sqrt(_it_msr->term2)) << " seconds)" << endl; @@ -5222,6 +5239,18 @@ void dna_adjust::LoadVarianceMatrix_D(it_vmsr_t _it_msr, matrix_2d* var_dirn, bo try { for (a=0; aignore) + { + while (skip < ignored) + { + skip++; + _it_msr++; + if (!_it_msr->ignore) + break; + } + } + // Fill design & variance matrices to propagate variances from directions to angles A.put(a, a, -1); A.put(a, a+1, 1); @@ -6182,7 +6211,8 @@ void dna_adjust::UpdateDesignNormalMeasMatrices_D(pit_vmsr_t _it_msr, UINT32& de it_vmsr_t _it_msr_first(*_it_msr); UINT32 design_row_begin(design_row); - UINT32 a, angle_count((*_it_msr)->vectorCount1 - 1); // number of directions excluding the RO + UINT32 a, angle_count((*_it_msr)->vectorCount2 - 1); // number of directions excluding the RO + UINT32 skip(0), ignored((*_it_msr)->vectorCount1 - (*_it_msr)->vectorCount2); vmsr_t angleRec; angleRec.push_back(*(*_it_msr)); @@ -6201,6 +6231,7 @@ void dna_adjust::UpdateDesignNormalMeasMatrices_D(pit_vmsr_t _it_msr, UINT32& de // scale2 = variance (angle) // scale3 = covariance (angle) - for the context of vmsr_t angleRec only, so as to // properly form the normals from covariances formed from directions SDs + // vectorCount2 = number of non-ignored directions // preAdjMeas = original derived angle if (projectSettings_.g.verbose > 6) @@ -6210,6 +6241,18 @@ void dna_adjust::UpdateDesignNormalMeasMatrices_D(pit_vmsr_t _it_msr, UINT32& de { for (a=0; aignore) + { + while (skip < ignored) + { + skip++; + (*_it_msr)++; + if (!(*_it_msr)->ignore) + break; + } + } + it_angle->station3 = (*_it_msr)->station2; if (buildnewMatrices) @@ -6255,8 +6298,13 @@ void dna_adjust::UpdateDesignNormalMeasMatrices_D(pit_vmsr_t _it_msr, UINT32& de (*_it_msr)->preAdjCorr = it_angle->preAdjCorr; } - if (a+1 == angle_count) + if (a + 1 == angle_count) + { + // check for any ignored directions + if (_it_msr_first->vectorCount1 != _it_msr_first->vectorCount2) + (*_it_msr) = _it_msr_first + _it_msr_first->vectorCount1; break; + } if (buildnewMatrices) previousDirection = (*_it_msr)->term1; @@ -8131,13 +8179,26 @@ void dna_adjust::ComputeAdjustedMsrPrecisions() void dna_adjust::UpdateMsrTstatistic_D(it_vmsr_t& _it_msr) { - UINT32 a, angle_count(_it_msr->vectorCount1 - 1); + UINT32 a, angle_count(_it_msr->vectorCount2 - 1); + UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); // move to first direction record which contains the derived angles _it_msr++; for (a=0; aignore) + { + while (skip < ignored) + { + skip++; + _it_msr++; + if (!_it_msr->ignore) + break; + } + } + if (fabs(sigmaZeroSqRt_ - 0.0) < PRECISION_1E10) _it_msr->TStat = 0.0; else @@ -8764,8 +8825,9 @@ void dna_adjust::ComputePrecisionAdjMsrs_D(const UINT32& block, it_vmsr_t& _it_m UINT32& design_row, UINT32& precadjmsr_row) { UINT32 stn1, stn2, stn3; - UINT32 a, angle_count(_it_msr->vectorCount1 - 1); // number of directions excluding the RO - + UINT32 a, angle_count(_it_msr->vectorCount2 - 1); // number of directions excluding the RO + UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); + for (a=0; aignore) + { + while (skip < ignored) + { + skip++; + _it_msr++; + if (!_it_msr->ignore) + break; + } + } + stn3 = GetBlkMatrixElemStn2(block, &_it_msr); ComputePrecisionAdjMsrs_A(block, stn1, stn2, stn3, @@ -8955,13 +9030,26 @@ void dna_adjust::UpdateMsrRecords(const UINT32& block) // store adjusted measurements and corrections void dna_adjust::UpdateMsrRecords_D(const UINT32& block, it_vmsr_t& _it_msr, UINT32& msr_row, UINT32& precadjmsr_row) { - UINT32 a, angle_count(_it_msr->vectorCount1 - 1); - + UINT32 a, angle_count(_it_msr->vectorCount2 - 1); + UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); + // move to first direction record which contains the derived angles _it_msr++; for (a=0; aignore) + { + while (skip < ignored) + { + skip++; + _it_msr++; + if (!_it_msr->ignore) + break; + } + } + UpdateMsrRecord(block, _it_msr, msr_row, precadjmsr_row, _it_msr->scale2); _it_msr++; msr_row++; @@ -9182,13 +9270,26 @@ void dna_adjust::ComputeGlobalPelzer() // Compute Pelzer's global reliability void dna_adjust::ComputeGlobalPelzer_D(it_vmsr_t& _it_msr, UINT32& numMsr, double& sum) { - UINT32 a, angle_count(_it_msr->vectorCount1 - 1); + UINT32 a, angle_count(_it_msr->vectorCount2 - 1); + UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); // move to first direction record which contains the derived angles _it_msr++; for (a=0; aignore) + { + while (skip < ignored) + { + skip++; + _it_msr++; + if (!_it_msr->ignore) + break; + } + } + if (_it_msr->PelzerRel > 0. && _it_msr->PelzerRel < UNRELIABLE) { sum += (_it_msr->PelzerRel * _it_msr->PelzerRel - 1.); @@ -9248,13 +9349,26 @@ void dna_adjust::ComputeChiSquare_ABCEHIJKLMPQRSVZ(const it_vmsr_t& _it_msr, UIN void dna_adjust::ComputeChiSquare_D(it_vmsr_t& _it_msr, UINT32& measurement_index, matrix_2d* measMinusComp) { - UINT32 a, angle_count(_it_msr->vectorCount1 - 1); + UINT32 a, angle_count(_it_msr->vectorCount2 - 1); + UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); // move to first direction record which contains the derived angles _it_msr++; for (a=0; aignore) + { + while (skip < ignored) + { + skip++; + _it_msr++; + if (!_it_msr->ignore) + break; + } + } + chiSquared_ += measMinusComp->get(measurement_index, 0) * measMinusComp->get(measurement_index, 0) / _it_msr->scale2; //variance (angle) @@ -10856,23 +10970,62 @@ void dna_adjust::UpdateIgnoredMeasurements_A(pit_vmsr_t _it_msr, bool storeOrigi // Use v_blockStationsMapUnique_ to get the correct block for each // station in the measurement + _it_pair_u32u32_uint32 it_stnmap_range; _it_u32u32_uint32_pair _it_bsmu; // Get estimated station coordinates matrix and index of the // station within the matrix for station 1 - _it_bsmu = v_blockStationsMapUnique_.begin() + (*_it_msr)->station1; + it_stnmap_range = equal_range(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end(), + (*_it_msr)->station1, CompareBlockStationMapUnique_Station()); + if (it_stnmap_range.first == it_stnmap_range.second) + { + //TRACE("%d not found\n", (*_it_msr)->station1); + stringstream ss; + ss << "UpdateIgnoredMeasurements(): Station " << (*_it_msr)->station1 << + " was not found in the station map." << endl; + SignalExceptionAdjustment(ss.str(), 0); + } + + // Get the index of the station in the map + _it_bsmu = it_stnmap_range.first; + matrix_2d* estimatedStations_stn1(&v_estimatedStations_.at(_it_bsmu->second)); UINT32 stn1(GetBlkMatrixElemStn1(_it_bsmu->second, _it_msr)); // Get estimated station coordinates matrix and index of the // station within the matrix for station 2 - _it_bsmu = v_blockStationsMapUnique_.begin() + (*_it_msr)->station2; + it_stnmap_range = equal_range(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end(), + (*_it_msr)->station2, CompareBlockStationMapUnique_Station()); + if (it_stnmap_range.first == it_stnmap_range.second) + { + //TRACE("%d not found\n", (*_it_msr)->station2); + stringstream ss; + ss << "UpdateIgnoredMeasurements(): Station " << (*_it_msr)->station1 << + " was not found in the station map." << endl; + SignalExceptionAdjustment(ss.str(), 0); + } + // Get the index of the station in the map + _it_bsmu = it_stnmap_range.first; + matrix_2d* estimatedStations_stn2(&v_estimatedStations_.at(_it_bsmu->second)); UINT32 stn2(GetBlkMatrixElemStn2(_it_bsmu->second, _it_msr)); // Get estimated station coordinates matrix and index of the // station within the matrix for station 3 - _it_bsmu = v_blockStationsMapUnique_.begin() + (*_it_msr)->station3; + it_stnmap_range = equal_range(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end(), + (*_it_msr)->station3, CompareBlockStationMapUnique_Station()); + if (it_stnmap_range.first == it_stnmap_range.second) + { + //TRACE("%d not found\n", (*_it_msr)->station3); + stringstream ss; + ss << "UpdateIgnoredMeasurements(): Station " << (*_it_msr)->station3 << + " was not found in the station map." << endl; + SignalExceptionAdjustment(ss.str(), 0); + } + + // Get the index of the station in the map + _it_bsmu = it_stnmap_range.first; + matrix_2d* estimatedStations_stn3(&v_estimatedStations_.at(_it_bsmu->second)); UINT32 stn3(GetBlkMatrixElemStn3(_it_bsmu->second, _it_msr)); @@ -11623,17 +11776,44 @@ void dna_adjust::UpdateIgnoredMeasurements_S(pit_vmsr_t _it_msr, bool storeOrigi // Use v_blockStationsMapUnique_ to get the correct block for each // station in the measurement + _it_pair_u32u32_uint32 it_stnmap_range; _it_u32u32_uint32_pair _it_bsmu; // Get estimated station coordinates matrix and index of the // station within the matrix for station 1 - _it_bsmu = v_blockStationsMapUnique_.begin() + (*_it_msr)->station1; + it_stnmap_range = equal_range(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end(), + (*_it_msr)->station1, CompareBlockStationMapUnique_Station()); + if (it_stnmap_range.first == it_stnmap_range.second) + { + //TRACE("%d not found\n", (*_it_msr)->station1); + stringstream ss; + ss << "UpdateIgnoredMeasurements(): Station " << (*_it_msr)->station1 << + " was not found in the station map." << endl; + SignalExceptionAdjustment(ss.str(), 0); + } + + // Get the index of the station in the map + _it_bsmu = it_stnmap_range.first; + matrix_2d* estimatedStations_stn1(&v_estimatedStations_.at(_it_bsmu->second)); UINT32 stn1(GetBlkMatrixElemStn1(_it_bsmu->second, _it_msr)); // Get estimated station coordinates matrix and index of the // station within the matrix for station 2 - _it_bsmu = v_blockStationsMapUnique_.begin() + (*_it_msr)->station2; + it_stnmap_range = equal_range(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end(), + (*_it_msr)->station2, CompareBlockStationMapUnique_Station()); + if (it_stnmap_range.first == it_stnmap_range.second) + { + //TRACE("%d not found\n", (*_it_msr)->station2); + stringstream ss; + ss << "UpdateIgnoredMeasurements(): Station " << (*_it_msr)->station2 << + " was not found in the station map." << endl; + SignalExceptionAdjustment(ss.str(), 0); + } + + // Get the index of the station in the map + _it_bsmu = it_stnmap_range.first; + matrix_2d* estimatedStations_stn2(&v_estimatedStations_.at(_it_bsmu->second)); UINT32 stn2(GetBlkMatrixElemStn2(_it_bsmu->second, _it_msr)); @@ -12083,6 +12263,8 @@ void dna_adjust::PrintIgnoredAdjMeasurements(bool printHeader) if (_it_msr->measAdj == 0. && _it_msr->measCorr == 0. && _it_msr->preAdjCorr == 0. && _it_msr->preAdjMeas == 0.) storeOriginalMeasurement = true; + sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end()); + // Reduce measurements and compute stats for (_it_ign = ignored_msrs.begin(); _it_ign != ignored_msrs.end(); ++_it_ign) { @@ -12154,7 +12336,7 @@ void dna_adjust::PrintIgnoredAdjMeasurements(bool printHeader) PrintCompMeasurements_CELMS(_it_msr, design_row, ignoredMsrs); break; case 'D': // Direction set - PrintCompMeasurements_D(_it_msr, design_row); + PrintCompMeasurements_D(_it_msr, design_row, true); break; case 'H': // Orthometric height case 'R': // Ellipsoidal height @@ -12568,8 +12750,10 @@ void dna_adjust::PrintCompMeasurements_CELMS(it_vmsr_t& _it_msr, UINT32& design_ // The estimation of parameters from direction clusters is handled by reducing the // respective directions to angles. Therefore, the "adjusted measurements" are // the adjusted angles. -void dna_adjust::PrintCompMeasurements_D(it_vmsr_t& _it_msr, UINT32& design_row) +void dna_adjust::PrintCompMeasurements_D(it_vmsr_t& _it_msr, UINT32& design_row, bool printIgnored) { + UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); + // normal format adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; @@ -12581,7 +12765,11 @@ void dna_adjust::PrintCompMeasurements_D(it_vmsr_t& _it_msr, UINT32& design_row) if (_it_msr->ignore) ignoreFlag = "*"; - UINT32 angle_count(_it_msr->vectorCount1 - 1); + UINT32 angle_count; + if (printIgnored) + angle_count = _it_msr->vectorCount1 - 1; + else + angle_count = _it_msr->vectorCount2 - 1; adj_file << setw(PAD3) << left << ignoreFlag << setw(PAD2) << left << angle_count; @@ -12600,6 +12788,20 @@ void dna_adjust::PrintCompMeasurements_D(it_vmsr_t& _it_msr, UINT32& design_row) for (UINT32 a(0); aignore && !printIgnored) + { + while (skip < ignored) + { + skip++; + _it_msr++; + if (!_it_msr->ignore) + break; + } + } + computed = _it_msr->term1 + _it_msr->measCorr; adj_file << left << setw(PAD2) << " "; // measurement type @@ -13329,7 +13531,8 @@ void dna_adjust::PrintAdjMeasurements_D(it_vmsr_t& _it_msr) if (_it_msr->ignore) ignoreFlag = "*"; - UINT32 a, angle_count(_it_msr->vectorCount1 - 1); + UINT32 a, angle_count(_it_msr->vectorCount2 - 1); + UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); adj_file << setw(PAD3) << left << ignoreFlag << setw(PAD2) << left << angle_count; @@ -13349,6 +13552,18 @@ void dna_adjust::PrintAdjMeasurements_D(it_vmsr_t& _it_msr) for (a=0; aignore) + { + while (skip < ignored) + { + skip++; + _it_msr++; + if (!_it_msr->ignore) + break; + } + } + adj_file << left << setw(PAD2) << " "; // measurement type adj_file << left << setw(STATION) << " "; // station1 (Instrument) adj_file << left << setw(STATION) << " "; // station2 (RO) @@ -14244,16 +14459,18 @@ void dna_adjust::LoadNetworkFiles() if (_it_msr->measType == 'D') { - // first direction holds number of target directions plus RO. Since directions - // are reduced to angles, subtract one. + // The first direction holds number of target directions plus RO. But + // since it is possible for target directions to be ignored, take + // the number of non-ignored measurements (vectorCount2) + // Since directions are reduced to angles, subtract one. // Target directions are assigned zero vectorCount1 - if (_it_msr->vectorCount1 > 0) + if (_it_msr->vectorCount2 > 0) { - v_measurementCount_.at(0) += _it_msr->vectorCount1 - 1; + v_measurementCount_.at(0) += _it_msr->vectorCount2 - 1; // The following is needed if the upper triangular variance matrix - // for each GNSS measurement (as required for propagating) - v_measurementVarianceCount_.at(0) += _it_msr->vectorCount1 - 1; + // for each direction set measurement (as required for propagating) + v_measurementVarianceCount_.at(0) += _it_msr->vectorCount2 - 1; } continue; } diff --git a/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp b/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp index 6cfdbc5b..50000bbf 100644 --- a/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp +++ b/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp @@ -762,7 +762,7 @@ class dna_adjust { void PrintCompMeasurementsLinear(const char cardinal, const double& computed, const double& correction, const it_vmsr_t& _it_msr); void PrintCompMeasurements_A(const UINT32& block, it_vmsr_t& _it_msr, UINT32& design_row, printMeasurementsMode printMode); void PrintCompMeasurements_CELMS(it_vmsr_t& _it_msr, UINT32& design_row, printMeasurementsMode printMode); - void PrintCompMeasurements_D(it_vmsr_t& _it_msr, UINT32& design_row); + void PrintCompMeasurements_D(it_vmsr_t& _it_msr, UINT32& design_row, bool printIgnored=false); void PrintCompMeasurements_HR(const UINT32& block, it_vmsr_t& _it_msr, UINT32& design_row, printMeasurementsMode printMode); void PrintCompMeasurements_IJPQ(const UINT32& block, it_vmsr_t& _it_msr, UINT32& design_row, printMeasurementsMode printMode); void PrintCompMeasurements_BKVZ(const UINT32& block, it_vmsr_t& _it_msr, UINT32& design_row, printMeasurementsMode printMode); diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index 35f01659..66082452 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -2800,19 +2800,14 @@ UINT32 dna_import::ParseDNAMSRDirections(string& sBuf, dnaMsrPtr& msr_ptr, bool dirnCountLessIgnored--; if (dirnCountLessIgnored == 0) { - // Is the entire direction set ignored? - // If so, return 0 - if (ignoreMsr) - return 0; - - throw XMLInteropException("There aren't any non-ignored directions in the set.", m_lineNo); + // throw if the entire direction set is not ignored + if (!ignoreMsr) + throw XMLInteropException("There aren't any non-ignored directions in the set.", m_lineNo); } - msr_ptr->SetTotal(dirnCountLessIgnored); - continue; } dirnTmp.SetFirst(msr_ptr->GetFirst()); - dirnTmp.SetIgnore(ignoreMsr); + dirnTmp.SetIgnore(subignoreMsr); g_parsemsr_tally.D++; // Second target station @@ -2836,6 +2831,8 @@ UINT32 dna_import::ParseDNAMSRDirections(string& sBuf, dnaMsrPtr& msr_ptr, bool msr_ptr->AddDirection(((CDnaMeasurement*)&dirnTmp)); } + msr_ptr->SetNonIgnoredDirns(dirnCountLessIgnored); + return dirnCount; } @@ -6562,8 +6559,11 @@ void dna_import::MapMeasurementStationsDir(vector* vDirections, p msrStations.push_back(to_station_index); - (*lMapCount)++; - g_map_tally.D ++; + if (_it_msr->NotIgnored()) + { + (*lMapCount)++; + g_map_tally.D++; + } } // Strip duplicates from msrStations, then increment station count for each of the stations tied to this cluster @@ -6885,8 +6885,9 @@ void dna_import::CompleteASLDirections(_it_vdnamsrptr _it_msr, vectorNotIgnored()) + // is to be included. But stations should only be included if the + // parent direction set measurement is not ignored + if (_it_dir->NotIgnored() && _it_msr->get()->NotIgnored()) currentASL->SetValid(); // Set binary msr index for all stations in this cluster to the first element of the diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index 87b2f38d..7e4f133f 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -150,12 +150,11 @@ void Directions_pimpl::Value(const ::std::string& Value) { _dnaDirection->SetValue(Value); - if (_dnaDirection->NotIgnored()) - { + //if (_dnaDirection->NotIgnored()) + //{ // increment measurement counter *(_pMeasurementCount) += 1; - g_parsemsr_tally.D++; - } + //} } void Directions_pimpl::StdDev(const ::std::string& StdDev) @@ -175,29 +174,38 @@ void Directions_pimpl::post_Directions(const UINT32& total) { if (!_parent_dnaDirectionSet) return; + + // Is the parent ignored? Add it to the ignored set + if (_parent_dnaDirectionSet->GetIgnore()) + { + _parent_dnaDirectionSet->AddDirection(_dnaDirection.get()); + return; + } + // Is the parent not ignored, and the direction not ignored? Add it to the set if (_dnaDirection->NotIgnored()) - _parent_dnaDirectionSet->AddDirection(_dnaDirection.get()); - else { - UINT32 t = _parent_dnaDirectionSet->GetTotal() - 1; - _parent_dnaDirectionSet->SetTotal(t); + _parent_dnaDirectionSet->AddDirection(_dnaDirection.get()); + return; + } - if (t == 0) - { - // Is the entire direction set ignored? - if (_parent_dnaDirectionSet->GetIgnore()) - return; + // At this point, the parent is not ignored, but a sub direction is. + // Test if this ignored sub direction will lead to a false direction + UINT32 t = _parent_dnaDirectionSet->GetTotal() - 1; - stringstream ss, ss2; - ss << - "...', total of " << total << " element(s)" << endl << - " - found 0 , or there aren't any non-ignored directions in the set. '"; - ss2 << " ~ " << total << ""; - throw ::xsd::cxx::parser::expected_element< char >( - ss.str(), ss2.str()); - } + if (t == 0) + { + stringstream ss, ss2; + ss << + "...', total of " << total << " element(s)" << endl << + " - found 0 , or there aren't any non-ignored directions in the set. '"; + ss2 << " ~ " << total << ""; + throw ::xsd::cxx::parser::expected_element< char >( + ss.str(), ss2.str()); } + + _parent_dnaDirectionSet->AddDirection(_dnaDirection.get()); + } // DnaMeasurement_pimpl @@ -232,6 +240,7 @@ void DnaMeasurement_pimpl::Type(const ::std::string& Type) _dnaCurrentMsr.reset(new CDnaDistance); break; case 'D': // Direction set + g_parsemsr_tally.D++; _dnaCurrentMsr.reset(new CDnaDirectionSet(++(*(_pclusterID)))); break; case 'E': // Ellipsoid arc @@ -707,7 +716,7 @@ void DnaMeasurement_pimpl::post_DnaMeasurement() UINT32 total, found; // Is the direction set empty and ignored? - // If so, do nothing. + // If so, do nothing (an invalid measurement). switch (_dnaCurrentMsr->GetTypeC()) { case 'D': @@ -738,7 +747,30 @@ void DnaMeasurement_pimpl::post_DnaMeasurement() ss.str(), ss2.str()); } - // Okay, capture all the elements for this baseline (cluster) + found = 0; + + // Test for non-ignored measurements + for_each(_dnaCurrentMsr->GetDirections_ptr()->begin(), + _dnaCurrentMsr->GetDirections_ptr()->end(), + [this, &found](CDnaDirection& d) { + if (d.NotIgnored()) + found++; + }); + + if (found == 0 && _dnaCurrentMsr->NotIgnored()) + { + stringstream ss, ss2; + ss << + "...', total of " << total << " element(s)" << endl << + " - There aren't any non-ignored directions in the set. "; + ss2 << " ~ " << total << ""; + throw ::xsd::cxx::parser::expected_element< char >( + ss.str(), ss2.str()); + } + + _dnaCurrentMsr->SetNonIgnoredDirns(found); + + // Okay, capture all the elements for this direction set for_each(_dnaCurrentMsr->GetDirections_ptr()->begin(), _dnaCurrentMsr->GetDirections_ptr()->end(), [this](CDnaDirection& d) { diff --git a/dynadjust/include/config/dnatypes.hpp b/dynadjust/include/config/dnatypes.hpp index 4b602bc6..e69127c9 100644 --- a/dynadjust/include/config/dnatypes.hpp +++ b/dynadjust/include/config/dnatypes.hpp @@ -290,6 +290,8 @@ typedef v_u32u32_uint32_pair::iterator _it_u32u32_uint32_pair; typedef v_uint32_u32u32_pair::iterator _it_uint32_u32u32_pair; typedef v_uint32_uint32_pair::iterator _it_uint32_uint32_pair; +typedef pair<_it_u32u32_uint32_pair, _it_u32u32_uint32_pair> _it_pair_u32u32_uint32; + typedef vector vv_string_string_pair; typedef pair _it_pair_vUINT32_const; diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index bfda3567..2336689c 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -573,6 +573,23 @@ class CompareBlockStationMapUnique_byBlock } }; +// used to sort nearby stations +template +class CompareBlockStationMapUnique_Station { +public: + bool operator()(const T& left, const T& right) { + return left.first.first < right.first.first; + } + + bool operator()(const U& left, const T& right) { + return left < right.first.first; + } + + bool operator()(const T& left, const U& right) { + return left.first.first < right; + } +}; + // S = station_t, U = u32u32_double_pair template diff --git a/dynadjust/include/functions/dnatemplatematrixfuncs.hpp b/dynadjust/include/functions/dnatemplatematrixfuncs.hpp index 4d8ed571..e4948a15 100644 --- a/dynadjust/include/functions/dnatemplatematrixfuncs.hpp +++ b/dynadjust/include/functions/dnatemplatematrixfuncs.hpp @@ -57,7 +57,8 @@ template void GetDirectionsVarianceMatrix(msr_t_Iterator begin, matrix_2d* vmat) { msr_t_Iterator bmsRecord(begin); - UINT32 a, angle_count(bmsRecord->vectorCount1 - 1); // number of directions excluding the RO + UINT32 a, angle_count(bmsRecord->vectorCount2 - 1); // number of directions excluding the RO + UINT32 skip(0), ignored(bmsRecord->vectorCount1 - bmsRecord->vectorCount2); vmat->zero(); vmat->redim(angle_count, angle_count); @@ -66,6 +67,18 @@ void GetDirectionsVarianceMatrix(msr_t_Iterator begin, matrix_2d* vmat) for (a=0; aignore) + { + while (skip < ignored) + { + skip++; + bmsRecord++; + if (!bmsRecord->ignore) + break; + } + } + vmat->put(a, a, bmsRecord->scale2); // derived angle variance if (a+1 < angle_count) vmat->put(a, a+1, bmsRecord->scale3); // derived angle covariance @@ -122,7 +135,8 @@ template void SetDirectionsVarianceMatrix(msr_t_Iterator begin, const matrix_2d& vmat) { msr_t_Iterator bmsRecord(begin); - UINT32 a, angle_count(bmsRecord->vectorCount1 - 1); // number of directions excluding the RO + UINT32 a, angle_count(bmsRecord->vectorCount2 - 1); // number of directions excluding the RO + UINT32 skip(0), ignored(bmsRecord->vectorCount1 - bmsRecord->vectorCount2); bmsRecord->scale2 = 0.; // variance (angle) bmsRecord->scale3 = 0.; // covariance (angle) @@ -131,6 +145,18 @@ void SetDirectionsVarianceMatrix(msr_t_Iterator begin, const matrix_2d& vmat) for (a=0; aignore) + { + while (skip < ignored) + { + skip++; + bmsRecord++; + if (!bmsRecord->ignore) + break; + } + } + bmsRecord->scale2 = vmat.get(a, a); // derived angle variance if (a+1 < angle_count) bmsRecord->scale3 = vmat.get(a, a+1); // derived angle covariance diff --git a/dynadjust/include/io/dnaioseg.cpp b/dynadjust/include/io/dnaioseg.cpp index 97371017..7ad8fc7a 100644 --- a/dynadjust/include/io/dnaioseg.cpp +++ b/dynadjust/include/io/dnaioseg.cpp @@ -364,7 +364,7 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, v_measurementCount->at(b) += bmsBinaryRecords->at(m).vectorCount1 * 3; break; case 'D': // Direction set - v_measurementCount->at(b) += bmsBinaryRecords->at(m).vectorCount1 - 1; + v_measurementCount->at(b) += bmsBinaryRecords->at(m).vectorCount2 - 1; break; case 'A': // Horizontal angle case 'B': // Geodetic azimuth diff --git a/dynadjust/include/measurement_types/dnadirection.cpp b/dynadjust/include/measurement_types/dnadirection.cpp index fc940bdd..5055ee8e 100644 --- a/dynadjust/include/measurement_types/dnadirection.cpp +++ b/dynadjust/include/measurement_types/dnadirection.cpp @@ -629,7 +629,6 @@ void CDnaDirection::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrInde measRecord.clusterID = m_lsetID; // number of Directions in the parent cluster including the first - // measRecord.vectorCount1 = m_lRecordedTotal + 1; measRecord.vectorCount1 = m_lRecordedTotal; measRecord.measurementStations = m_MSmeasurementStations; measRecord.fileOrder = ((*msrIndex)++); diff --git a/dynadjust/include/measurement_types/dnadirectionset.cpp b/dynadjust/include/measurement_types/dnadirectionset.cpp index 5b0d08b6..ffdd90b1 100644 --- a/dynadjust/include/measurement_types/dnadirectionset.cpp +++ b/dynadjust/include/measurement_types/dnadirectionset.cpp @@ -32,6 +32,7 @@ CDnaDirectionSet::CDnaDirectionSet(void) , m_drValue(0.) , m_dStdDev(0.) , m_lRecordedTotal(0) + , m_lNonIgnoredDirns(0) , m_lsetID(0) { m_strType = "D"; @@ -51,6 +52,7 @@ CDnaDirectionSet::CDnaDirectionSet(const UINT32 lsetID) , m_drValue(0.) , m_dStdDev(0.) , m_lRecordedTotal(0) + , m_lNonIgnoredDirns(0) , m_lsetID(lsetID) { m_strType = "D"; @@ -70,6 +72,7 @@ CDnaDirectionSet::CDnaDirectionSet(CDnaDirectionSet&& d) m_drValue = d.m_drValue; m_dStdDev = d.m_dStdDev; m_lRecordedTotal = d.m_lRecordedTotal; + m_lNonIgnoredDirns = d.m_lNonIgnoredDirns; m_MSmeasurementStations = d.m_MSmeasurementStations; m_lsetID = d.m_lsetID; @@ -94,6 +97,7 @@ CDnaDirectionSet& CDnaDirectionSet::operator= (CDnaDirectionSet&& rhs) m_drValue = rhs.m_drValue; m_dStdDev = rhs.m_dStdDev; m_lRecordedTotal = rhs.m_lRecordedTotal; + m_lNonIgnoredDirns = rhs.m_lNonIgnoredDirns; m_lsetID = rhs.m_lsetID; m_MSmeasurementStations = rhs.m_MSmeasurementStations; @@ -118,6 +122,7 @@ bool CDnaDirectionSet::operator== (const CDnaDirectionSet& rhs) const m_drValue == rhs.m_drValue && m_dStdDev == rhs.m_dStdDev && m_lRecordedTotal == rhs.m_lRecordedTotal && + m_lNonIgnoredDirns == rhs.m_lNonIgnoredDirns && m_vTargetDirections == rhs.m_vTargetDirections && m_epoch == rhs.m_epoch ); @@ -221,9 +226,9 @@ void CDnaDirectionSet::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string { *dynaml_stream << " " << endl; } else @@ -382,7 +387,10 @@ UINT32 CDnaDirectionSet::SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& i // it_msr holds the full number of measurement blocks, which is // the number of directions in the vector plus one for the RO m_lRecordedTotal = it_msr->vectorCount1 - 1; - + // Calculate afresh the number of non-ignored directions + if (it_msr->vectorCount2 > 0) + m_lNonIgnoredDirns = it_msr->vectorCount2 - 1; + m_lsetID = it_msr->clusterID; m_epoch = it_msr->epoch; @@ -420,6 +428,9 @@ void CDnaDirectionSet::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrI // number of Directions in the parent cluster including the first measRecord.vectorCount1 = static_cast(m_vTargetDirections.size()) + 1; + // number of non-ignored directions in the cluster including the first + if (!m_bIgnore && m_lNonIgnoredDirns > 0) + measRecord.vectorCount2 = m_lNonIgnoredDirns + 1; measRecord.measAdj = m_measAdj; measRecord.measCorr = m_measCorr; @@ -428,7 +439,7 @@ void CDnaDirectionSet::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrI measRecord.preAdjCorr = m_preAdjCorr; measRecord.term1 = m_drValue; measRecord.term2 = m_dStdDev * m_dStdDev; // convert to variance - + measRecord.clusterID = m_lsetID; measRecord.measurementStations = m_MSmeasurementStations; measRecord.fileOrder = ((*msrIndex)++); diff --git a/dynadjust/include/measurement_types/dnadirectionset.hpp b/dynadjust/include/measurement_types/dnadirectionset.hpp index 8f47bdd6..5f8b8c1d 100644 --- a/dynadjust/include/measurement_types/dnadirectionset.hpp +++ b/dynadjust/include/measurement_types/dnadirectionset.hpp @@ -84,6 +84,7 @@ class CDnaDirectionSet : public CDnaMeasurement inline void SetClusterID(const UINT32& id) { m_lsetID = id; } inline void SetTarget(const string& str) { m_strTarget = trimstr(str); } inline void SetTotal(const UINT32& l) { m_lRecordedTotal = l; } + inline void SetNonIgnoredDirns(const UINT32& n) { m_lNonIgnoredDirns = n; } void SetTotal(const string& str); void SetValue(const string& str); @@ -110,6 +111,7 @@ class CDnaDirectionSet : public CDnaMeasurement double m_drValue; double m_dStdDev; UINT32 m_lRecordedTotal; + UINT32 m_lNonIgnoredDirns; vector m_vTargetDirections; UINT32 m_lsetID; diff --git a/dynadjust/include/measurement_types/dnameasurement.hpp b/dynadjust/include/measurement_types/dnameasurement.hpp index 5cbe76b1..d5d8dafa 100644 --- a/dynadjust/include/measurement_types/dnameasurement.hpp +++ b/dynadjust/include/measurement_types/dnameasurement.hpp @@ -161,6 +161,7 @@ typedef struct msr_t { UINT32 station3; // record file. UINT32 vectorCount1; // number of directions, GpsPoints or GpsBaselines UINT32 vectorCount2; // number of covariances for GpsPoint or GpsBaseline + // number of non-ignored directions UINT32 clusterID; // cluster ID (which cluster this measurement belongs to) UINT32 fileOrder; // original file order double term1; // measurement, X, Y, Z, dX, dY, dZ value @@ -168,13 +169,13 @@ typedef struct msr_t { double term2; // measurement, XX, XY or XZ variance // direction variance double term3; // instrument height, YY or YZ variance - // derived angle double term4; // target height or ZZ variance - // derived angle variance double scale1; // phi, n or X scalar - // derived angle covariance + // derived angle corrected for deflection of the vertical double scale2; // lambda, e or Y scalar + // derived angle variance double scale3; // height, up or Z scalar + // derived angle covariance double scale4; // matrix scalar double measAdj; double measCorr; @@ -409,6 +410,7 @@ class CDnaMeasurement virtual void ResizeGpsCovariancesCount(const UINT32&) {} virtual void SetRecordedTotal(const UINT32&) {} + virtual void SetNonIgnoredDirns(const UINT32&) {} virtual void SetClusterID(const UINT32&) {} virtual void SetCoordType(const string&) {} virtual void SetHscale(const string&) {} diff --git a/dynadjust/include/measurement_types/dnamsrtally.cpp b/dynadjust/include/measurement_types/dnamsrtally.cpp index d44bd54b..c9e73ab7 100644 --- a/dynadjust/include/measurement_types/dnamsrtally.cpp +++ b/dynadjust/include/measurement_types/dnamsrtally.cpp @@ -599,7 +599,7 @@ void MsrTally::CreateTally(const vmsr_t& vMeasurements, const vUINT32& CML) break; case 'D': // Direction set if (vMeasurements.at(*_it_msr).measStart == xMeas) - D += vMeasurements.at(*_it_msr).vectorCount1 - 1; + D += vMeasurements.at(*_it_msr).vectorCount2 - 1; break; case 'E': // Ellipsoid arc E++; @@ -688,7 +688,7 @@ UINT32 MsrTally::CreateTally(const vmsr_t& vMeasurements, bool countValidOnly) break; case 'D': // Direction set if (_it_msr->measStart == xMeas) - D += _it_msr->vectorCount1 - 1; + D += _it_msr->vectorCount2 - 1; break; case 'E': // Ellipsoid arc E++; From 81e4399cef273df1d37174358995bace8470e1fe Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 11 Sep 2024 11:30:07 +1000 Subject: [PATCH 031/102] Improve commentary on interation threshold --- resources/DynAdjust Users Guide.pdf | Bin 5383168 -> 5383239 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/DynAdjust Users Guide.pdf b/resources/DynAdjust Users Guide.pdf index 25150884da4f1276bf128849f1cdb6a4814a24c0..0f5535403e3300211462cbfa8a8a6c2dccc4bb3f 100644 GIT binary patch delta 47256 zcmZU)V{l~u7xg=_ZB0C}ZF6E96Wd0|wr$(CZF6EL6Fa&6`#&$9d+WaVRCS%IU48c2 zYwd5J>TbWWG0;&Ub=SW@*b-4dsQ}4JvhstB@ZBfsFKN=Ok%_-7I6*hT_xtiVh77Gu zD$Q4Yq{0BPn@QE1Lm+Ijx+m*5uT-d*M21s`>sS`4esQ?O%}^%_lF5BlfAEOru(ik% zh2NL@uvpLPd}&-rnnc5z#rBk!la!F+wl`zVFtS><8S_yW*}1_H9`ij?u>o7^&~9v* zth4dl*KJ-)&fHw;*o9alngQ=B8i`-Z`^A{c7FZu5>T5}(z43;}+)(Z=PU*bzdZvd~I)8Z8U~v&Q zxp*%Xly-W1xg==#gzS!bcW{5ibnS27E;dj`x`f$XG|-lzFoC-qwlh_8lROyz(2Yy^ zN3MT!f1W)N2W2{mF};$chs`v#hIBj|k$Ah0)~HA6f(pX%KP978Wt}z{k-P6{yerdT z8jj?%lo#h1&x%-Vgf~PM1OLD&Sp8PPocnmMX=3(=4@HD3N`AV!-fVTmuL|Hyi~aNc zZO9a18^N2$RK6bp8EF!SRaCY>G|hr~B2{M|K)81)rWdV@%ii14jU&HM08i*uv-{YV zV<$E^Du9(+kO^Sr8Hoslk(J6(g~DD5$IV(`P1=e|v}hxwFe$r~{vH84E^yYt-4a2@ ztvIsx!ew^bguo{`#P(Bi_V|l8*m-gbPVX4qLMF$2!Ti>St@tkzjC&~~2_n73M8U04 zfD|>gorj+`D?OldvlxP)YThOll7;OJwim>4pNT>uZwzq9S|+JVHjFYZl@m9iWql_v zC5J@Tqt|?d@#E@Rr?N(Qp}tSkYDFVMYvY@?tHJfJT%#HzuV=))`;4kS9KBUcOQMy% ze?cpG7^e~iwo^jU(9=BR7d@lK&y40kD&enI$c*3w^HH*hJzjxKD-bnPIf5GJ)xzL$ zNLjDGycWQ)ZRroC8?hUQV&<-P?11o}>Ub2eM_N19R)h!BXNb-l_|76yY|v&jnL-pf zZC2CiC_FJ+26S=CfT1QPEnYh)$OU9bNO`+r5LR4iQzXsE6&^(=I7KH%dWcP`Qu(EL zJrAMn*=qL+Qn4aqEz>}fl@V+D!m_8c75e!c%5Fe}7GB+n&%+0*kgejRdQ~+>%=sRS zJ85fCP*w?8hjM75sM4`~y-hM&C@}5Z{m*t|1iKEoe8pJ4H4Xr%26K&zbzjDu&DpMDHzk|q!yV{k>?npb z38{k@fuq+FV;df!lp2s5yq#+fV+zX#B_85|77A%z#lv}ZGJm)50SU`L0#XhUb;4OM z1BG8mi3|fj6Nwqo0)O#`{^AD#0ty5S2sjW3Ado>ma1Pur}5DXxgK(K&d1Hl1;3j_}cJ`e&RKYHxM2myg>MX{MWZY>o0ym z{~!>~R6{HgYCyJZYEcVD$n!moWg^-}dO|Q+&$02r+AY49ArH$zqF5G$ZgI`8l05jO zrp;ddXK7)Gqk*4AYJ^^}LGD7eKXt+P18ouUIy~MZGIjyp?vJmlI@W)rVYP-bk&rTZ ziIcE0X^VqO#*YVm?{mv6uUoS2CDjHCFYUENeU|YpJpfn|n|t+%M|!0{H#_Mj3%i$S zn%o!{&(3@)krs?;p1*mX2Nl@^^<0}b$GG{!xgHGonA|MtZS5Zx_usJk!pQCFhpEC!Z|!-7J_V;<)lz4GPiFrO5hj+M_)tG za?CR2Yym&@KCPD7N4gpjj-+_E=Kx>7IlMHU=&FVzz3+=0f9?Ug*FEolws;z;bB$Ae zlR|X!e|86yp9`oX!%&3(eVv`B_D5J5lKE)EaFuk#M@TJ?P(S-4Z>%FUD>{X6nG$ zzyP@GF|Ji}B=NG9fNlW8v2}QG+tRd5x2BeiAIZ41%UJZ7(-CNT)N@U--Vb)vVmwVW z$ydl3^D5}l8;3Ze;Q`IVpZFKwi)9b2LOE)Z45L(vzI#5|!<=mT+e3SjH3We)awoQv zdbBJpM>~53-S0>=Nayzz!}FW2F{{*o0kB95n18;ip@!;`_TzmP;Zm8KH^<8|n-@_X z#CH`DO=%4C_6=FT{#rmHHqn0<%I(*roeUHL#6Ji7HYcDxIPnMz5{}vbuIN3OQJS1H zqmo*gNv?{vx@F`~Zq~2ow(>$PZLc z`9Jki;^kRTm22X^C6<%6@5x3ke%Nuz!&!2T!cCE$KY#uW^(2v0L+@AU9eXe6(He(& zY$qUAKr(JSTHJLoD>qq6j4I;&<~yfuFw%f3aWVc*qM!b(e-6|m3%WPJ>Y}*onF9(P z;0qM`6ezUR<9|Zq06gOpInhdfv*2ut{L|)@fT&@ZGD34N#Ju|*3W*nB+EW{I;z@M$ z1@Jw+4?5hd8PRaj|F;UuaKlfcJBe41()8B)>nMI#3L&wAJ$?t*O7t9$hdwYm)rX>gw_=dNA(^-S9Ne@uF70>wNTF1A%9nCHcdM7$n2>Hd)hb_hPp38t z!1wy1u+uK4LVq#@Vf6(8;?FoClGQ+GwmO^Tu&!m1$y-z=+!o$SBIDX=hcT`B36vn z`IFoL0Dq(=D#+_Uvko5LH7CkHxYl8&z~OxYd%OH^c>kqC^?$v2UFpO*ub6#Le0wJ{ z4MZ3e9-(>YJF3%g#q+e1g17s_x3<0VT+=qo(Epa4I=SqzyI>hP;xIC><)64_+yU3) zhhNY!-+L>?J@CGf@}82M8H`@mIRyBG>jP)_0UW~+a14LW|2KwP2jK$x%R=j_G5MkM~E6f>)2%~w(kFCBz}yE;P5BBg8sLXgy|!a zj03jYRD8p?voB{K|GxU7#lw-f*P(m>b1(zUf&G6uI05DW5}1Qj$M#TBW6)D1b~Tpx zXL5VsLh=VLBxLL{`^f13EhG@ONy(p?^%=c3SA_g0?iY5%pR0|GJ zmSEs!v@x`m2x~zevxlquuPhR)K`aA}ehPcW?d0IoeY((RuJ`2lq{N4LwML$tUxRV1 zhC_Y;PUw?JUP)N2ZaxEebBDm2BLW5-^bUA)%>N5%2ruwsaHPrDl~Mn+pBwUVfP_O9 z3tLX1elV;epV8aW?GmCp;Cu~URdW++`WzM)qUU3&mMaY1l1js>?z|`3usTjzJIw>7 zfGUV-bN}M1rEfp@(nBrjcZtl=JMNFx`wSCNTOE7)%df zxWFHPLlp%MHQ@ArLtX0fBVeBu@_p4vuk`KBnnVnBG#~|dU>4JoF0rr&ie`Z083O&f z(4{pVehl=hIihi!*xY}97063RRZLUNbX(59x)ee1ap6qyyyIAJMlQ-n5lcEGxdr2y zk;1^<9=(XnDHSD$MhBRh{s4Uk2u&zi;Ei7u+x z`|r_}9k@9+Exa@LlE~6dF0*;p36uJ6sq2%1vH*SSMMD%{@gdg2-q^uc_pr2*A+i$T z?i=bD{`X53AH8=wb7K9j_v_4?opYJCzS81<1w^!4>zATCjm1^!juuqvuHfcW`S66d zz99b{F$~AbdDV5TKYrBZ0(6TKy#pBO1!Yavdj93=gN?%_1bcPgi|(}gSE)H#5&@kA zV2uM#v*LeN!?8Q!l58Ns_gCA=>}!^`1)sTu7B;{hWLR_muSx6zuAU0sY=MhcJy%st z_3m!ji#OXLBQEC`$E57b@E!{qU;ofd56J9%dpoV1v3Jn_*1`)=W&CTKId* zcBG=iH>A%th;h}JdZ`b{L0Yh5>QW~7Of?pWmg2mVaL~V2Kj%~wU?Ty)7m8|0d*i;M zY?9&W$Fk$gI@Z|t(^4G<3TyDI(6ldI9f=J0k*xwie-@GLN zX!sb`s=1^c}jmxs#fOk9D7o%o&-PBoM#*-L*5BUuAh>7V==`%$3`#M7@Rupultd z*k_=w+d7Ht&CUCFqW|%@hVXk^i{W(nx$^rj&q|aD*-RorELWSUC$zqLD8R{#pE*16 zCA!Br_17Xs{@>tk)6(||?oA!SUbm@5rd=tY(+)o8hMQ(@3iD_BQyN^8Vek zaJrdFG;PjGAD_y*cCmd&}BdTV*NmCW4b z9X}LJP=ljPo2XM9(kZ7}%0W$(n+0msW0dlJDakYlR`P0nNhFcxVJ-Y+F`9>h*UHG$B#m4PGiP(rj0+I6qDP9TL)%K zESNqjbug|C}W!G$6Iyymp$vtesNU6)g)KtLrqK0|t zf|_Yqhh%xhso1usf}7vYZ6l2`m60HnlK+A8c;xans$}z|S(@6Jy%XKNqp4HRrj5tp zWx=+-X891%^EPcvb<^Sybi&$*k*}CDQwIQCQQU88^PW4A0`PInAR_Cemr9toRZO07 z!6{kOP1O%jG;U~3tN-<=cE`X5Sjt-a8*Lf}|D;n9b6-iOi{45V_$XuHb-qhwVXZc+ zE}ofT+-5)6CVlC`%L}P%PhXago%LzPb9*O&h~84Y>H&9gQB@4@Epi{ zepU{P<>9_6LHY zEC#~EFbu~dB&gCzTThgo@_2ZS$iAW*dI@zkbfJ_f63}CJZq|+PTDfBdo$)I|_=^Hs z($gW-fGxTPBkhKKXtSY5HKcM-vIGx&1k!7a1!|vZF6>mnCrMrLXzMo`uXJ{4sw{&Y zc<88_og7`cHi0UAyt!xI@Pmb9-&hf)FFPKG;+|>V>->DZ$LEWqQf#-g-a7xS-h9bn!14E%%~l^K?Ik*4y|gwYXew#zMyZ_hEwcvI8X5p zVV%blI3|m(A;-cA*DJEA3%gmfuLQHrB^Gs51D+UEa?@hAL^VYv2e}$3+hcl*al{v!uK(!kN8OrrF}9C_c^PPY+b%>qiOqXa8lC6>MOcdkL{pg>M^Vi z9Sn_M27mP<`JWq%%ZOAV#tycvOySAYg#zf-!V31p2~I~FZ`}t}vkw@q$yrxwc=xbC z8BKOtWv6s)5B*XF%N6*H8v8JRf-gx#FM(8Y;MM6a-V!13i>P0!Aeg#r4;k*KI%y8x zP7e(aIop+TRg^5uw*T`mXwTxU$DR>`<8>iAcz5}eGJV%K{`CzKNk^OwYhr8cjjmq(bW;<*8E4bubW8!_8xuP`%|P~55VVpIMq(o8w=7G1$}S({ZlvL z%_9H0f%RV?YrB{J_UGhg^D~m-b@TJTMb#22FQ4zcyS2p@4hq1j=Jyvd73$5+j|2~S z=u(06YXm`za&_jq?lryKwol_X($<+em*Z)qG6vp8t4w`R48jmO^#&3BrxKgGLi>#; zU5kvJ1+H|rg<^=miMDU=fZlJYt$)NSzNlEHPUw8G-JLcuCe>cEPtmNE!D$5lDyoR3ezDT7PW|T=yTp zyf&0ISGSzY{&bc&88YOF;#0}H)upbFbB#7|wMDwV(^r( z^We*G$;l20Bl3~&PbR=xLP$M*aFr8k!vAaGP!f0Ze(DZYt;Om!5?sd5&k;5ZoFjyV z!I$iI)jl4e>qU|=U{GDX2`Smlz5CE%glZetDd4*CbF;%Uuu;DUf-lFyJ?qs2eGoT* zu2LUrlVxiGmGUSQ@q9ebTU2vj71sq@I|z>5S{rGK3)lA5i&kLbV=QW}(mSbW=-t2Q zK3F%VSeJgMCo+OmAY88(E~1uj^fp1xn+BtxD{BS-rrFF$@)}T&c$6s-_sKb=M5Qn$ zich8sA=1{kwHw<2tKiIsZxi}c?ynH56&ud9#?j7uVSKWWg#hDF*=>`=t3NF@Sn~AI zSs72i^=@;iY;<5HPNlzRa&{#owqny%AM8R-2F9UrhJO?|sLI>a{+eI80OOC!;!~)r zKm1aFNOKlh|F{d^2T+*^qyk@2CeYw}6E5t=>r^7?D*O%>NdmgKtMq1zgAlZIj91t- zrLABCJ`oEt{uT&*OiX@By2~EyXz>!iUgP?(QTvEE7@M=1T~aioQ!#20T8ULy>|_41 zEl*_GjS`f%dMkkp*xT?sWJL)~qeQxB=Zq9U?~0$#!27lI9iNBaO8ORqR~rfX@_^V| z`^k!t?8ey@zdd2Nzy9K-2i?|9P%FlL)O*DBfhCi2046DOmR!`HN&8U|<`?F>?}C@0 zJ31ppwjBavT#=C!N5<5rz3dD}!vRny-goM7jTK&?Hz*AN ztt9H@dGHLy1?dzam(|2ydj1*k_*G;#MA}^y86m>Y~;^!lU=PfD-+$z>vKed2O zgJ*;+>JLgS$EX{q_r1^kxa&|+*XKe&J<|XYDgH_1Z}IwE)9aX7ZCCC`(qzss4(&|8 zdsy)km-P+O+s2n=I&mey#tw;;IP}U|DEj_pEiQbT@L!L@*B+xb@GIpDRt&FBNBC4L zVnmvWV4gzeJ>RnNS@iz-Dez%LLR_%lHm7QSOH8GxU2+Y^%jlF6d%Oz2j4=EFqw~DW z@N&C^Tv3J+$ZaNJzQTK~VglRZlu@Y7 z!^3N_`}6lm96?la$2vi1Xb#8!x;x;aP(1$;qz4kD9;ujH6Pd5hnzO-s;y3BRWaO^E z{uA{)wI-8uoLii~jM+LAv~aBeq%2G5st+9Y#ok+wA1E554=I=I)yA=<{}v>#7w1aZG>nd7Rjox8S9=betRUWN8Yzm6L|(fjd4T40^xA;ycfO4rNO zaYPDte0s(}&t>l@`P5BO&&|?P$YYNiV$)Ket`0(!q4_Ol_Csr5L-+V zQsF-TRk=1R9!ZK~h~m%}E_<>*w%@1g31aXjY_w1q17&+Aiyde|xLmNVmIb~-i&2U^ zOtr*(F$@!xBR0#XosQ1>P6Lf6=~;+AM6H=#rrHP5j^KFiQ7R>v_kQ(!v*Ta|3IUyd z6&{GnG69Kp!DQxW8)pg**gxIZbM=H)zl#d?*GlP8lF-;mp(YG|mX$i6azB6xcsH_e zvB9NtXI*}CY)G~^{3EV#^&o^lwoEP^>O(^BC06V^7*V6qL=9yfCROuM@RIA}!aY7u z__%DL^Wm$X9g!FrxMTt8#ett^%&(y&BTa!PD!dp`DeYg*WEBSrfVoLx=2=$?)Eyg4 zuHqrii%>X~UCxsP2a%u)N_dY3lwNo?IQ?n)=^$WVCB;0pu+HS?WTij-iI@W`fyEL==6(eR+6ANKUb;k=A-C5 zb${RVYaDiX8{WCnkhDj#(9adD>-LFlRqv7{LW$3 z@&-h|1Zuh!{PU;yCImowWq3> zZ-(d$kLPw0gWM+m>lz*BFC!d}RMA2u`>Hvh1&EXVUytT3mvZB>HR z3$bzSC2E$%n3lnfMQTe43p@(8oVos*pgr(H0AX)`vcVRX6hd2jYxF&2Y{D8Rtojrh zw^*?3mJ(cP_S*KeLvJmGK~NC#gvD`CUN^h7T#uKcw(=Ng81TrJi>amuGhb^}uHLMp zJ3;ML4Y%DHdrXE}OIcRhvIV2-l9x~^@RzQsKa9MIHpyn#=wJ8is`=Uzi;Pn|wh<_6 zfJfF(?~9L&#r~6PN=?gAd2-&XxxRgf7}nuwj>4DlH160?78p z43&-e?;bMcxpu0JV4T_(bi3Z1gF%EU zcW0FoHiEZwi2K$UFu>aZv8vE4`pUiDBX9Qi!}u7`u@R-(g5cblCEnKV1&B@O5WvA` z#528I&l;^9?HchxN$B!PObUoam@q*>9h1jB9K&^OxHHGVdQWicV96M)Dh#*&q2d&i z!RliQtvmX{S8h{hy*@p0La>-}MKr|qo&L1`Eq8*o^Gx^o46o*x5lbhc?*S6hlSEd< z7Tf$Ic9vs}>b22Xp$&wG65zR>zW@y~8%ghOJ*i&~*={d~A%*+|eR1j6IhtUui zKQ|B&Rioxk8$rUEPq+NpION6iIcd^KZCUkhBy6#HJYBKX5cQf00H`>q(n^07MGVKP zU)v;9Fc^tBdv7xvC9HjLvo;DWkN47V3)n|xo20zRBj|(TGnG=`9mq_b3DEV%|M_ug z@81H=`(+gkH9;_jY+3PREWVs(Z{O1mUjkdBxH@l<1>*==YN9HqrNC-le8iCX`vxX^ z2fE4&e~Vs48O7#H&#oxJM6LW#Ott-6MD3xX1obr+_DjJ2Lmu;bsZH#fYRN`fN{`BZ zsxw9NQcoiPc9Zdo)XK3)T2Jc4?>>$x{Yz1mJyjjQnjm-r!}4Ti1;ZpY=7}EGi4guv z1piHl_*)sa&>Q4o`kmnmZeS|tK6QRm5WO|=Trg1ygf$gJ9Fq#5W8<_Wj{0@2pKk}{ z=5qh#DONn;x7S9>6uO5h{6cgy(K2v75#Qu@e{pk`zHJg6jdCJek)YIWpj~)!1lbst5>zV` zCHg{vkswMp&p8<2fjLYvj@GzoNU2;nJZ?icKS|C8Gmb**3f6>m9#@ev)jXPBB@UFg zPbt!%Y#M6=x`44}ZifsukO@0s$pCr2D2EBQ5{*L{{3Kj0lEk>YkJq@oiMl}YU=F)R z>CBe0;Hjc64!+y4h&peaQ;fp~rJ5*O6XBCApY|USrH}$3gs50p{Pc$ixrx8R{zf2N z6N4D*(1@_^M8*<`JGMm`0FL=W_8i``wI2=l;g`*jLQzBzvhF#^CwB(L!-a(@SiFbj z@kSSpRP35X6(6GM``i)D)Wep_DmLgED z3@?`|ye*rXXjKMeX@-i`!VIEhs{I8swTJ`i1GLD)4J;farAYdmp~+D2t6izWgW)W1 zcDlO*1k6oky`1&rDgr)+?gIp9-g_*uf+td;2;W8}eAd;2We~hR6dO+?y`Evepf7#} zVeF6s8k8MLUn81+8UB5ReM0N=c0mzJzVW`F{s~xNPb{op&(+-l|Zi%*Wtf|F{7 z+4a?0&%=1~0t{{t~37 zWq9G2F>F)II8QZcZ`j+GONye6!-@s?lQY0Uk)YT$CCNxVnrI%}JzyQ69%p68rl@3_34KW1isLl@R|Tb)%Gxib53zH!YzgR}LVy z7UmvC&ahjF3Z=D8t?;*jCd)^S%mC%TOE%_Vw#2N$-4Av%@89sJIf}EgFrWoUhS;Y3 zio8<~sWJ(@6%0eqCYw@MvV~KZnV0gcVlwL8F#efvpu}}~N2vFy5!WktjSfyrz%}-V zE3+Exg5D|Xw+Fl?d<4uHXHFC6iLim~KA-0$y6Y{8k-3nN5!#`l6=Gx?{U)7B+ljE;}ACNWn`I z2I}EkywbNER9_@R`hL$gET5>-=M^B8XPs|d?`Jccx!0H}VuzbZ8TXMb{CpSnnnDqe zU0ExMj%xTiD#MCS3%#SKLf-|~W(Gt9yOU?LlQm|iC)Xy~i@ZiH7cCb6!mMPvr+%*w zi}sE<>C4-j3k!gFgp*Wq?zhv(wtMcE%tYAzH)bXTjfKQ*y?#fD>)T)pB#j#B)A$l1 zVjHtu&$^Z$D{T7oqhT@yC@jli;6l?bLnrk*bB3@jw}woHMK|ZPm#JlkBIz$%E71|U zXbo$P*6;0yli(RG>GVgy2~*cf?$sd4U~9~&&4Sc*xPi%P$EdHsZu6hu-^nOBC%lG>6{mL83n*vghlc`WaZDN~clS(=wQvDrzkyc!)D7ROLI zGYkQWSguOBH+b@!0VXR|Z8y8uSL^j#DVE&SkIVg!DlG*&7nY;#s>_*|TGh>eri!;; zK7;R#Efp^?I_v^~@?F)gN`Zeho=_RoE*)k5oI)~Mc^-OZ=4vhkrCr7&^5a*kbVZfi zcST*7ul&8Ug#SW6`~>!6mBT)>}W0Jp6R>^7$DbB8yqU0_m!R=HhRSrs<|n=1MJdTW1Y9#W{(n zh)656fT>o1y85Og*$}wN{OTWX>rt_uW)f|L_Keb8-iaQ%(&aAe-MecvA!dt4#i82Q zuSyGq#1a%+?fWK=-oN9f%xZ&Y?f?Xw9qOoCr*xnz%$hVrN-07-=|=aKQMRb5^r1A7dX_9 zjMvq@dx{`b27+d0)gpt$`@`Ghsd>?-$1RkgEbSRafG3#sW3Cck{z#oio6?x}aZ9afs^ zYAdn_uVc*!7}P5{cIjKqC#PDroE3kuCH)h(VpBa8p%rZG&1Nlmv0w2QTEDd-$#`X~(ycf3wxbAP$#lMY8> zj52vf%^OAiG*Zb`O!Ay1v7nrO$A?_Nw~Un^pDlsi~vUt9Wr=A|m;0a!B<;_~}ZYEu;&ZIl`+ zh6?p2srtrJv!`nYM+nQFu;pxpi#~yY&bD!^x6)^$ueC1|$EbJbG zu2sn<*c%FmV*ydUvuA+Ro}+dC_m>PyGy?1^TaSGQ1@+0_LR%eOhX?fX#EAY7)Fo7F zaRD~4V0g?L0A^?We?$jK!aDUcM7;%!9xz<1xZTfZVcUjdGbQ(;P$UwjKKK!|X&*(0 zuO7xUX?PKtawP=R4JlJJT*#V+)mj3`IC6awY{)ohWy^hB4$cPUi(v74ea`rt6o`7P zf8vouLM+n!C+uG^{`>{!4n#JBoPo*yCoA!WB%+qnZ@`5ln&Lm+4~Fiqh~tdhz!o9K zgPhLqv$6v(hDaOX&wO#Z2-P_lM^z!pgU-dwv6SWFM~ZDZvoVMQ&t`T-*5Kz~v51*t zP{s`Jv(Kx7GZr_X;Isl8W3ZX^4TUV;<@4Vo4_YXVv`{OJwD6K#>O!3mb*jNnG4NFQ zB|&HayFmvDl_DxK`swHb!kQn^*_y4bMPq_&qzthapXBf@%x``Wjs8Ie5G7gWftLhgXGq3SB}!eUNg0AovRL6o z_u*RGvM!DHiA^PM%mJ4{i`%k8i7B0tGJ^iVL^HNKb}Er67#ws|pSTjm0DDHAl_s$t z`X)6DOF@h3-z@a03`oiGr;fk( zSiEKrS;Ip1Q8Re(dtYWjAsf~~6j2*=xVRQYUPsEhc#tr>3V0FJDJz^sGTdYMRVg-b zoY?x;;iyqp*kCopK;y-TbwNRcgC^glEW<%WE+@QUrS{hf11(~n^Z$@!~mQ=>Ak;W^jAu0t0BvAoOW~xNKa-`VSrO>h&_51iD;HhcL=U|G?4q!H_>7 zLo#eI>;*RZ^`A=x>R{Gsk;MHWN*RIy2+QnP?2hJ6hNPvy7t(cCMnAkD`N`KP{Xk&Y zD~2=v1PU6mLyw~kS^srs)HeuB2o%rEk8{lQe>ez%MO3yei_^1baV?UhOU49TjVILS z545ndS*4XsKWp?`j2k-IGve%gJUciK-mhEtWWiIUmQFr>T!gOgChiS;-}>rwA&h!xQ*%&nD{5hL)ZIiUmMyyKpZqAf4u5B3yj+8a$b&ZI)WxpS?de7m+(dD?S ztCO=qcnnCJ^?uqPUwpn^Z-fDS!7tEMW%@C-8F74kjpo*f67~_=m(PX`t{=U=cD^So zE6)&n2<3QdrZ;-B(;GZ-U25TeJz*Xt(e!$_4YILEb^6N^$%Xu9t!k7zE>rbMu|lTOpw;%M_f8SdV}6% zhQQ^CRq42Cy!_}sJRx@BEoci;b2Qt_{d^A%xB+q9IN;P4XUL=8fkDZ?2zLk(FuIk8{XZw?RuN?zg&Ek5a3RU5*- z>M240Ixxexsz<#5twv=Kp5amvBXE+j7#dbFA8|=9KSZg29!4JnsNVZlf=Jqx-bQNn6h15HV#=B@`_{3VWXxmY_wS;8M56k{+Kioo zF(8s?l4Q{tnnXLzA%peomOaXIBMqc?BKkgEzB-r>+#4Qc|8~I6Z05^iYMw5OBAnCP z7>h)$SV9_)(vv~!1=3{*>2^=7)6S{WJaAY(sHyJMyst(AuBJPBbvIihAJk|Z3N!4Q z;k0E1>q970N0XnNB`jj!lU*O4TBYATIc{sRO( z0foBP+{@`tTylRNwibFj$YQlkTRla6@_YrvlUA=;8eD&0HvTT{h`_Q6;$C+8vGazZh21vkG7)Q zHVBHVPMDxasIjz@vP;xHEG_xiSQDr z;F)MC0qE+67~i!EJd$D6ZV@t(Un%cEsCTc;u7L6 z#&`h$1d)FiJD{Ghz1NLgh6>ph&Ed$e)x>j-jVHR4)eUgMM%bb%(32e z5u4i%z}V-PQ#Zar###vc{&(`W2ImQ1l7n(^r1mp`P^Iq1LLmTXA`&P;g#3MJxBU>H zQ~0gn?*5jziPa5U<3pW(eIiSu_B<>#y_@RYD&YSuZw0q)JNpo%cr=p*?d> zcz!p9e2JZi5rP=D+A*%ejx#g|8jU50gj-33(8FJf5B?gP3ZF956q7Ap_1vFYPY~B% ziy`8-f5$q_9A^+fC4fN`16Dk6N#(bHl5#K%_Eh_ZMks5AG^sJWm3w^qg+_54+@?kd z8T$zFsQX`Xwm9bHsKUSThVIhL9cQ69gxkWI-88>98qnWOR|1mwTe+roLifRig zC#m~CJ)-dFVo5y>`0A2`)5THk@VkQodO zG&Q6;LCnbVKJgQ9Jp1U*HJvr=_2YpN)U-KZKCs0wBiES%WIOIw&+tyn{**w#tAOtJui z?9dC-YZDB=xfLv7M7mC~*}Uq3a;cyml~bj1L>ijC!jl{vk8T~+KtvfyX)&>gJufd} zL>fy&ER_KqPuGZCa%zJuE5XpHZbMLdIe(MXzO1+kz>Zv(!kPAv6QfYbjwvA# zc{Z$Xcf!c0SG}@1?CkmJXf-RKSM#MIBfpZVet%56_fUF&_I?(6c80S)_~*@|XDy^r zn(9xeBqjS}pp&s^xMy@Zd*9E{!a~OEkh9mfVQ!h(0gn6J)ybN^j!Ll7SeR0qj$nA^T~c`6dOJ*`(`othf`bEJ}9 zB)Ou{`!KHvPC~<^GLyCeQgLwwOBBs_#aQ27Z=de;gWUN|%8e}2)qgAbFnz5Z5z0H96}K|W%y8oIq6PG1)GY;{D@XoyqW z2Dog@mT1!0UmUsT8=mMY&7J+4;?_mpB=rY-=;mC-dsJHpmwIYG;Le&O)>7S zZ#&&KPf9nBToH}IBG25rH?+uN>mLb=Qr17w(&`X51pL{;4;c{v z!(nv}p{4mZPdkKxq*8GAUs5;%1WkE$@hLZ-XxQ}+V5m#xQN3QwjwfIXlwn9?wh|sE zaKg;l)+<=0ERHY^?ymSHSofVaoW0pO6qBp>p#Iu6C(BRLQfo~Xn0nQ<99Z|uF=;lJ zrLW6JcjIrmbwkx_rgXOiteAT! zZb3;}p_4uY3TW+q7*)ijfq)_TqxVmH(_5v6&dFS7O&~xAtHaUnt^G(758{^wY z3s4}`giAXE-$_iHAU%aoJD?n3g%F@(p8Zr3S4mk0SuwO@BYg1!5d4gPC4$a? zzj}DN%8z>;ZF_}dY(+TFwP%jpJm@yaV?KZ7HIr9+{+uloeE|2Dbbl3rf$nWEheqPN ze-fe912E^%`Ji4)i!16TG?85u>on+vKbZUDv<>&wD8{y?{a|2B*C8;z-FLu%tfnn+ zU~E&)_h@YMdY4#y#}zOJ5Ylxpb{oS9=lM_+C6@h~7^5s2*T>O(5c%a+!U9Vbzw3ss zRB_ERL0QDQ^`JU;c*+5$$4TCVu#U7!zh29CurYBhi21qJ_}c6gOa9t?ankwKp=}u> z_OWph#@4P3FF)T?;y3`2Y7HQ!)Sb)*sPjzd-j4btneQII{AJ6B-S>HL|3ILRP`&s+ zN7T=0VRoj}+Y~6ORG%+lJU~`x%Lr0TBSMKGN7ZWF*Za@u4TIM3Y8w$Ma0#~?oU^E+ zc}aDxLX`yPpW$glD$-L3NQ0=)uW+T(+rb%@mGqJc%sO*q74%I-CIMbbXK>Id&NBZb ztGP9#EsqWI52cCi&wY9-#tqN|$S&@aON8!Ke-}=x@+lIBSTad+>jMJVF!akH65gcA zB?ou+<28;q&+#06sl%z;gp?!`WB+tA!%$gE64vF{XamU`WyFP_Lx=FAR!u_&)~48 zt#i5gFX`&94!yrTKmsfv%btgXA=vAp#7?x==JsU}*j02J`$G_0P3z`|R&lMH_A(II zO~ZJ$h7kS1@kVBr3okHN`Oj zz~tfqasM(i=!T$&GEZ7iSUK8Y5|rnb!W{#)2sKd_o`F1`&8B0wd?FM zTFHtZc%~xe$vCg!w+Gzl*cy)~M^=fc(>!D#?zQCjL%a%gr!K>i{fgTShemzcO%eYG z>xUaNk1k#6OcAEk;jF&^5|W~Qwt}xHksN`;z=&1<#bny({fhI0U9(2H66L2|UgoVz z;q$pw$QmQhr-S%-#^%5Nji18*Iy7$Td!f*E`Pcb&w*A&~WYN@m8JXVl*Xe8*1T{T@ zzAKXal;EJer}=K5-MjgOE88(4kJ=n&@N@oK1I_Rc&=Zc&G>Wx(k%iLp-@oB#mWI$; zQ)f?NvfnVe!)JfrTs^|hlB@Q&`HT)SMLAHWVOq@T0!kaj8W!~gpG=P+Hkl`U?&PT} ziDu-vDzhWlpD-f&Pep0DT{0J&v-t( ztw0Wo?)5_8-a6U}{jcj!!12b=j6H)Xw-D2TuTpiS;f!N?#8cVQ>nszL@sITTzd3Aq zmuHRtczyY@lWILMniq#T*uUU?e*o=Od{j#crAtb!SVZ}ixWpt?08u_BDt4VJ7xd|? zK_f7NAxUeus7`ep1qCVHCshdcqSbjNGKHEWRIQl;4@W_Hcv37r7^PX|F-9|ySZSbq zGjbrZ!aVu`w~>C#DqG&t70-!1Oy_V9H#_o!6i)8-aXGM$&X_?}S&ub4K-Lm9z^OOH zEjcebN^K`;c!sxwOqH3{l~|P-8l=%M`~nc;Km?F9V)qZ5Y770;h9~^Q?8H(4QEF&o z@a~8ekuoh$zE_I?T{uYk;o7+=3SQr>?xy3S+KKVIYNq50&&1{2#LM~3o#zLrL+_(Y zTX@ZGtEy?~D#4=B}epmNq_08bZ@W#GH&g`iFDe5bOZwu!gBL3Ie--VjfQz0`CoP9>Dk0OU^ zNC15?l>SF8`%P|?et!ODro#6_R|}|$AOI{6)+BdL8Ay`8mFI~mr{c8v9c?@ZWlD2M z+a+yQFmUf;Ago+#7>e>z2vnlK=-gEr&K6~B0XViVzPey(b$XFb5uWaaU=;mYA z(;1&C{hZ=sRkJ(SXEiaUP+)a8dGuUpMNCjl8AB?nh8@e^W6b(FMCr~51SE?~l6L>p zL58UyPF>hCj*!9C9W1?LMMZ^*hineVtLj9r9N!Oj5eEdQN-!?$`CoG3#rC7%Wel|H zPKWNT!`VDoiip1=)W9`0{>KC80xc2l0xb!qFU>B{Ql1bHtjWgEbf6S%1zUX{^o?%A zd_z{HOte^NnrLn}tx$B!*(EdMb!mEh0bZ8v_m^CPdF5dGy;zQi4i~PuqoZ7vgY1gG z+=uH5C?DRA0=a$-pAmpWj2PAvkyfTk1DP?B7RebAJm>DBwXAv+_#SX@rs=T1r0R<> zfLR@s3An)&GY6Cywjg1w4Ew)0fz9SYiOV*&w7=FgJNVePIw4onUD85Wk1rx+h=Q@y zBh#}dbTAv>tf-93+OsgQV1}dk7SYgVz4AoZwC@glyR9s!H zVdjcdL(p(%on&Y>TtR692al#AGM_6=7%?}d1Zp%QU+NfEv{VSO8VMghU%^U5LO-=< zI2v_DB-ynerU6X~|gcl{$Lg%bf&@m?HFke%v<1_;|69>&}u&{C_jfgTzVuwb- z9e~-Gnxn=R{D*ogCqfW3$cCTYy-SQtHe$>RFKA+xjlEAm6l+}?g6_voF>Y8yKcy@g zHFBf%XNF`vXT+HBG$3iweF9COSnXwJcNgdj+NxFwh^2h1BLTggKUgI1A{&t*?AtwT zU0ev0ZFatZZnQbcqba=56(tkbQ()aIB!@Dnth!_`24-|(J3{cYzEQqV4Ov!7@qgg)T|J%WaI|kHPoE(VvUa?ChHjo*JX_ z6-=?l>Wd|RzqD&rti##Uk9}>PYbuCwcVw;Fe zmaCeA;fpV_FoI4y7+U?+A}UKM7Mb$CoD-OwUoK1_e6~nRgh%(Nt|HY^Fjs!R0zxJ; zSR~Cd9vD0~UAd}uUuntiEiV5OhH_~WK54320}k*kjQ9Sw@BVtdbFp)MGCp};HhRlQ z<}h_Qzvs7iIQ%1bO2jb7ajJwHlb4u<>|*+Sw}6DjDW3Fti%6y;Bpc7}>IuTqgZcd- zEf#JP?vIear*BIqf6f|LQfIdvXjrMF#N|c!LkR@p8)SMHBw=lTxjlY=<#H&+y(Ehx zQ!*q2FA2`YOtw5rnW)FCl=b1J77 zdQg?NjH9kJa@VQWL|x|ukwg6_sQ@N7ojjNz-tZ+XR4SK>Rwit;Oiq@xHkhP}4OEX11+?bh z0`bugoqc4a04-|2PLkdX4sl#mOgi}h+x3w^OiUW@=m>`2+l2%OgL3a8`UwD%f)A-1r<5$nTocD(3$&(*;RzdyLYCeSfF-)OmGF^n^lk8Z>@+Fxl}F zmldYaqVaE=l;jmA{=h`2siM$t7nlC=Ib8Ytpo{(JXrAb+OzBk*zH7{d7|ejhoST}m z{S9*KRI--X;;8LtIzE48@UKxKpqlsTY|y=+tgq`CcIydw0?B;MhO7&K zRT;Ku{R+Rx6AP|%e!0f>>uM?mlXqBa>fO_IK$%|`-sdt7#`7}~F{q;hLS49G`=zTf z6(RF8ZCBX(lCr``C{=%HfreQ-%%?x-^tjMa4+B1N?G~?%eA$gF<4VKmk}Ivx@DYS* zJGde7C#H_SOc3@45KiHL-(TMy%IoY)#12c|pX>M6YC02QL?+AN%{DHbB+wTG_fd&i zWNoNjI_Sz8nQ$L`zKj+=st}noJ4rX?8Y|;(GW!%p_rdkwx3HP^fbN0mmFf+d!1S1z z5uKI9^g;AuAHn3*;kDEAi?j2=eg4s%B1^oNH}7T{-^ZuADDjBo?SY*pqedvNB6W-kML2a8-LyIt~SpGzaLXb_($65xC|DqV}2bWUC|^V zKXpP;AH%aIamA<6>MOIjq*u{GHZk4h7Gz$B`{>OYvo|_^Pj7V_fM=01$2YYvpKdf1 zcIf#V_d4M0Sr? zQ@#A;R7|$vC(S0#29J$Aroi_S7F5S(YHJl1R`a()v!g#+YfV8)gg2KY&dS_Z2e&A;qI-X}utHM`Gpz-u+Nz8lbDbHy zS(;9^0-}OiK>6kV1~1LTwXzM0{>)B!yK)41>pc zVnnJTe=Ie7YYbIOzErEHZLh*=Nz}{vOL$ENJtnlG{7Y|0CNVO(JGMODER+d?J+T`J z?m8~lx6Tu|`H|YR7uqX)e1UFICu-2_O@EnKDtY0PbkKJiz@9Xr53kyC<3n(nwnDx&r zT%+kTxvt?PWn;dkWvDt0Y*(2Ao5-?N(L~w&PrMSUj;N%Wu!%%mvHZO#>saf_#~|o< zGw$Bh(o!@ODTe+XSUj0^YEx}RE_qBgv}SD02S>I~2=%%snzw-{^QtxuDB6?XP>55; z3cf)|yQNhI6ymrc5mzPYZd*Mf1IwJ2}N7 zQvi>r#In;@_~32STu@by6sH13CP0&X+q`m4s3*1ME;C;%t8>LHmQIL~QMnF#^7Iz@ z$f31dP~)wVpBQ<6UpW#G>qmhFAN4~HZ$B~f3UU|)LVe%YT%4IjDNesEhVb*28_6WPI1f?OWJ$?}N6$(@(s5WvwpzW%Qn`rJl4XaAOYX;)sYpZJ9 z*oEL}thvI-RVbzu*6l>bK0)?zeY1TrI$iDx5jm z^z-x0&EoECVNG!R?guG!b1qT`a**7Rpvg*K>%$tLWPg5g|KQ}$#_AKp=tVM~<=Xj) zO^)ZoV}JPhZSwi5dx}+;Hd8#$sXafx?6@flRaHF66+R;Bg!4lHH0YN7?=_yBLB8;N z5SKoN94H8H98W9jHhGadC+K3nN-s|b1J>})jy)mHX^xUS??{d(|zgzpg z&AYp`i{Eh4qs`}G{A6-)HF+}JRp+WeXA=2Qd92?c@bU~XnAg9}Lyntjn|9S^Qk&Zv zJJ406&^Jftfxf1zbV7~OA97X;~WM3N*rtEmj8N<@{(&9*||f&AO27IPb? zts?XC9eJvh7?80iGXd)04#`!^r2+>Dda)uwVr)NLxw~(<0jNiMoxqecfizqfK&a>e zK-r)&IR0w!1G%4BSC4>c-cG3FQJYG4(K7|GsGR7mBce2j?3zE|7S1=muugd|M`~t=xr;-^^$}{R z5f{y-MF$Gj)3ZDZ)sgZd#wb4(Bm65&VFY{rc_L5hPY|e_oOX)2r0nNK(9VDRQe_A)2^>H{X)$RD0YPxrG z?cLc6_L5hic${+FBWN=zRf7kRZm021yK%>9vnqHhDn?Zdm_d5)4Zhy8x4j$u!y!NK z1ZO@N_)`k(y_Jkjv%6{~iXqnb%BE#>gtt1@si61U&sR^!HT*O8eef(>3hfNKi7rnMJQO`2A)x!@Q8{`a3yBZ zUYBHD&Rk!SY_L=jZX{~De>D7VZwjYXI<&svncGgl>HYDsUV!^Zk&X-%sMTFF2CcgSrx*q2a37NqCJiF4V6Ye z5JI6(!3R`+&Z~7=;E)tnbF!UO@mC1Ge|_el!EXwV#5~BImo+nW=VFYBnADI`0lo{? zfw=Iy#J>soc&7^BZO)4C3BP{$ku?$w$L(?DApe#?znDmVlvMFuXrZ1>5SL>Pojdy= z{(cTZY>mMqb|!O_B?nk6hzezW4lK)>h1{c$Aw`^p3=0d&&^@7FV6yn5JZN!&O|>=w z$_ZA_YF(?muQ83Y;qZu2&LYV5smt&|)3-mUCb#0SMYL)8$@gc#4EJl6t+r8)bq8~8 zCf^bvd!mP`u6pn6VLt=8y}Fk10B! z8Qk2>pvbJHQf|Tt)+H~uhNz%S=g$RM=Z#rFK&o<6SW5C{#LEY|dX5u&4p0XJus&xS zVW%^8e5RY&-l%l|6frpu?zX!6giMyLw8U`%?Mli_WMC zT%3kgOb^o>zA%1$gWW4WW#)=OfYkY_g&66AfjzWpqs^~om_QY|0zKCH6VGUQIdgC^ zEZk#=z^L^~V`!%a6VQrUT|qhJa}U{|(-1{lA@LAJ9~U8O;*9DIEU7SO)mK3gQD`s$ zzLF#^Y!~*0uPBi-PoiM<|EJ7au_N|HQiu1j;tQjYE=+9Y7sQH^eum{-V@m zpVHSSCT2>V?qf?*0p=No?K^gV1Xlh`PgI5ZZaSFvcYk&Dbg)p`qgUuE(azs9 zGNjRSM@YJFsbxn96LL4yHa2AMC`3)1SmO=ohc1Y;eHMl#&9sbihz+WLOdDg?+4bHj zk`!Pz;8k{)+_)mGO7h%MEliPT=}_U+0QPgC8oTth52(K-s>DTZ02S$JZVIW(MLy?8 zq_6w^%5au%ecB;mbUXZn4WI#i-VRdun??X=DtoWhvMYb4q~tAM?Oq5glzkWFCSKe% zv>8_UOH0KVXVbpt8Ug|vw$+2zqqosxhAW4e=;U*Ew=UF%m#00jVJkczb;r5!tkouU zSXu)D(Nn|G3BLdAf+E#%ne!-QeF6J*5ALiQQHIlRR*kj0bo^Gr7;|ghy}H>ALDjh1 zwVTyTYe=>_nX!gUhSdP>w8N5$X#FgX+_yIGmy1862NJxBpx$Tb@BR&>on{dmwvPgQ z!&FN{DJ1Xzw2wcB+W}Knu{0NjvowWDVg8)XnK6O{oCJad{lkaj1f+Q5h2uPH*Dq-v z|7kUEn=5X`_&W{W8(zJh?s((Lnx@nwBV=Q3{<7^y9E9d=sh*{~NN&Nd>|tCM*7|mN zH6pD10bOc>40G+a?3XaS37&kSADPtgGsEwU)$PQC2Y+I$#uI<}-nyYgJs+btgG?tm z`c->J6gX4mv=cFP6|D{cZ0Q-5CPG}MTmDf6e)U?g{W4YyzpEk@$((XOTof49@YIs$ z6u;LOs9E_j4DMlI2wE3bN!5M{e>t%SF+N5UgB`n-75*!p^b&%`ndA2_2(?R9!763z+5Ep zd^D>b$7%u}t(|LS5ygOrK{t#J=S4IhV|lid>e&sm*ukBzTa_n-Z|8XhYdGv@J9Q{e zFUT!`$R?xl3!oO>CLszf=EY9lfc3LJ3<-EUf;A8MnM#5|A|6HcyS3l3Jn&X5WT3ov z@st{%9hnAAo*zFtV2kGIXEXJW-#l{uxvoM=ZHmd&^FL2HkNFka6wTR-;{weTi!7&R z)ClLQfkQ#X$bl>iCN<8MDQ(|Mtu)OkIYDHl@KP{Z0kcGwwh)8``q5c)*?o>E%4AzT z=p>Rd3T|F^JIZ=+)XD4L%%?chh~gQw>uh;5@2`6~3r~;Vx?n#oicFRQzAFpo*U=T; ze~wiCGunleiOV4{GO-fNs#vruER@*$#kASWfZcp(;`5#Po*XlKXj>vA0 z!>J2cnIK44fYYj5mFMw-9}o3I^)IKbxfB7-T9)q@8oc@GrXQ0f77C8mY=4zh&EIf2 z-yE2`AW|XTlW;+W)f?Y`olRwz$DPu_faS6)r}HAAot(vn(ssx1n;c7BV5jff!;mq zRu@^%cnqaq2B(Wu&V*ieqHu@NhW%8E+IFH`64$e!-3H$FAg)Ny<5LZI$By68{CRdH z3;Uh>aZWBaHB4F$SpYmcgWu=SY7l}>49go8cEjZ&?|F1tIx?D`XIq}1`{B{@tN(-- z-Yv0Q9CuHa%7*`AA+ek7JETM@Ai3DmdK-l4LE5^GYSQTb4>c>pO=zb%Yv4Up2a57j zbPzB|e@h8M*D|P^6%HgGbzkzFrbELUt5(YT)eT!7PWTEuI2G!s$;8^o{eEpP$$uBZ zqz|;B2K(HU!9F)$u+NPO0gaYZCQCZ?yB9WGmlICD!B17w#fhyPXYJN!z zNHxu-x*^!9Wv;rcLhd5<893Tm{29>N%-JRf%g?Y|ARwA{@e58FtNltWFH?>zJ7RSZ z4MIa-_(E3vc0p7lC``ra?`}zu$6{VCQtmew`+(5sX^;G>epp`S$mlJEACWQ@YPFbq zq%ECPnkQv=P%7rL<6rG&M2ASeD-iH_oxNE{QCMU$2!QY^QtUnv{_ zVK%cnsu4-*bue^cO6xH4zD#X+p>Y?91BfIWlnC$g+#?u0P2A;_pJH@m!%=N#DVxR<>7FomzgLKAOdr;Z9=E| z_}q$+)kf{=Yk0L?z1ZC|%4J^n{miTolroCeMqo=t>N=mlhJ9-qZ@cvcVcgfM?>^m7 zKGVVdY=x6IrA`v=qooDL_bSeHydLA!2A`{}?%`D23(idEV$ZCftZv<1++Q#57Qt_K zMI|NRw>!HWfcfjA|H~gwkWZUFbtW3_c;TdX*2RY0I3<}oLvi`2XGr$V)QJeW-_xDl z?TKfj0xkN}BOUXPnoY-fxa{c<|7K@>uo>+6*9^Ll(PegbYYXeDM_*#FT+fviF}UoCgp&V;6xH;*}(#*MGzkr`t%Er<^ApU=8DZFX9C4Z zRoisp=oOwKn$0wB*l+0bxZ)rM&G~J4FqR#Les>l0EDDG^;zBbh{kepC1g~tIAKaP0 zjPz3}`1eb(iS@E9gZ8bs7Gj#QVXodJ=Tn=$V66vAJ0BUq;6e_1XsRX5I*Y21D27%*%uMCG_Tt5jD$SLsM>Ys;#d(&j!GWAJ&*~2A+6E%E6?UKRNlpHpL zBr_u*2su97#Mzqs>u*sPAqN3$g-gl@)r7=7o`_pZ+YU^HTSxgzDk8I*Gm7QM>)w9E zTvaRNjx`7BsNun1e|_Ku`H}X!D^VTMJbs(?Lz13bMTIYJIxAd;W8J7-_Jf(!;6Jt0 zkE?FPLq`8H#H@coX^}Nyc;U>$s>S3VG=*sb;(pYP_z=;LI}QWzylbSjI}idq(j}@n zuqrq9o2ZYl++*zd`_8oM^$xZri4>;y=ho#?FL)mft0ZX zh`niw2G^1--Muf&tgO{KohYYekTRyK=gdjK`-SW}OY`oSFfGoy;I8Fv>gd2p;69Pw zz`}Du-nbrV3^2H-0^hGI_&chZppJ4k%4MBD=<&onHUL?Y8l9YfJil5(fBd_ znc6`b`)ezdI~cA-7C@ga{VV6dJI|$s3`t=$tL{sEW=QK3g`fvbYOmQ4OQZX3)f^4~ zDQZ4l!efOsq@Ya*sC!M2#HSpWQ{Fuzw1%15I#jPQ(@kWyVWx#fD6?oQo<1%=ndh2s zk!2`zTKqZrp-Z^?VM~z%#jNs!QmC$!h|-A`zlv(-0+!lZc!8IGzJM+E=VG|G%u+a- z@%n*U>T`B2M8Q{(8xsD)WL550=xOv^8kmZy?2)k^vUOUH!MjP8aHTbvyMf4EFG7DuRx;Yg&H0a3FPR9Nnb{*0I)90kZ0vkY58Pw`d=C}Sgg(&+riSYmtpO8y_Ek&Kfn z6M7YeD3YZ(hJ>ZYIofsDMt9;45QVlLNces$khrX2zqX)2Lsz0QbyOTostiovk!Lya zE?K>P@eU&t$sZ)af@qU$@R8`w$R^s0Y@({)iG#6I`CuXXqfF6RCy0XsRH99dAj=F; zg1*T8^+pHenvj_*HPNCU$+VG^_4OQ)ia>lOFu)F~9T)v&y!bOT2ZBd?k)Y>GWHv;h zdMQ6FZp4Wb2-!?|l~_Vq1s;`E(#Q)2p-WDON&+_{3?V^5bEm!Ok1Xy$KQ z3_oE9)L(CJ))rQjj!mpj$}QTT?tYEB`_6=eL|tgNqIDY0<7mKivGtMdGfvu-_b_t? z-h9M1Kj!=JhL7g7|4a@OBP5xd<<#$cAlWzR6H11RTHV+nNv^-|IA6+hjJ-8=+57-ul!a{4= z#MMp5@M^-sU&jwCJl5`V4{yPxa0qfd3e3;9Y4qak72k08-^_wkhU;?f!EH0Qmxflg`Qst&iEf99jT#QS(Jx% z*GHjrHbHr?^XV`vWWcXp$p5cJ3YmFuv=BP4 z-cml_AP(;*$Th*OBuk##ND;@FUDl8f;S;54@p^w_!RXRkxht+cPpxgP)ko^`h41=y z-*uAO;D4r9a$7RzJuI)UG&OA9&aAeZ(PkU-LTjRTNxIiGz4QcH$#7}?tKEH|=N#`N z@WEj07doUB5FIIvVjd>csT71Ttg}vt2IZ35mU8-k{A94i- z_ju8VNvk2Q_b9pqe&)f%4y%y&Q0J-#e!@dx(ID?BYHWE4I2asl`Q);`0mBPOgoHT2 zJVb>!5Tcl$Ngx{B;CpEKBuCUbjAnm~Q^S0nNw8gQ9H|bf838ywbWK}t8)_jAk9vMt z5?b%1hF^{mSJ_J{L04aV{DZD;?{tE$9$k?nuFPy;jQFL|Gn5{CQ7Ri5yHR$Xgv37f zv=Jw)Ky}@3`wIRN^~19s4zDA<8RL-R=uTvL;&n@SBr=xhQvKcQF%FDRe6O3{8&8Hl zjwpV{k663Bnq36LI`>h9>YY)0TQM{&{o(mI(qQ@uCK)ivf=Lcc@?cT`lOmXuz@*%q zkE8O^&c?~g#|Hke^Kh{;va!;#veMEcvM4y3NgBJFlhaA^v$L}Q-=j27&Z>NdR%7E3 z7Zc}^l49fIap#nkN09He5jbP;T)Qe#qiwZTrah&tsMr2b%v8fPC=$k?58j52Z1T)HvTxuatd zU_3nPJ*%7>DvEll)!RUFlfy>JV->I+?U8lki(<^96Rf+)5UNlm$^~7c@%SYdkR( z%PQ18l&(3mRkVsOs&~KfmH@hjNd|9$V*0UdYf*SRs_vQ>JO}0NMcSx1CpQZl>Xji3 zZcir;bea;eZ4GUwQH{za4$*D4QE59-ZT2VC46xN@0@W8$CQRF5Z7Z;J_MH578WX|0OV|=^?hk_9gbsMRwzh+s*4Y(+|CZ zi}E(gD6kN>69@1r=YP`jl=>80Boqw2^UbfMZAGCJllXxXJ8FWOWj7$esc$vi92cyE ze{kJTXDBrL-ekA={Ubo$l!domD(C*?AF;(#Q&qRQVZSZ>7dxI|vi{*@JF=%6z zVq%tOo+c`FN#P6BC+-YGc!C80NX!ZhqQmsImEtuV)Bap#ydOk{pMPen;%%8$n7|7a zUWBzhK7%mATuyS!*DCSF#*XNj0P1*IikKpXs(1pW3Q?-Bt>XI7Lfq}RSFN%eIBrDP zjk(hq78)xZlKOP>H^R$hNMxtjjlZY07QR3sZGi9B_N2f#jn3xmhhwQv8K9t`4%Afy z&@0CNCtE`XyefGBlVWff_(@u``6t&*6)cxlB*prS`a>&~ zcFCK@G+KR@VhAx0i)MEtJveg+cC8<(PmDWxO~OjxR0jWx9))t1UnAdnZ6t z?u(T<@8K&07$@?-qfd8V43sB0BhDNrIPaO4e+gpjh|~ZA?cBx}a?~aQsZY){gtImD z5XTpu{=NXE*zj%^_(I-*I&5UA6>Fsz-%TK}%UxD(cYf|7f-|+7o8TetL|v(hcj}>6 zhtD2u*h#;1nZ8Rn(y++ISBDYLPz?&jbi=r#jQXbp7jjo3!f}=*itB1fV%_+DwqS6V zxrE&8ZIBLb zBzUPiv$*T1#Nb`3J?Q9XnE1{>xcP?)4-}YCqm}toIFy+9_EMf?-}pu>f+Av*S8b^M zcI?|t>{hT&Omqje;OR3KzcvrKua@JBPnSmLX!^dvOB~prHVrCT)SEyb2k}dPA~TuS z50RH#c3YDHt^CwR&G4)tbM}1y%x0W$rI)dH9P{H>c`D*u3+^)768|)&zi3rLJKTt1|5Zas>j7BvJGCf zdRJ8&wpC^+_aWm;j;j;-;n4wA#hJ(MEX_zdfVtk^d>H#SsWP~PgGJbtEx7;C@3F)( zmo88{n75ZDKwNu=S}D1b(vtm>*PS+aFShQHLK~qX4_~uClj<~NIfp53xyXq5C-X_8 zG?8)6u1q|4&odS1)XuFk!T$MJGRf^2$YjK57kple)kO8}&|fImja(JisMZdYw0Mnl zJ>amCV)nMzOPA`!z1fa-Pxa04wbj#vg*a@&M_^id1A-U2ZZVGPoBr}%WFZjJWKgNs znitA)hd4VN35Wp@<5L%Mr@Th9U8l^0<)@e-WU`Y7_r7 z^#e(BMdHJ`TGXZB?-Mdp*=ExzeHJT_s_eAXE~@O!P)E6IFy`bKEL@D`fE39y>6+*bKLA5Yi*&6s+W&P*Wk}dJ}da zLnuIU({hh4-UFbGq8T@?hZ%3Rsn=SoG%mR9c^QC7;@Wsf-{BrxG8LLZJY2v?MBBSXKKCCbcU}YD;0o-y6!&Vm zOJwI4ZRgA<^3sml4J<0~0q1w_FzEv2fJp2p6gm2zUbcw^UF16vOxA2;p|nJah-YBo z8hRn@f&V+(0mnH2f#M`8K|F*04{Hz17N$czuNog==Y^-uCv*_-oDKx- zUG+GUN*&ss-rlnqy^fl{+>-Xt|w6zZ-UGRj5)SsZbX1h<1u97YMmj_Y;e1&hGW4&wlVRRE?1eqR{^l%fo?s0`(XUf~2& z-N)5}%Ck+g9<&C8yXX^YK||aAEEpyv^XvNCh!6DP4(7u1T+`OBpXc5>AKp#=Crt^& zUF26m^&azH>7%M{ww9OHT0tnM*Z#ANe?^)N3C83wTFpKr_0T>v^B@!Lm1-MYRf| zB<&1+kh!V)&`q^;A(u%)N>P~zE2>3y{)~2G%!e(?Rtei(3v)eusuR(zJC6?fRUQ6l z>qa?1R$f$#nMx%y$TE1?maBho*Jc-=stTX+)|>k^tKJ3w@v=&)3D9@sMfGe_sH0=&C6>+$BVGI-8~&NzfCqBRKE?H z3cB6inhc5tB8=rjGUOxvwS+!o3X zng?-DA;w<>O7nr6BSAGS)N3J!KIRq_k8Qwu@Gy{CCineZJO4$q-|~-OZGdd4YD}|G zsO1&0L62NSWoH=A749bA0b+2*z>;CaV7FFUKxN~&VY@B6xzl$V@AGlrKS;dCE)_!j z>1H1a!_(uxwP;2k{Nx0a+U`53tgWL9xHsa2}9P3PnKcvpUF(V_usTB7;1 zzE$pZ_IPXm54fL{xf$fSw!Z!WvMBkGFpMm4Z5sZ#FIWb6pJOg{G0XVxT6IWbuI<<8 zzyB@_4*1k8XXkT=5;66uU>zWF4!P{lDbprk3gP@4P;%~M2VyKar}zyhIJZptWBAeO zne*82LoUhit&Hxuu#3rnqUqcOJQ4By*BYSd9C96yey%0T^!qgFPjfdLF8Sa;K|SYl z3jhT$kgi=iB>Dc;=+I`u?Yn%V%GkhnQ=J1)pZ^y~Ard1(JvX2{;W3xq;eXb@AqXn` z0(D>iFr!}WemCs&6m!N+4VYnySPjx&gj7LVmAUtLx9CuW#yxArjWDExzQ+qO?)A44 zQ^!4<`|mfzwijS8#*J%c`Y-fuI*EzmLYslXN^d3G3}j3ttVMzQ)2#R1Ch!8L4KLk* z+$-=R^k}7ycJw_QgzpH#`T^5k6#6FPzUCpB19BKIn1^{mnpKeC#*L$172(5T!3cv% z!rOI|XOVnBO2T{8M~@D5k+~PKkM}_D?scu%LJU z%VaJFbug{N!Q$cTkvj%EJJJD z!62UTDQ|Vyc4HRefE<~7vi+gxhhEZ^OJvIDV&b5FAaqpc|Q^(GEi#SMq6h|Px~$>z&(#Ylga}9ckS zDmi6E^Pk(3cmUt0-jtrAbKJXKCBzHI*>tT)|GT`auL($MIOmskY&ak@Bm+)ns%R_f zVXQZXcw*%L9VUE`CWD}VeTGY=YV|P~z+%jU*QDW_E&&x(L#I;np>az(;Z%lkB?Re> z1pCs3>??mdH4-`ta80_k-NK9h{fWpJT-V_4q^>cMUAVq7s*}C7WzwxKo(a8qEzy0C z!3y|{l261T5F429wC65PmQra z8$km|0&)G-$(3$(k_mF>2>8@f6w9xMTm zrpkiYM&!CX?#AW1k%Hfx7k|J)9OEVUgCdX8BK-dgTS<&HcXE{_6$AepLrzje z<)3uvZ)u{6FN~u2&!PE-vd^{wi~gD~-_B_pL_%&rYb=~^;`1!jZ_T3W&tHlR{|jUR zz`v(Zt1OUj6f^&VlCQ}1+rR_X*1ycekQAAVioNT~Q$82s<>X#UsuN+an-sAdmIN^9w;i2?5KEL+OOv$@O#nXj%O z28m)ub-Y6{V?gh7i+WnxpZ68Afm2uBD!f2%j8e-+fBU2twJq%FIsI+~ZmL$1x9I{! z(UarqlJ?wEZ<|xO&u_ti+Gd&#NiFy9F>*Sy}Ks8)EG$S5HF02 zb^Z%+zUJ3{q4@@=C;NF|c&h47{4?dN#T1a?O?YaXw9fM3wt!(c?Im>hH+y-w5fap? zG$UJDh-UtocT4DJ2qAlNB-0CR)$Do&Y$;q-RnwD zg%vOPh|LgmMJA=2)Jb#m1R|DvlORwA0xWG@&~(nonNC*|y+MJ9UPhIGSZ-JT6ISM% zq^nC4Ub?n*RYNF(PgtZz6ya#dSA`>aP2A{Ta2eX?-*9POg}Cx{4Kg}6Lvki0??6p; zv`aKzj1{}~vmf80XbX}v`b5q>3xVBSfiQ+IX_`t>dh;W6Qzo4s$L~q z?wWv5nPd>(rM<9Sz+KJW?oZ8{q7c}9HrlD!uM?gfh4A7X23qF(QP<&p-YcJoKDU*m ziM#%<+P(rTimq>8K|&e{LApDoTaYeU5KuxwDG`vC8WE5Zka8(OVJT@r=`KM)x;vM4 zX<>o?fIdF@JkR@n?-&2;;=1>qbIzPIv+SJt#eHT}rcioFyeZ&MeI8=0`5WB=Z;JS9 z0p5i)crwV!CzyDRgd*szGnbM8e{F|rU3GUvFqURe4EFFZAn$!oZ*tt!~#x^OIu~{eZ&8hri_Ru zPEmdmZ;0|tpd82Ff}f{2E3z5qM9}LQkL9gfR)}cX>*eUSQEeYg4Ak?tZfr(9D>(5x zpv_K<`Jj9!k+@pG`)|-jHcM+7-5|(j_#J?AD%1tb6JjHb zM&ZAcMC`ThHrI$|2N`63@Mwz_a~xKuj`cgNBp8uaM%o4eGe(RB75JBvZnL;VM~Scn zgFxl0pU3tM#V@5v@X99R zV0;)ISt$Hfj4k`y#6fnhUjl3%aKhTs1-Cy*O{>AK6daD=+d2ebOhDn`Hc&(`O^d9 z&uu!jB2>wG3r>WMC| z`GO|JmV2@+Z-_r0-m@yVa8O6E&9g9_P8C=%G2QD3t6_Wiv_)e}49du~E={RfI9g8Z zpAo&$WoTWo9*ODPek=2)GZrNCsk4f9W|eb@X6Au&i!?`RR1|>Fi~n-`O}c9uP?blJ ztGPvux7jRJz~-;&H4`Pdg~%*U?geh}d1F|)c68428Ut?w^CP%}1B_`t!@XEA=2sMGK zQ6}I}h`L&{cR&G;gmkIyiayqlABWs!_>@i(z_^SoMogmUUz9JrqI-ky%m#bz;(#;A zyzG)`esR^5!4~CpMui>w^#=LcbIJ27{>;0_q(nRB583_9Dh19D?opGw z6GhyaGo0|E+g{XWbz|~DrgjSieq-!(&r6oqZ`;xuJmw;+(e)zFf2L*A4D@Jsh?LBZ zy@^ml7){8TtxhWSwx042))ADLnRkWIJd3nwj;KF)Z)Wr$SzuELb+$(B%yAWEwEEtb%fbqaXBSXLIvItd$JHFKw{`Xl zMGql4m4WRjeZh>go}SPfT8!F9`vo@y=g#-8(*!B@i=A>g=NrHcOS{YM-u9FR5PefV zJgOxvU=VOJOFGG?2~O?deITfO7zpri+<}e~xaf#@b2+ORz;Q~uFWbK@?r#8sW0eoF zA0WhZU%w$0yT^q*Ea%4Vf?&U1CDr)!yl-6AvN)j2LD<{uv#9M`r(xO5f`BeV?AIlv zVxBzC+{PkBJa_iJmk(&8SU$3>)-2pp;L~VK?~8x8_O*kFjULTUR%s(5Q#cZ0jmM9|1<#Zlm(RhM5a#wtTRUMnVY86C}=yJe* zO?6eHsZ2+!EonUeNRx)&=G?KrsV1R0cwFyHjLXO#`XPiceGf&$2^)C5n4fidVl!G5 z3NSx^&K=-R%pgPbNrU^iWoXqgN_A?KJmLi+m+xsYvvm265tEkQ1$2i&Vn5SF!G|Uc zxoX_rGn#WQEp~(718%plNDA4?cOq(tc_wkreU-moF9d%?!@3ho7TFoWAj}U77W#%V z)!gPhOn>7=Z=M?Wai4uq0qBI(-9C$pL8&nyG#mj#@9U4VR|Ya&8hn+O3It^S(gyYv53hnm{(g- zF3f9rQJ?im_55y)YI|r#+J-m8$HwIq;M0kA3v&i;2dP;LoDG&i88KnC9WjlN%@WvE z(JpA2tvEj~(BsBu7pIp_&HYr@R;0 zlbC!_V$Y41m=-WJTE#<5apAtz6_;LMb5^ePIDQI*1ep#Q$ZW0;RGNB20ON0>q$H?? z=1seJ!)Sbkqgl%XM>npH4q(({E)P7vS|Bv}WH%Xx9GnVEZz2`LLRT!1N{#^u ztVN>Fwq}!T8bxLJO3r2-U{r>&KXU_eQvDpCL@;m}>cGHuYVZv)8TgefxlY?1kEcqG zlkyXZAdhl8u()r|7MY=^{OuHht7V8){t{zmPOwVr#TR$%!|sAE*fs|EYS3)f<7IcA z90h)2(R>a^L%seajrOD3YhT_kkmYBU^Rk_`-PU5E2;U8%TqO}~1?n2$9}7@x(>~D` z3lodRaPpVRX>GT|kV`pp)niY+TLJm-(-6v2644V5N2FdqW!h{h<3g>2$Rr`^n)yxd zo!oE)qDitK$+d`7b&8;0Z%pM6v%NTbmXxR?`vdz3NQV;VVEOAq#hHy;9?is(xY z$12@^!^oJ3<50kzBIm4_id0mL6CB`vzhY!#Jv~OKd?#WTt*hQl%gF)|TkiK7AZ=Vp zyq@Z_Dc!oI6h8>hkh5YYO-Y;$CTIqC7=A*m9@_3ae3hUzTt1vCwBw1^{Dt>fqA2t{ zcub-EijgFV{NOt4&4^s}0u^?R^$lJUUq+#7V{B@lyGsPrDLjoV z`qYc1J5L0T`qni2Bp=oCsc)6IN>wvtm+i5=V!`NhlL5_ z>Df&znpeMtm1v4>i#F$(zy6GW7}wK;XU*@};lc~l3fF5I4PCI*S^-jfTcG>HSt_CN za+?3_h_-UGJ@Tf680u1;OzOj{)AWYV9J9bEHHvvy{(uZu6Ot54_ng%zAnx<5SQ8GZ zFx_Ha8LmZ6nd{XKt;g$9aq+XGa_*NRW-d$oh-tf{70lpP1-N~c%C34dx740*`^lH7 z&S!}KQ-Fj?ZRj!g9#9G2NUaRr;6|?`TT89vP-Z{b211z%1oWCTBC^(J-{%Nq9{~1E z#s0330%u{fwWmt`@lRkK%*!FCa(Q;p80X7|&~E2+ndcRQ9&L#*{-vea>Z9oP+tSw} z@Z>DMeEm>MC{G9v86XJde!CnM#oe}iC4n2UEEcV^aSW+q02E#pjk+*qk8io9g&%Ww zRf=pzLAfJW#LzQkyeb%TIrw#~d1w-|>9Zw}mPN!P@GGI*MZZD*FuGX}6RFWT@C66! zJ2&?;ne~tmy$X_t>N_jngx++%EC=QN1)2v*p6Blm3i!la0X{va)JIV@C7+k2o^Nzy zecAxqIy!yKX~IP5p9H9DQiQ1{1Z{>$uH&#z?# zhy~FEQUKIOf$q*kcJ+_kv4*1BYj;tLy2Tx?Zq$3bU%;nZOnri*xwbO*SptKov&28f zQhCAcq*cFPm3OS;)sRVeJeR%iHYtzwOjW=(X_tYB{SUGg)jkuAn3V;sU>P^;TCR=~ zV#e50hX+;pWM^%fpMEBtH3+h&s|kP}kU)rm3In*^+sc3qQi`Hxp+_UhIxdn9kGt|wIIr1_ouj#ReC zi8o)4jv7NOzA~hom&iqw!09H5Ob5yb6iA^&cDvEFg6kwYuggcj%aiF*H}$sn3lor2P0K&}A+ams7ecgl0^@M|T@S0)*63;S@aTrsI=%{7($ z9Q6*^VN2#E)W=6iHtiEk5k>omHmn9`*T6SS3j@28t6(d~(h>Xl=%R4K*yInigpyZ! z7zibk_H#Ag)d&W=#XZjL5Q0bcCHKNs#(?X|FO!nFXh|i_dKfSy#cz;#_`d}d&+zXs z|89vjNIrscC+UJIobWmIpMY2{zW{ddqZh|+u&aL$MY!{C6!AR%8Gv7E%sl7cELGot z-+3t`6nARUcLj68KKdOEJOs*#ru`{azMu&=?s!McaxHlkz}q zPH5^)fy;74N9un#-6&jFAjT2i+dwxX{IK46|r46^@cl0m?ur!M|iHGI%~?1-1g@jG3>#pSr&?`(9iuzDchvS?9Q|w6)l=n-N8w z{=W@}#PJ`k)WeNkL@UM?Zn{-66%xPb>1qpr6Gh|qtY=+#G4&;wZy6o2lZW#ER~f( zx33u28)SMH1y3;!h?llRP2JeRpUVp=eMe^S#el@%w(afa59O80yGI#i2TGbGlDBts zdbH)gljbJoX64;wO9Wo(yP$XU??Tep!{5QPLqa3O>q!ezKehv|`5|42fzd1NfkiR! z3QtPgzISnlbus9-GX%0i!czoI5_LzCZrAt>EWi#eyr$RPR1lf}!V|2I^n(1@juF*pVREFnk;h$`dln8P}^uC>%BIr36l52MEwU#LcDT1M{Jxv zDlAEjl?(_yBKf9E@zLdKjPH19yLZl;(v`z;_Vv7v-Z>?uQ9~f(EE!$PyQZA;$UeMV z(1PoZx$#@UJiafNX!7_cZAe3OZ`h}2#wP1}+yxeDV$*bq6iTpwoM4K(Y!B0OV>fgk zy^XEX{djl8=0Q$u-r3fB5C)P9Z@X3M=B3`wu@YpH&&e=d>=n$=y<@(WCYYC?!0{n( zR553-hn*Jud0d;>bG5!$J5dQc90=O^}E^zuc+ZsKyQ~#Vd zhVjHrSk`{EQ1Ke*L~sA4fFSgrI9=&+T2cvaK- z0gpgZafX}tE1lEO0v>tC7gDOrfzaL~?({h$m6XbuNjJ9F2*}}L`c94NviEt#zLCmi zWem4B8-UsjK@UlH-cVg0hxYFBJm|iwvRM~1>C0A)s_lW1v4f|!Tn_DZ;(0)9q{34j zGx7zJp|7^w2u*lNNwo<%98Y&HRb94*_AYUsokT=cjE^_?T2hGERyvM^>T)NvH<2e@ z_@0V=P0XYhTlF^xdS1FSiW<51E3nV>C1XJ4OLa`X2b*69jW}!#GuhjT0ACc*8Gq8F<3!ULbMlxXj^=m{kC)@H)yRatBI0K* zs_q7_-b8DoNkc`1;tbhA{Q=x^Hf<^*LiQLT5ZAXccc%;!42rSS(!Wg6aT99Z6Nl=Y zj`mrRxRrziuBZWd`$bq_rmBN@zv$OwuLE{R=YEf@bb`r7+Ei79Mf}mhg;_tf(R~D; zgm30ooa9DO3A(s@bZ|{=V;{j)g(^z+VK2>*mmT9bxaNe>UY|wz;$H&rYmHS$CJ#m$ zU#Jfq;-#YtC-+ycp`eG~ZLQlkMc1)f0T1u;8bxs#5v!cU#wjBhrPfGDqxn14g z^MS7f`~mILRu*qhXL1l`Y~&9BAm&(WPcfK=$tUJOYgTcYI^8p7pl4NicSo}sg zT(xcrg>h1=+6)Fx$+we^++}puVlakTYGE7ATScbHhm&UOSH<+(T1V_dJ}ULo*M{DO z(?19uT`==H$b)69tpYT}7_hr@^ai1K=Tbj@AS0z_7Q^st8cTI8SLz4hU{uqdl<_4l z^Rw!!q?1g7mY`dH=DGSRGi-8c+SIJ7B5W!1N$XX3gV(A_lsgxq++A_Y`AwAqlgAic3gLs zwJg4=dd?*Evu9v*!qO?zBVR_!WUtrMwJNOR?b`WjT^Ti+v-z9Ut0J8 zDns8K2i*KdT;7=t$?I#Am7x0WViTzc%6@c0t@gFgo|iT{Afyq=jeW4iu^O&qZ*-m+ z$toqA8eqa1mC4(GuQ^*$7qVTw4F*xIB3h(K4?A2&6?LY1V2h!+MHRVwJ;Rn_{Zc+h@171wO&+?hR$4Ul zfq@iv`$v#IlDEs}LtQ(vS_@Ua&6K(+Re09v6Yq!_wy%S&5AIQR@DJ}}3A9N?m+w^v zxJ~0dc@Pnu@Z?l2y%<^t;iYkOy$qvOw(;5Z0jd~56)32F{o|&M`#lJ6@@mM|NzxM9 zpfQX#X8H)Sy|5XoIfi3U7gIP=SzlE+(rT&**^aGpH|jvSc1$(r2Wqx?)1CI{z81%M zUjp?*yr)ik)@ArCQ3)gVVGHH8s(Zg$|8bmRmFL-U;7nig_DF2}X&lBr=mDI^AwV;c zIlD_p`UAG^@*0M6=Xk7sZRWXP(jhha_}b*zJ$sX@Zp`qNY9%Ms^$z#?d&AKOWf811T-^8aYF>awhxVf03|QU>bk%e@Yu7>%M;lwdns zUxoK_e@-|0rOOHzPe|nx#au?MJn`t!wN5Q!Z0N#Y8-e5Yz8_ZWub_vzhH*}KFlKj7 z5U568)tm3ld%T()XEU5Tm;Wiz7a^|!^(#0X`kIhD@q6BG;BrU@~=dBgSk9$-Y%;0ze!&8ZAi+v2~SKMMUT=Tn-A_H zUAMILPs8Z>9Oz6q*| z&5N}YkGC;?IkfEcjE{+<8$%mdgeeG#>__<#n=Q`5eG{9KiD>8YRNr3&-*iCk4`r%u z<29xFyR5$7gW4UrfYqO3MGUu6k&-`C=6;51BezSDQ&rKxWk9~e4#6%pU8FIOJu`C~IKd|Vs+6A_4-WvbPZw!fjvNtq4 zQdZ7XEB9Dc)hFb>?7^+ao{=ne&&XBV*78sLXqqi=iQil&_#oF0 z;Aw%Z+jH~NcV+EwGsmxY#dA*t5{kerb07;R?6b-Of$~27$Yo^*g|u6%X2^t@&>d;6H0^ZVxFv;y{Fn zY))7CZR2%`i)_-Cn*$KNLN4Q0XN*27HO*$IRD6FPm~D9Vz5ZvzpCstiLiBw9@H1P@ z&vU@FdjcSI%Sx~G+rX<3hi|<32f}c2DdYEImyj`D`F-LEZ9ekcS66MDx z8W%#@G`0M__Gh#Invl5BX1IndX9JbWM!W5Wv>4jXnmv->X?@U+h^|<*SQ$MCaBmxf zZOpi}h{KaTHiO-Te9tmzg~YFJaL?b6;tWJ#^(VP?iNlnHxY0%*6;z}#fvTfIYN0xX zGf~=4P1^6u#kw0Jm(Ef~Xr*5c8^E6@@aJNpU+uGhjLx3fW=t-?sX6=!<_5=cK%=s{HThET56sr*gR1c_TN6U*7%oc>#J=M?Z<|z?{jA#h1U}Dm;%FTrh9=SG!{VI z@vj8%yW6|Wp-*2fTX(a@D;sfJ27_bF_MDx5UJf+5y(qkr z=Go%TP*UGJ*{YpiZUc95TJAs-LURPrT6CZ*-g+wvizd;#-_@SDys}WF5!#3(h=#oBERMbSO|yS(^?nW{q>M-a!X-sSXqyb)Y=L z0-syZ(jhzknQEuDv5o5%#3>4@5YYn8J8G+UZPr!i6uuVF*`1z{&Sq>fww7$-G72|U zPbk|3iC09A%Q&L8fd%s{P(2^LD!(aoABuxV)1|&s=&}@8Q5DiQp+k>H3Wc(dwrj%y zGv}fbS=`m=irRzaEQWI5dGsg>CA;%%C+|d^Gio2MnlSH#iOSJ)Fy%S^rO&E^L+bUWaQ*iTpaZliZm{FemyuN%=_`E1{~I={8$8&@QZ ztkLAYdOXCc@ctfCsSlhY_0tYZhIF%Gt{TvrB;EXIU0_M`abG2?<4N$gCSRXdM|q|? z5K>NL<|9dXK)lV^eXN{#LR{S3dK1A1>LKs}&3%>%>7L`@4NYet^@wO91%7gKKeG&a zW4zv^)Ft@CERtv`WseCu)Md#8wMX7ZmqzxH@AS90i6x?0pQ5@^1tlG%kf+>_4TgQchQwi$Vs`>dxDG0ci<8D*w117!GeaziV)iz*& z1|W)PkIq4Dj%V?)WDdFAHc)#lLUEw&gR_RNAL!^c= zL^%4P(^PV-A&+-_ecqCm8&CP9kGM9nHTj@f{Z3n0di;HcWkQbxY|85^bIg_%-Q{Xr){E-hu`JY_5pfr33t;HW2xS;zQoG zhnD0Wu@Ano#0yq$FSYU?gjV4!0>XZ^C+i)0pAHkrIoUdBOF8_WjpBs(Nc#;;y}r>l zh%X9*`P<@a>Av=GBn`t(sU_#PT!teT>dC5^%ru)@&Uge%M)((b5Un;?Vr&>V)@ z&GnX{c9>1VbyLC~yeStroU47zvxZ8fFI2H~FU-?yr|kbhgSf=|x;Z1H=U;(haTU7c?*`?Z3nMb=>!HFi6# zkU8A4%NZheRcGrR;S59Y4cag}vVj8vYTsnBFmSDP8H-%n(U4HhQ|MQ$`8Qg4*A~vf zgmZ2`&2tq0Rruw`INleciB!>ke4=E~i&r5$Q0l9YEB`3~oD4qOGcOJ{1w)!;4R5mx5DRe3B3T{}JH-U)O){`Ls6m zNaf=@tVUKWr7Mhzd>!&NzK-MQM7RwPvZc){B%)bd)V9;nS?)Ga?$(jDW@r3-U$Z0h;Akj;>kC zt~nH+MtQ@A2Zr^x4I5p?>(s{^9wEcU%R)WNA}|h6@e!C2h)bdFA(rmp(g+k_hRJwF z@T7&Js`<)Ey?9kC2ANL+{%H?BeiW(@xv}~1efK3=_2*DjW(+mFI7(ho6UVywr)?Lb ze-;3LEBTKKm>VCW^j*rhtVR^a%&TsaP{-VejY@>hjH5;t$IEMK(opB`d-<&3wJm=Y zb79-pp9R0SNCa>S@YJZ{#CTmyR_gkFvr)A%GXA-s5d7NpaHk3n3GXJX#lAza|(Z%(fzJ9|BWy>m9+laSdzqukU%5xVG~5o zutmuTh`hb-wxNTMKr;X3v6AaEeJTw>FVdG0*~m0c|D#}5j~Z&36pJGWZq*^FU^{v zDLe6RMlRHGF5xD88e*D6*=Qxk9SR)AtQk)AjEi~rWWT5}w>KR@WCsu9ecJ%}4Ks0Q zGh5cXleM1pU%%;Xw+60FI4U`MRjHEOKJ~aNkH{8VFRho5QE0$DQrefd2w-?&0~jN) ze6zfky$Eni5-QF+Mh&$Zh>$HK(&swm(Hc#t-B8o}p_FL>vFh?J3(Uyf$C@u;Yzw1l zhw&L`B_#wItOJs;P&@hKGNg{h#B?+tJ{mea^1M9EJfofSJ)3^sl?P+AW62xRgexo2 z((bC7FjLamt?b(L$rY4t6Q~->^QJHQ?xYes_I<987TvNXrdR*R?O66uh^SodZ2eSW`B)A|T+nm@yW>^0OD{WZo&^|e>(whS9IMRURl9}grHwS-TQ6tQa< zkA-3D?OiXeoJNT~f#I3j7mD+F%G}8a>6ue6udWS({*?k4JFKFei}I#OpMNLm{C$Y$$02(CQGb9R^H^>5U9F=*-O)Ex)f6ErtdO=YD#`)<#5 zGI3^BhjC>To8uOyM!7*}acWoM;hKgmD*OXLg22aAeoIw4-4<+J|kua*!#z(aP)EFfG07) zK03d<#oiSn!)APmpK<{sS}p;0ADi-ubF@5Bx842&W9dEW+2R0a1h$nM)ko@Sc&-f- zX^AG)%Pm5CvJXz>p9j)uj&%>>=(y*^%Na)Jcl{@%3Ry-zc&wX>3n}7C{goP#`cMa3BaENFXR6XdoCMSRgnccpwBIL?9#}WFQnER3J1UbRY~M zOdu>EY#{fKLLed_VjvPAQXn!Qav%yIN+2pAY9JaQS|BVNkQyC0UxXJ1LrcVN?6qm=!Cf+L@()=f~CAcx_%c1xc_;k_7FN z%sTNPocE(888VTp%j)dZhUVhO*XKYbQ}3ZMnyShy>6WkO>H$na*QzNE1-m>a(Ni`+ zT-~MhFh{Zhm(VPHf%L5M2%t34$-Ryk|C|1q_i=U0PMh$uM8BXrI8#CKS>5{W-}4WxfMh7XD@T^=I8ssvwN*kyz^g}PKA&qV^-M^V~Xqvp-m%~ z)Vr(8N`SBD<3=TR!-9O*m`M_)ZL*V068G9gTrKmj037~luACeG4S=ij{mofkWedyE zZ#!zmz0Yv@AIkU?B}{Ayv}iHiPt=ulgCpc3_11h<{&9< zY4F~H#G4#)p69jLpM&HR_+2mf$5bU|A%*+&VcYfQI5c<0s>q43>E53vemakbq$kyx zr1U}c8kU<|Sy_2rEC7u=xHhA5Xp~UXvkQig8_+tiO&>1%}Ho$E_|X1 z1f!18MZNpeDifxvB2nzirht{4>ENTcg6ijnMpHDVl!YLXJbJj$yPsQVhmSIh)COxP zKMs|`;y=0rfUBaZ|A>qJOtek`@FTTql|nq5@f?#gdNQXm-SyDdYB(Ev*-JvFf#KML zJb3)mw$41{2SE5_n!i@|IC!Y@?5Kktv=faN1jR{g?C?huR^T4h;gL4vh#yR_O}am) z`$N;buOq#|PaA6!!oNj#F+EhK=H%yXpn$#!hv}+(5_qKPgbB(@Cz-bv2#q&r>dE?f z$w53-NStYB6-#~MzZOy5l@r51@u1%Ui+2Dl9*K|*uzGjE>gBuvtJfUko0XX19Q(0d zS$dI6#i9@8IpL+FG{K{9NT}R<4JEXQCely{9rh-^h4r{3qfj<;2_5K7Jiw6m6~`yb zP?T#*e)vkHteHqKz{^}s_I~VYbrs)D^gv3I1J$`BkRCTAj0K3!8O&tvQNaNYhlzket6gijp^%i&k&wXm)d;_AWPbl}B;{StBCy(j{ejiK0#@7U@xN;0 z_-P*k$w}>(o#=$eI8YczJL(?DMs!O3kR+h2CfD52CmHquBG{3 zr*KZ%h%-+czxNlf2ybaSc7i0?DQ^t)UX10~NE;k~Cjy%>3~UB-F0dKY6?T!~<7%k|1Hs+&owj`rR-$3(HY+0de zuk$mL{LvzYBMABm8rLb?{%B4$wrbzqLM+PjuZ?m%$Yjx!arOA9J60M5W^U@|7S=m3&8z>V*$hVuI?f=b%QznbZRq4d?%2b^pIZte2LMF|+2ky=)OP z;V|6y&o^b$s0*gc7rVH9_V1%2$MEY`@=HcyPB>m=`{+9WwO3~>@}-@CBm&8_ZD?`Z z$)enBZ$G41o1e`8iQCD`EqZ6R#T=%`eK6f=97ZuXwpsDO567VTVDRN%9C8d4>%XAW z>$b*4)_r!0m}$x2t#OIa(_7ZUGv8;iX0XD2Xr`2X>7yR?=g(IW#vR-I{Qj^I%Ddcz zT21G`kMTIbkA!emU-Ekhd|*dH^w4R>z&oAFKTtdQ*7DB#?>{L?v3}kdlD(jL8RP&b z#4bN@KuiM%1Uzs+FdjN1MUH~c64_RnlU~d2SW{4e9=nGSGbij~;sHi}m!yGNrzP@p zns5L%)`fhhZ2JT$@tb8Cj4^94Z#X}6Ui+Oi83tW0AAcE@Zv-SffsiG zyg1YUO)q$_q-1`qiG+=jplpz9;z@}3J#GtYe#u@~j6(0>hw}Y$f}2G^Jx)bK3sTk+ z20N_pYq^07GR>k&-Lm15AKrit$)6VHd(xk(z}wN#%71g_(4Ck#nTy-HXpN zpxDo+Yr|YTOVV-vRFZ8*3Lgq@Epzn!u1jYO=H$PoBAT{A%>A#aWnLhBwzzM*aqw^3dF31@5~m!U<%(=lr02P(?@b8H z1HM;F2S`6+BCI67xe$-{NsO~llQUo+dn&o#_M({{ye_}R;9k!*k+wf?G%Wr?2r`6X zK^W~$n^WE8GMIHI$;!4jkO|Aen7u?i!*K&|D84Ltpmw3%5I+Jw?>0z(AE1RefmqWH zJcWLL;7aKy(EmIC4Lnr{rp-yJV3`{zfWkm<)_*FO*KM6C6P|Q4B1ss#&`oz+;5F*b zWRB*N$e;t*{{6!nz%w(1Jawync>19|^W0E5-f?zmr?cWgMmSM0kY03Qs`wzUdke?^ zZ<6fknVqOwPI9hI9o#jo7@xv9G)S-;hFAy<_IV8 z6Vn#i>i;=PfdBVdB4h1QQOeHZ@pYQi!z-#qu>D|{3pP*kOr{S=SM)ab9Q4tD zV0YKQVooyHd(=lXQ|A+6D;6r6c>PFK>F;^rTT9r-0w@O_3L1QT!iV;L?bVLhYn?57 zi`4cQd{P15pwW{#<=T2q_H!(Vy|nNGa`^5OPjdzx9w<85Gi#tBm@YW@HZ_;mj^19n zO>*O270$#~E(?|NH4VZn|UfCd?_f}I_dvj{i}U>t_xuy%J#hi5Lbkr z7`9bZ|7COg%ZLALMc9C|y2Ge(Gi*5C%%`Jq>!accGG-L@2i>-<$Wd#Q2{p7uGABy;w2#oxrE2?MfH4uO45oY&kkc+xZz@*$i9ctaf@hgWzFnIC42Rr# z5p2)^Ofx^uUq|NU^p^XCqiKHAd&E1(6RiIHxs3zz{`u5YSC}xLO%Ql@SsD2S7P6FG z3{5LF**HTCaUY38TTuZqhztp0Xg;bQJvRl71pPAPscOc5=J7k_$mikkMdsIAO{cFF zA@#_*P{xN3jE&lJ7BM=0XkVeeI)BwI^QV#kCSD;p4qa@&;IKLOMX(N^0=heQs>Df? zLiRj(V~3exTEWMog8Hm_`sEDp&6dF0s`o=s&)cRc&2@`Y$T4RlMuAiAbRFP(L-DAU zt6fdJ55-xd4!ZKE9qod=hI_3@0BFoq%`jR0miDC1?q{Vp0S5e1)+*`<=OC9$|WgcPPyEWI<13;N@V@|u7 zF+xtp`f9~`ig5LXw4n@e1?9E4po+nGcTy(Xl-{f#C%$`uHJ`1i)P$lOc%;MS4nVy6ok z;zFE{jay+K#m~4weLg zSzd;p6?MTv9_wc<8=UcX+j=)%7~$#?>UQ%q7u%1NsbmSW3hWrau>;8aE|ir&Y&q=< z|4s?tH%5lmk;=;PnMY=1RA3p}?bgPLa+`6z;xd%(S4gX!Te>Kby=2tY`WNKHZ`=2w zyAZc)Rft}iLZONUerPox6IP;m$bf{joy}ky&wG|1N~B({OJ}TX%PB+U{N!@aVIGl) z@lcGy$-t-K(7tHK&jDzs4N7#R%iF9hj7*|qGF!*ld8%j>djgR0>$POCqesNj{9{qG zZ4oVQIAmH8J$PI>TsEje7zRr%64uJ{w3DY26aKbXae7!9JW~DAovA>*;m#ewj~9e4 zk-C{x&a00h#VKKNOVMEaGw&+kVWIkHNx|rq@_4#yyIhX@=>xETY6v#w~jh!HvDhdyw*Z}YCmMnRM3we6m59+0~gH7Y0NUrXoOP0y5$Wkx|;2(@@}@Nd&~+HFGO**$l7CHi3Nrddjh*V>cI2CX10@na0Xmn z9Xn9%GOprPv>R{;p_9|+lF+SR6FCx@yax9fOa#8vpOhJ6-4X9<=uzx-X}d9So2zK7SfV+1$%! z0JDu>m%nmGwzfgY9|@7CeOW*80>;s54GrH-pz)^s{^QPh3Uu2Ua93UJZFGJPlPg`172!N-yQOuh#!Yr*gpfLmWEm7<}?iMhT6Vo zJuXqMBW~=R!X_9JFrp^pjiRX|x?KWI{q_{JW0oCVY^TT;W>UaVBab>Ur2y;!Fh~!h z#P(nKgCduBI~qyggaKo@PkQVKTm%)X_9uF)aMUO?mzji56|y|XYE6=@x3gp4fU%3j zFFpR{V-&C2W++)vhrMD6h51YYJ!9N=HTI(V0EdWAOHsIE*e^cxHs#HjzP>GH?7ef21-$!g#uqd~4? zS-$)C16{`s&*#zb%~)R`$J<2l7eKXJq^ZXj3bs{AytS=RSHBhxS^{m-U}Bc(syy!|Z$R5S+QC zfvw#8xC(l#l2#yn&`{@!T7U?sSgiru-9EpzL9!E{!LUdj^-C?)uI28(B7hNp2iQ!V zDU9R9I28Y+UuuXAZ31dgC>@GU=$6qu!pTju`i|TFk3aXs>y=?uMzHALjumEyN~`hz zc$4)6+IQnkX}yXH{k*v|w?>WpJklr}=hlNFnp4fBjFBd_*c-$Lf-UADyKW=idWu3* z+v}QI3_A(qvs$pBD6ikKIVeVmhg5b=~=a-&nl*&+b=Ro|f41X%i>29%+}G^B0& zW==h)mQm6R3b?9qeUJG3pUmea)ptxLQPwEEDQDR9Tu<*P=eppPf$st?h)q1cXJfIt zUzuVooM0ZXfsmc@{Q0RnCaW}HfBMGDIYwUm>$ZWP96E?l*8rRG!=-J3Rn95ZjOBg4 zf3D)dF;=*#V-tbBVP~u2Ca&wp%RY#df@G zUV4%X!k^k*vZA^hGJ?v7!aWe4^B%JF=cVgoJ2h!eM;sGD`qRPhlnfC2GgL02ktatc0;NYgKF<+P zl{iN$;h^v>y6i~+2R`M`HTwG~OPZR_ul3h`G`P~A_f+=>qW)CjrrS`cm2mrf?O=b5R?YFURiID71mB=Dh=J*n5q3dIdu*25sy?L6Jxmv*64}ZFWGXNES-O0>cnP!H5FVE^KZ+^X%xn zW(C;!hKc~$a}T4`ZyX1H5yxJpDyy?)XhOT@?i^e7R_A&hrOPR0{Lw~Pbi{Wpy{9ml zfjErKI?LpP>j>%6PyX*bKR4Eix#PDp^6~GsT7|(e@dUj{^E!_Kkn!svj-g`W1~GE> z>NY?Hat7oA1dY#)0!(8v1IKD8{lC!;G|-CskS)D^Wm0HvUbvtD>3;-F`}QXp1|x;L zLnqaaQpEvTk81=2yMU@?aHTyE6k|c(&;lL9wqVW8E2|;flT6_QyOihZj8{?qk#X0u zcC8?iUb?d~@L%-mWRW$|bd#&>=FwiCW}QW+VhaFmqTl;>^Sgfw!BfM2GMFmNPn9y3G5k$G3=u%-S1FEVFHa_AxDRkpJ?#lLmNmcol ztLY_J@OX@%wK)%82!@sB?r)mLJW2q=vY|7<+55DmPlzdF_b3HasZq6)eSc$-^?t@4 zeWr;jWIJiQ;As(@D@vTzHh)})CbuKy0{C8VK$bO+pfRVNm4^D&_XrHj&Ze10)B~TA z<@G{Qshrf&B{cVov03ldcpl$tB+KQ40<-T)P*CgfvqcAGeAHw4ZFAcs%{l?yFYq=^ zPEW?>U{mb5=lOcs|LluJg*+){;Xue0u(*(ulMJ~b{f99C>C0eFGr1Hnu731iHUcX$ zZrHE9TZ=N0ynzvV=qGN3!(u}ydjLM>{9>6(j*-$%D!btR9>Ip*Gl{kJ>MR#t=EC~;e?F|LoQmFCkq@iv!cO)!Ij0DTJ^E(e1ydO zJ!}Q`u}6L@#`EP7$$_@}~<}_C4G*xGpUUQ&+h!X+Vy$hfhpbgrCC?e{s zNj{*ltN}Y|#2)Pk9fQ=`9<4PI+c^@rwc3FT$61@1abT-I+Xo6lk+d)d+U4r7YT)_8 z-CGd{4Fj(F?q;s@h9*>S7PCFT>g8^STh(@L!Cm>R)=hznsdgIauK6*b1tQ4Qhz&nu zt9yt88~W|+q<#{2#}0tMSLiebcNdWM?{)K^I^7{_iCS5|CBwy(N5Oh?ov@dTfwM-y zNl)KIBIlNFn@gw9zI&tBrH)$0`$mIG#(A9~M7aVLn#M$wvI&$Sb{Jm}o^JwYgruZN zvndxaHhL8a9LnwgdD}4QBBfah)oS2$ob^5~Dm1=0F{#f%k7wV*hcEAVojx zVs8$2lh9hkB!?@*AiJ=#Uc>XT`80k=cRRvo2}bh)Ak4vxFxsgEI}8X3sc);rt9#?! zp+5_~OM|SeT?TmPr>wsqlsvfgCiWq^khhYZl;<6iAHUK$*Jw}Qm*kMKB9@l~i=;?Q zD3UX~$=5hCJ|??5bWu-?DNb;vv<*xP)saAUe62iS_k_oMUuI@`_-WNI;$ar#;hjFQl`)0{K#`KFo76X*pl7KZ@_&WvgE4uIPwUe7^ zDjSs@oJkVCZ<$IWu$PIfWXvENLEFuCcY6fJ^8e0G=8L4)a^K*fJq!>5&{ zOoT*FYez+O&C|4UO4(l~mt6Wo#f@LQH^&YWOH(!^@>jXfy$ftvO||4Z?`oH#IWPd@ zWlVEtz&E4&*qV5Qg$wVcBupe=PCokn=~#v*veJLo-+EAXPG2GUAie?B1nBmCh*A3PW$dDT6NPYu8@Ih` z!G=pE`Lt1~dZA7(ZQPlq$|lbh92d?DDMCFmzwM++7K3t>!p_+Ib;9g3a`l~JV&u-O zgRMIJRHRgEb#b(DS>lk$_i;jPZs{j|>{OS?@?n9$30 zu55tL1ncJUy-$?txH0wjj^3{2Ojz96x$;xgLxx)HwG$$do3^K8rDo6qu+6bB6b=>|9sB9C4 zD`aUQJ}FKn$GwIt!+M!}2E7n}!Gdm}8xtV-UER7OpMfaawM&7fng5UVbEJv5qBU@x@EBl!R`48y3?+BGk+o@NcwG|k6fW*O0NEG z!vdA8YO4FG)h}`POEU+xj90_U>%v(i=T|8jwKdq2b0mWgEVL_+LRd37EqeJ|YyR1}xmSeE?ryFf$e}3X81vFURM2^KKuwLBsf016 zp+H?x&`D%fkqLh2O3|Qlo}@}AFcl-(BPmfALzoDo{3E#i(G3qEMJ0#BVTe?#P$Dg^ zSE4Ri$bdMA)aVq&k#CYfAE(eMg2N~dfR9)t#m2o4Zp=;ub{A-99#?F!PlRc8n z+{i7-JZgu3&RRL73L_-EDpf-q-HH%*L7jFJL3~jk12ZcS&%6ROEJoFJ0do$vA!Dgd zQDqzyDGC+b1ez5<>l%WxFO;ICI-1nyPQ_PrtvZP8Ho_Ih??1N#niYpT5!akUa zeN}!vqFf3ChNNQ<#FwBN?ZsPXP1rP7qPZy{%u3dRB6DJ4{yhUZzc@Xq*ek)yBr-U> zi8{%gFbr#YmVEbz%prwGlNN8n5XmnZI3H00>HJn7%)hAsXI2)ed|BJm9z_k0xIS|F zSxY&=fL9uM%s%Q6D+*Lyal<4yG%&fWfh-vtc~!W$KK9)m5ZqKpu)s0yz?XGX{8`W@ zc9}D4s(I>2N2|Yy-~%quz|`mr-5zydjAMIlTe zVr5kN=Z_MS)B?_trD(a=FIAGDu@<+weS9DQvy)j*CtW#e5JQp25CDxQza>W4R3;?B zhxqunhFaK6$fuVg^Es^ND~u16CwXYPF3E#G=n{ZC3~l+p{r4CjRKhQ3q(QXXuSeMe zUsZOLlIjLsVJG47uwR95vseyKj&QJdSXjpxr>;7eA}its3~zDn?#3-6d78f(ZK>4L z$z*WfTe6l9Kaa$2bqxC?Ca9;u$+ROJh-+>8!C92fVtRYE*bU!!M{ z%n<;q96QSa24F@AgTR+^ma-bhbA&RjRLtXv7~yWeu!v=60rFqWL!O+Q6JP>9q{A zGCP|H`Q{{WC-_S+NN`$y{6%wdgrwq7Jp<_cQaD>M)2)~G%6*9BQa(WpsoNP<2MEi!WQ#=>5dI1o}`v0Ib~6tlae(@ zPIqH|`6zTE&9q1#cA5pn*i8N_R`_WRD4QJOC9B>*M5FJyIi|WiiyG>2(!VZ3yOdyKw?j`IW)E1Vti00|f-^>tmOu^bP=FR_9L6mIoG&Ulp%`KVs#TdWB4H4e&A};=O%YQ5c5b3DvbJG{RRi>kYqbs46@&J;&+ ze>*s7)g>vQ6TQxJ#4ZrUaje$kwkwu8N%f^V-Aye+7Hf}Q)F4%MAv0$bV5g*g`md>v zrL&;l&GsA5%bgEd39>EB#$vKKZIH6sYY*=Ab$niz3Ng91s8m!5#qR=|zvz*oVYhh; zTgNCf(fY@0?BehJdu)ba)8p2y(Y(z?08K?(K09>9} zN6k;d=QZ~~JI*=Q`YCPNkOhxJMQXYdKB5FU6f(5^pCpnMW_PfrhN&8n^dHBk&Y)TP zDkK2bO9$L}T1&s0&)$$Zg8+WcDkNRX!oJlQ*VGN^OJX8KfWcYunF*f!8a+8SXQ%jA&ejj#mW!9-%o$mKcPD=hh6vqFIWI1{PPQ+bCC)BwwJyN+ z%~w@5t$$F$l;W8O#`PIeSLIeishv^mY`uqX)74 za<-5Y2V$yntYhUgeA4NS!_jTsU&)xM05|6=R6sjcgLoGpZBUOxbM=l zgCKO=dz0qTbu9Z8*LzI#0`Z-y8Eu6M>XMvqEh}dLm?^~&k}$9F_OA=+*SHx`=MGc7 zK_fr+uGb!A*O)RN{oyw9=kSz9E?LMjv+<6q@eHh53b0JSFit2xj+w^yYq@cd2WR)j zkl}8`*T=27T2fR_NyD#tc*IHXK$oszDW%fuZM5-X!&zr);)&r}P?$*2< z+0iNsu-n3=nEecw>znrB2XoFl0V%NRuh@dI{c5B@il48cH9e2 zU2+_2q0USHWfQ;z+tYo;g+o>2b`rxg(o1l&3{>U|F&dFA3XyGDu4xVx&hZ%LbTY!U z2w=E(Vh@q+%}7G%pQw-?iEY`@gtkH64C9N@RxuOX>4e;ybM(Vu*pYhA>t2=Bu7Nrq zAbgu>hF8DF-J$1~{al*1ZM%^&C0j~_gbkZoX50AS5~fpgK?R$_Z>KYc9PeP&e)wqm znz0jk35S;1Y>dBQ);hhFR>XKlnK0>@j_u-Y|CIC&vi(^94tc*!W$=D^mXjSurw+3C z#H^W25}G_=H;!Zo3}3LA$N%@zetafC;Ojapk1NLCYA@7y3zL$zG?l)KeKI4Pm+Jxq zj?ea=gulww9KRjHjXy<&#Oso%28)t_Rxv%CkxE zjp7<{lfNzUR*i_|{wnc5zu;NGSiJ~0C-jKeo2L{J(&;{l-$#@O@bUjI*8l4FqRItr z=B<`PcmVt041u}8=8&en57n&mk*X2B6rB5~19FYR^cY`t9!X4tmYE6AsWE|tOZ)Hy zlAJeHI`QxX;nn#S1*iE=H@(@>ySJ=p1E|iW#KU6%3`<0>m=qnl$6`8+NK9PeF>J-h zrq$1}61oo$Ona{4Ao1;MngJjG-xmJgUCn!!ra#Sy?Qs-jeWRSV9IA>6jSdpWfaK71 zfBl*E5TlP*)m5OcNYZTn;J&?+{~NDZzH9!?=?g%Y+t41;9z4 zKd=}^Dv4?O;kWhWajKnr=|N<$U{{DG(W%>W%UxD^Swd{Tsek8`?m&VV2w`1H^O6wc z01HOMy2|>%yCX796WX@-Tf|@7EDC-dI7D?SXUBQBF0n2BUmB|xUU*mVts%Pf*zVA6TO=^F)L_B9N5YrNtA@` zozbWx0^2M$VxB0xp0GuN@nj!I0hjLr-Dfxn-3)RL6zN3Y!46DRUl{@~^cwC^Awh&( zyr7Lk7%3FyknnG}htt4KqtO)gLV_s#Og!eZX@Y$nLTh+6DWftzn^57p%js{h-w$2sw^K4`;nXrBt<*B2OA6`zx}tOd?Kyj0E_lCZ z%@Zd)=3mMw)G*YrwwDbEs{#3^11*I}_U7`S0()$u{hA*qi5zAwa{Qqcr&o zN5#&zQcBu)RN}^@X{S}(=Sdw*v6_{bu_}#=d17O^q85^n12YC1AhdRO%5=c_U3EA}Tc+SP-?oe*U3GK7u5IU9JEM(1MG&mlpI z7cIs-N!`G4rpE{ZA*2WbBURz_pwt#oEm%SqKW*xioBAQ~3rffU%vzN)YLIx%PZmZ+ zZnZeJO@HTt0%rvjh5KJ@`-@5a(1jdnDf%J``XmAyO(fOxs{+rdGt@dq;QX7MgkUM< zBVR1})z`}!)?lUlgjXbt{Y5lFYT@=h->1lWn75ynqa=6hpE( z6ih?15kXiyS9Rm1U=V)*eo7cjH;+2P`ucBb1h<} z2W4_aV%lWza*5T1i+qtz z@xQh?(;xXvj-1GHvvYi0O2cIp#1i0xlA7zElb9h_VAUa~W!0r?rfxo%y0!2Md9exo z;@;$U<~OLtI+ktyy&K+oPNcYe|M*wBmnAz+W5Nya{DC6XxLm!3l2mC7k_}g!&pg1T z86ie;XK0>t14yIMl4H6 z)#(*&Ky2$wKh(nQ>)C^8pyR;bJi_+V*S*X2?)yW^p!j0|gZa&(bGKFvlT<(ah6Vg$ z^wJ^V^>oiz?EZ7BHd@GFrq`g`O`xS8n=tUlc62QQix0oh2>DJ+*YBb~BM=wQcj8*z zzINc7o62i2PE;ofQhX%W;OBpv)qSlATcYY%G>z|@9YpSmFM}|Q=7{75hI-TQa|5R& zYc=n${gnojurSq?0)uvoA%Aj8WoX+T25T(??lmpo0K9-k5OhLhc^kr#aPeVF)>hO(-A)QC0`LKU-T)+aV~vPAK~7BmlQvQujB~hh+GEz zsN#6i@Q=HYTrXjE9QGJ35w0*+(u+I(&a4b&+&ifLoL^Px>EB&CIqwb>t)HOILd-e< z2og}_c5kC?^eCi6dFmv(W2TEN?5ypkA(+%O5ItYx5@=yXxdI_iAA z0^35*0t()rY}60#MbkDu2H-AF^q{RPua)B{8>*{Zf#mGduuyKSaz)4-jNi=7_MKEJ84$l#c4D!~*Rqeb-i@2$UVGl1A{WIgE zC=|f<=&*cZy^xR|^~YP0NL+EM4NeSU!h>8w2-OWUQI`498|%}Z-$}cF_KD6C*Ike< zyT7U{@`f~Ga=;hH4G&4cnDmASIJ4CL%k0h>RsatrqLxC2r>WTg{M=e}Hk8hef5k#& zu=jF-dEHQn601!x(;YD&*=$4@!Ogf>v42Jl=7jGfRV|KN(Bp>a@)p@aRj!U!m^; zDCen&Yt)b0H^iOx+b_=o?TEeoCmZB$qQ_Tg5N)PM5Rw(9nI&AdZ^lFsiWeh>Cb!8jVQ^=CO6I2}KJS(lSuo1m0(R^GM@2WbN_!BFPG5KG`~?v(;h+ZN>PNyfq8d zpWPi3I~;mVTuu$`$_p%$soj$9qX|X?-4pbAQpvkzNSz8wDi|NgpK4bUb@Gri=80vx zop7f#+9(-9km$g1I2V$pJNhKEDCx{Y(A2jx!^_JktqQ{+q}Tw;nk;(K#Wjj``}n4) zwj|c8hVD|E?kG~t>}3Ieb+Tt@fWJn{DsQkE5H)LVmnesQ*9&F$jZ?K-ItEvH=CM3K zaG4E+II*0a`$NzpGJ@RLBr>9u9W0{0Hchgs9qyICGN^W$@(Wdy8)+FyYT#JMnDSos zI-%qAL2+veBe&JGA-9g+1To0M&%R3FjzGc(njRFb+<@ z9P5^$|FNfi*#*X1s%!TAYxD@+o@vv!Rx985od$ikL+)>_jxWXzt$DOg#!D()--Sob z%aDCwyYy-gGuaSB1~zA_p{S$_Tq(iuC+p$7Tf&ce&tPx>K@q}90F`)jAXVR4tHVlB z3o~rk!UyZ*s1+?#&MNFXt(b~I>SBanvj}d_x@u)ARs!<1+e=01@IfV7k~W8V_`8!PldGYFhlt`ILJ-f179X<8Az( zb0N$Ls_e#<%Ep193ns~l>vSRdJi;U-%!xcrstwoGGSh#^2;-X=uN?SV?I^Nl7{_=!KlD zV=oOX`yh6wWMtBjFkix3=}G+_%<_Wg>G#o^Pr)-n+*At#+JicGKbqynBnA*LSxAFq zW@3ddbGCt>PIId7#%}qzBCWl+UHX2v2Oy+4|CX>yfq-GR$;E9d)o(r0<_!s^a{b6j z>-~5G;91Kvmf;fz@e9+ON4Gk}3nJMg5<>3>g|rjMHJV9igN5#X6K-_4O@URp^R>lg z@@Wg;X!m=p%vrs<-n+ZF-(0Mn_kg5Hgqaz=kr29G?jpj2TsZ9T-EB2-}SO-m~H^{M5K-7q!c-dX^*Xhyg z-YzZ5-hJJBnX(2Mscx-&eEJtvcWtih+0)L=r~TUi(>(9p>hbO2W$eiBuFtORDC(>X z04@I;dJJpCVikO;?DB^2{do4;FFNzkZbBi0Ph>pR@ieXoN`@GG`Nz47B;+n_Tfm`` zjwkU=v~T7mA$zv;T?k%mP`B3YrditeY6j%GWI5GkrjlbfySxonVt_M}^((K9 zqku+C6{_3=Y`%enknrDj`A;EOkgOeBfZtxKIKNDb!WCz-pmT!nVE5ne*^KQU+kd;c z`ZoJ51C>aNc2pYOWJH)*gQy`T4oqzzf_IW+kBPN#FdQKJ!TRw8i1k4&9j(#z=G-7Y zW1baCX+-KQYn15*wdlMB(`*%su-gz_(UrN1sP{p<3@$X&4)D~mYk5AE&>hfi0L{UDsI>8+{~E}Q4av)5}G|8BwU&Ib3dwg&eOO|x!)wC=5fKb?s7SxZ}$i_q0= zz96v&56|YvzfihS#TDU*5sE}|M?Z+O`a+&oqM7j_c#x7Oz z=^b?GRha!3QDpJd3p>1{=S}E@Xa+hFT9jimHhw!b*JFv~lZX;?YuT?#4`2(u&I?41 z%tKG{gkr~5mi@@bj27E>6vsda$I@k%`Nu*SyX%;ulHkUM2qn2vcNx^$Iv7uzdNmIs zHB{p4>(O-f#dSoiS7kgnmnFS_19=qN7~pEM^>X#8Fi8hCiRW-$=VI@qi@sRtRO=Is z6E||iaP%kU70(SywG{ZhR(cbH7;>xRlqe@l`ns(IO?v5J zG!COBsydd=JZrx|`2z&FEH9;Ju?7J>1&2$Wl5+_%_oJY}k|}X0@mL3dA`7z9Xnx*u zno&TRB+!~gY6`FhuA#~zr9&*Qnquhd^f;a{_-OM8!4oJ`NIU(5d1)6t>QKfF5h6Up zg_^sGH#|tJ(}mrU9W%XeuG9sWn|G>p=ftiDB3%BP-7$mL0c?bNI(ldp8B7vv1l!&P zFEYAqs#}=#8}lsl-$FMVxeI4oSmy6)xZ>0Dn#glkbq7E~R^wx?R#^~OSYy*GCcchu zDkP%%3Vcb`z#2Th{D&@>WHz70&W&FPc%0z#bf1ySJv{z06gND+i9HegF-vujiA|;k zLJ<2WD}Tc13dm#XB8LeJ^A^WIjLx4llJfBwIPO23Pi}_y)_G3M-W9?5Yy3M=J}bVR zR>MSv8d3n@pI&wRo~N)FdTuXdQ(3;j6i`fAxn!Ui2KB7&xtX~d`cV=*^Y9aDej~s{ zvnXPc0c`K#ln|k^|BTPRLa5}Uw}wKJ5Anh?D$|)55bK842)<4@uln=InfSNJM9CzyA+wZy6j%)2s_x%*-rV%w#cH z%*>1yGxLZgiaLnjsIJOc zZnla!$hkOtwQiNCRe3&TV@?21^q;r~Ym*z1eq7re7?5cptu=1dt#rvZK#cSmGi}$i z@My2!E*}IQ9RWn@wv2Oo*8G)d0jNKVvYJS-Cb^XcyxPJsSveOYh>EpOEI?B&*GI;I zBfp!a>(a7?j#stGMDpJ$J605opk?S8&2CLw9_$IF+iUYmj+HvS=f~z9{sdzZEN|Xi zeTgorgCuG5>jz=B`RU{zFh`UZciuI+ex7ZvmDq*KA@ls~GKKy4nW80g5AeI}&#&U* ztNdSsMKTPXzHW$vL}Hxu`Nno!q&4%zvKhD{(PCxeKyo+&bt2A&oU!k{&D_p@&C&K)4ACF6Hy)_& z>4)v)F^j%$qP7a4--S-#NEv*mmybp7ubEb&vH6X`>1> z{V3#)Xs*=yLpLkhLkUj`M;WQtVWp8IxEE1FCIyBApI79;oI}!vpRI0=T#m7=1_66F zA<__y)`D$P;h;u(wfP=4nt{|=;!o;GIU(Wz7F?ci`TP=X?5zTT8Z(=hV3{6#^l@%g zsBn-7C-JB>zlg-^77FOa5z-I;o~^GZ6M=dj z&4-P?%q>Jk%Db!)GfsF@B{g1M&#(I!)2Y*@Fu+TvR@F%-2o4)MiE3cB29h`yJZJYM>K40t&EqkWT%?V$yaG%8vowtMf zSGV08 zxrgp~@!_j1U#iN16hT}^H>Y_YSDpHy88Ig3qEnQPOmaTGgv;%o)!|MxPNfUhgo)y?bwgi_BGaN7eP8_O#B%Ex&r@w3c zF)sUHhVv^x+ZNq`(4PEB%Ac{Rd7*Ai%$$&`4Jz!3mPaZ|Fp$O< z3M!`~{1!B%ZZe4bGxR95%Q;o>2W|h0x@U^Y1Rcm#%p%E^I6gFNcsC^L93ft#FZaad z>FXu@*k>-{aNmu~9y6ANA(S|Uy*7QoAC^lN|3c4g0hy0Sxq&S_FwJ4s0xY%-Y z%7xk&h|ytJq5&WypUx0-(!@+f8HK~RoVY#<;*j2zRQJdlVBETS?n|+vcCDaQjvZwU z^H2`db$!;j*t8)}SfQW20#UR5v`L)I6cLiV9#py$Q{y&^bI^#cgELp$YZSLOOYlVT3n%tqBZoM}&tVJmD^qjxtKDw) zr>kidlNydj8=Wh5rXBGe$`lkNVX>6Re(D>0@m=%D(H-+qFkK+i``6}C94oxcqN~+z z^58bE1fk`rWLe%l73Ka!pi-c2#Tso)ED8$J1hjh-vmPs*vx>Viovc+9`gMt$z!__|Vk>+g%o{6AJ}I z8Iwex5Fb%wm!*ImWIKp;hp#1Bp0`X-ogDH+H$${l4k+czqU!nPV zUkUSzF|`+_b)8hcT*y#ul6m5ej@_Roc*OeT@WNl8f8{OJ5VgpvIHgTnEYmH~iG*?e zfc}-p(3vt*91qLLr~SAJ=aY11my}SM91ifu`Sxeg##vR0G$q0(Z94THC`Brzdv0ri zHmRpVnBWel!{2ttNQ_E6!~bd-ydf|hAa!!kTbDH16k=492#NUd*S{IMcS( z5@uRdRx68=#M>ssK_Gg7uO+tfOASD%tq^t2HUa!%cw`?dbyxGEkv+FaK{F+mqq~}< z?W)iST;N@j@K<>1;%WbR_tpLO8T7t%caY}gl`(a4(ljx(uRNDg;KbsUp}vno9KU)r zCf^0L9kZKW$o<$_8@3zwDMs!U+yTwff4qL%9e99xCEXUvyL3{@@I>c^oZJ4Ww-Ah=6SP(K&O2}a4EAs6H@b-!X@BspVA`S}1jmAm^@7*uEuN#g6pNuOR ztSf1HDcl0W`nqVDLNLT1ao_VQiDUYxZ7oTpD}{)DXk$MJ5u~7-ad`Sy88IGz82TO{ z>znWQmTaW`%5-9j!2Y$tZYCg`HG@9|TseucSkcZPrk%1eT^0(^I$80;QYkkdCOxQa zUI$56-v!4@^e9QUQ{J0ECLj4)T5{XmFVhnC>sGLS$++)EsweW(tX z?hrK^#k@J;E-e4fV7HXQZl^?&IwXepl0mTmUdvafGv%lc)_P}*mcJaOIQ^%cKT&=q z_0TJX3E_=tlfsQIft5m`Py9yy_CgweI$E`#F4cN{P&P}==Z|u-vMxj2x+R|sn#+!O zN>NKYg|4tY45Qk6PNDhntS+x`Tak}%fSw*^4PizV{AZ<(s&3|cc1sghs-8z$1kZhg zf*OGJPgpt2ZB6>$OyheCj=mojC0~EUeOY5Bp+<4@lTvJLB>H0Fe&VyNsU&YFM5JPGr$4r4 z!@zcTcT^G`6RgEKW{W^&oHyO{=*RI$EPw(W)s}R{+kT&P_DREBX!#_Cx&8_ntm5i} zlVp9`)<5z`iUF$^Uo56tga3qsp;sXvcM9)>IE$+C zWYy;RmbLG*jV;SKph~YqHA|-MsU6shR!&=HGe0Q=_XCqU~HH{Z&g{^|W zMU5qf8?HaIML*~~6{`?G7-^Z_cws;%Z{zYbZogaN>Yz(SOieTE^2^{y^$1{BsGU%x zQU;b58LpahY&ZR_?K{|E`=uOmrR0;^VfA;sWQ226j}+7EPoja`T9TR^DXwR!h8VLh zu`uakigV~6F&FbpH)cw3$|1rG7Uq(VvE3+JK`RM?L2M;Rn*02e^5@I3cT-Z&qEM8I9Jjj;v`J*+3rfY}?+$tADx3C(+BR zIK^|O{BqZx=k)&6;b};=0(SU+HSoOHkzoc|E793-NpW) zlfT)$KKDq*%G1Z1KG)Xuc(&P6(rp;n_iFn5+C7WM^9C8o&1$b?*mG|R&l-4Ny2Zo; z`YM!1DkwjdvCgv|)(8k_Hty-tJ38tNJOc?tV}ytnnm}KO{lddmh&x_qlWUfHsm57- zx^nHB5L&!Gx8^F*f09Zhu)K@^{)yACF0=7{6B*xEkkgj=s`ru^zao+P_^dLDyQ0bL zucmll*Q;~0{!z^Gn2qw;7$=+%JP9FA*mt-d_{Xmg5Z!yO)Kvguuc?`?x%?Ad5aE8> z<@);3Jp;@Dc4CwiLk&CQX@@vE?sH18F*^sq35c>cW^c1I}!b zXSQ88(JZVt?LEMxi(gCwWmx~-!(41|Fnc4{2O4JnK`_X5-S))jZ9Xq&aUQ4fLBv4B zILISJ;Ly=JE`$iTfe^aJs#t0u^GI5QV{|w~o*UNEt43lVGp9HNVGiTo;Qj+!1^fI_ z;Y*OD>&3urYp@0j7b1(yQXvoFA>3do8I;%ba{%-J$}&Lj3u3vC`e?tkbnOBZq9sJk zUjjp3J=!>GB)Hp343-5cRp$XolIfBNdPBQA|FutFqBNQCe*0o8=t{H2EggD*SD^0N z7OOf-Dx<=p3m}%q978mPc}4@3;gTe z1ZyX)jdPsPP#Y?!{b1Ndnc5>$FS8rkG25NAf9wQKy8(+7Id4Wgnlw23)jw8(2OVrB zI_!D6sg6W3*&zR@R>0_y|KlB76!EqPtBNC95XgM=T2=BUsZ-;R)Z?vO-6Xp4vI@7@ zAkkYdlImRPs~@k_^I0UT*r9ZK`qN>{nVuzmb@*zxL(&FQbX^8#<5N_(>sIyj({)~s zCRL?*W|2;V%Xxp^6~HYjmI9%5Ou9qJkLHZjgXWCJ*QAIN$Hx`wr7~@i>KkmquV0ZU zubP7YQzZ_8BW*=1ih1OT-aQI6?FEjKQe{6vX1 z`NZ+E3SHb5qO6otXxKN=(;_xbcaw$it|r!b3X5|jcNxx}L)EecBoaLb``~zfoq?#b z74Q)=xJ7Gz-y*2tBB&__LwidFNqSvY92qn7@8tIjQ^7yNb)+j*K$cvY-@pDYMXdVu z`)l%*m0IKy0Mp$WaTr%QuPC(UB;xoqep$awEnb9VB0e566hw!ri7c#53L;f&77V7<5WUp#6?yucrh|hs z!KHmTT?W-C8Y~tx+zl-5n1}_Onj{l1J3EZ&FeDWqf+`eIO&<1}M0jPHzBHliH_l*& zQks~Ql#x58TuOZc-8T+}zK?6#WJa2`Wc_%ArZ!+F(6`6??s$D?@~KX#aU~NSSIIeg z9FmMX&6>Rf4Rvwx9^A7Jfj;bTzfpXeHXM&;7*Y*yE6~=Dtkw@aQGNV%6e`Y^xpQ;F zPL=?O-&fk8@&`juYBspgi?qsxAMQ+WPR-F=^{V4>bre{+&tjT=h-Qoa{<6t5njvf3 zU9>fNyA9-4x;%vGsBgQq^>Y|;i8WSWJvzIeIW!~P_I|u*f4(@lnfNQttNcW6Xa>>k z5?|LB(R%=!f*&~FWzL27IuiIxaZQu9MjwMX;y%BVP5#LPD#dy_&vSxWJpBZEGAJHCvn@U=OEFnlvhJF4Uf z>W4{JBIP{uB*p>ReZgyr-GEpP*;YvhC9z%C#!vAzuUCPD&kH~5f?y^dP}=L?HZcmw`V}};92r`P0;@U^kvIQ znE~pug^zn&FBzVD9woa(0(^{HA|oz4S(OsBYq)5HwtH;w>sVXR`px*ee40rvj9Ik- ztmU+4GwVK_?xm}XbBnBti?@P=QfH7z#Tw@3!8S=oWeGxMcOiCoBe_J*36TM_gLnRK zwj?{LWNlMC+HU@Y;M_g4`OW8mgM-_&h%u~w?aLot16_|H(dKnMRh|9Qh4uFop*tX? z!T0sS%_Hc+1B%VPj$K?0r{MGsIrsI?cAN1j_WL()gL1dQji--jH6(S{zwcEm+r|9m zqlQK*O=4;~HgNp@4h7oMGHf83U*4Mx8*X=Zj_yp|GweO#+y?G!CZNm$5Rw|7?N%~t zOZPq1_6;a@#OFsF>RwsrIE&?CYMu|maX?1x!{cnn_m|3dZZU`PfG>z z;vOb1osTTU28qiO*-vxlzVPUd18hTRK3-M~8&RD{;!q!v$TFMQu{Fs${$O5EKLHrY zU%1R0vi$+4WNWG|8;>xUKS@j9H1*Lm97b3#3EqsAEMGF%opG_+2kfOPWFUC|nLnWi zjOZ#l5%VDTTsF)%U5GL!|NU$NJuaPxYaL8JTU3`6y3Z6{IO=HI5PY}&sG8$)&TF(d zQP@MZkwts@z4)opMP5@Jk+~JywfTeIy6uBcg@%(#<h1q0?ug+@v!n+>6^AHhxcc{)zWgtY8vb|-BVuBv^tnOy4ku0*TX@S#K6p6bOK5vaQd%QQo_J(x-u!UscZny%W;Ujl7u`lxp#|c=aG$ zhq&~@9|!&7X!wmfQPqq7(_s43S?!Hr-bH1(PfhZh*W&xzy%fEvSLvt^MZ}>Y#7B8RbTy9 zuYk{wXY_dWMsA33GQe1^RkWe8d2fmvZxaj4`i}^Z2<8PD=x(1eR_4u}kBvx(_|30{hwR`dPS>JKyKUo1=q8b3zgOyoxCF zBgmf7bed>uD*PKm={8Za)K7kbdjZ(#b36^)5IL`#r_rJ~JVRyGo_1C^O< zi~Z#cE6Yq#5zrMm6F-TjGZK4}3?mTVyA+>5Qm%%6KY-*g56ES)_Ac2A36+;GLB&1)GNY5yETFef+$L@?JQ@M zDS-8RU|v{NPStA~kYXC4eJr1fn`)Dpz8irBYC~lT6JSNwp|wO_S%(yRX0KqxMrp|C zn9jn+vb_M>=Zxn0i=}b5{yUBb-g=G5z*m{vr+B05Brn|VlOs=rm9B)Us$#H!W_# zzwk3Y4&d&iYh_I@D8f49y!=bWl|Izc7%iIwoT{3-A%O!g_NwRvm6ui)=S*vY6l7;J znk0eH%af7Zv9E7m1H{*RWzK3O+Eit0rpe0Be!S}$5QKjuhD9w$9VMI@T2F8Y48C~g z98srOO%qEQa|`iqQ_BgPPa-m zZR;sw`2uoYD5!f-@@)$a8= z(vU{qoYTJJm?#Fjv}hAzdl)jM5@MN>m@(nOs$n6Pi9+e)+eaE`p>gcx#8OE=8V%fD zHbCl^r|Xp~8fqoKles^(7gat)FzH3DsZ}poRLt1%cwMaUs1VTbzR2dtr>FWr6w%bV zRZ*9miYaT2geNgPC-s!t_Aa>ql&(<%wC~&bgUnfMPWdyK?u8rO8f?Z5Y;AaFf2k&Q zQp#i;#z5765AZ-QJ*)}EV(&~AC)d=*0wyP(@gXOBq2{s=}z$)2s zY>(J%ru|XFe6N;g!{jrK5SyOI`7LioO{az&5+}(@*|ZDI0ZMcS1xvaC7CEO!;&McW zazbaQbvl-wYln`%2@}Z<=Z&&eSU(yTMr#zoP(>(L@54J1j`+`?^i;;wOxKz*j&eoo{r!q_v3De{ ze*q6I!)xByFzCXc-2iC@2=~|g+N3c=@R?lRQ8|;i#ZVf$=z=MTm#wWcnr)wbTQc|i ztR}v3#APjYR&>MXQpK(YAb|pU4KmJj_GK+^$&VKdA{~eNoIT{H-_*Garv@Vgj(jq_ zCCW$yv-l%ikq!=-XRx-d*pCqiR35N8mEU-wIH?9>aV$j3PDJdg06@J&eyRi~3CZfc z>lxlkxm!+#vg*Y^94qURk%a}bXSzIcYXXEfCT76P8``kK1Ppzhvp2WI>)*YLb-WnA z$6jbB0tD=c6w45pV(0R6U80Cb!F_soys3N|)ecurk%(PNHv{#W&SlIv7QRa(=3rq+SZzOG2*X}`lir&9? zkW9>Ej$4ki@!NU5depyq?(W>X4D;$1BZUI}`vP3Mg*NLk0W)wh2m3R=Iq~s7Z<^5f zapK$|$x65$di{{PSPSwUj7S>VPN4OLeRI?2v@hFFDCdpAVf{QOmRX~^Sue^7|A({F`gp9=5-B1&TS+^3hb zd)S=(^K$A609Rxg{Zs9oXkkxdNnqUWhDDQLuXkr&AHb*i-LA>Mk zAOlU=`rY}op|GX;&uKHI+vr;GlZ0(iley)T0i*L{1xmu=&BWm|&4A0cgR*h2;X!0) z;3cdea-0;w1@;@^hma;l){LLXaoSI(QkQt1ZTl5+z)w_Z3HyH1D8o!BquU!0GikGi zWoO(d8Xdd;*HD!iVHMDK@9<%h`)#a&*N&Rj8T7u))wpI;s$q+4_M1&Y@_h!BIqyDv z1IzA#pCNq4uHvqNTBO1-s|b!!DT9PiIo{~H$gu>Ze`CedNepO#Eps)fTCjn~?P=t| zBIt!pfE>DdpHavw=6%uZvC*-gsd1|Hzn`eb!FP|J;_37Tz2%5?ceSx}Ou!g8vgDl2 zTr@n^N9tm$3E%PD{^LK|NkT*|wVNKNxZD}PWZ^7APD)IF*2B_7!Aot{2Cfgx%a;Yt zu%MY{iT@brW(f3p>6gM+gl^qKwf_@TMhwV6|M+vAgu<{^DA2@bGF{1)+BpRa$B{qS z&ecIQbi>9M4ID*&i3za15D4(F-Uy?d}#I&c<@qI&T{-#Bm^>q&;*gce~0I_=8v zuR}~|Z0t+-Q7tm(1cc9g<3F=9jIVFOLq?YzWi|w1H7Z_ZbZwyQMB5bweW$M4ibDseZsVG4IM_J77g}y8@xHah5uDWnl`g#dN~E+y9iTYUh!}t} zd9CBm)HM~k|`rc$!}NQUY*w(V?b_KdV~LH7pxPTf`R7k9Ea%_&{EGBSDnlv=IYWI zVZ7b%XO^bffDP(8A97{=HI9&M0Vy3#3ZQ(?P;PiRo@X_iuSGW%0t*CnzVBzs3~zLJ zSdM6I6ot(!UdQoh3>|9Ju^^582>a}lQDvWxPYww+rT=TEz60X7jKEkaxc0OIsm~1m zmB@ZsXWfxl52OeHgFuW?*1O}Yte!`3 z$`2;O#eUCTC)SCG%f-f;??~ys1(9rAs6mVOca}VC~t*`r`^F`cF&_clKC0I+zGlyYs^pL=^#%u!6LOnDD)K@ z9OA*z-fcD+4`Ed-ZC5YkbAvO3@JKzEMOgPQL)F;F$Ki${@%2O0$H!2fGQsghdyjxZ z^Se%4gvT0r9JPWPW`qHM84}D_7@Pi=^O`>{&Q3@hR63sDDKx`Tlc}O%WDqBS^7E!6 z&lv8Rd?JE0+_?~<(wbI5Y;qpP2;$OM#^2C9A2mB9faDvHgg?7DO^)$FE~dx$q#nE3 zEsdQ0A-InP&dTHm$cdtIAd%qUNf1C}?bCz-oLG!=2P%flAwP6ybe-XkQvNr%$g22G zL=qY|9RBGN2J(8%++Zf-XioEbwM<%0n5sd^fTIF(3(H14 z$>4&ByA$WC);z>MuGa;`Z=nv?I|F9VRC!;drse($GXtKkX~QBpP`p}Ixiwz?o-WrM z#jy5zlXY7y$>R$%HAj-eN^@I8kPTiX^^8gEYBX#6V9zG^)D}C_`y9GpZ`~;5k{fWz z2P9biytzJHKHPh{Kl#Nl0RR3c}tZI1H@6wN&MT{B@R$2c$KKiNd&Y;WGXKd(L z&oZkOh*syb_2PMd^Ln>%sL1bfJBJedGhI_uq5 zcHo}I%{zwWkpRqjd32c)8jS3Z?s<;RwsEJVb7H_z*F=e+abWAK@AFgGVYs?T=t5yHxv4581+NYp*%(Ydp8r9wGE8KPZT~YdAqb=!^{$?WD z3tIss;z&2)Oa$7>I%GX75n3IsYxeppiWKy|-k-X@2z3AD#QUi%Jt;SL><37~oV~UG z>m++2J^ey}igI@=I6fuc{5)Y1@^x$C- zdPkHi?L?+jD1_Tgednbowrb!U=us*rzOoGfk@=bA?5uo^;DW7hJ&Ha#!D=J4kj?Py zS~P)4ckk)#_fhoNV0z9}k#wwgHbDhXdW2g@@wV?f*rLWIbz*NN}?E z?P|JE;O%I-;4^-A?bUslIE69|z%!tIs&CxlRC^il;jt%+PW3JYo$UukCY-$mY@h<@ z^St`&z8#>U68Ifw%SvGj$w_fYFOWo{g=fX`ce$a*@zmGWMeb_+(2E(`l|bnV$ETIc z1*$xliXe|QQM<@5&v)#n6IzYP>*EW%3K~|fFfq@TO}s>o3har>-MxH90#UFUOaZYZ_Vr z)uxYu;fK+-UvFX<6*^{e-noJWYSxht6@=KKPkseW8h&I=>xNvKR&{&+zO$wZqb8bA zPpcp?zC`WL*O3AZjcV7Z@DK+f5>T2^jnNsiUg^s--$ys;%gd%;L(hY6PoG^w>%-%V zp^uMGjOFd^N?)pi0rTwC+*A%ABje_fWSZjgu{cxB$TnX3nV$8-MUY{9YKk#y z#+02Y_**l5gNdP_0Ijw`(bECl>uYxi zl;6$mr0}$+!6&3;A$1<YyFrV6I{H}=BFETJp1JXvXn{)vgPe~a;L3y3P zEbmLo5yM9PO(PF9oX376j~Bp_kje(!%kqV`m+|!{Vht~iO`#ESXPr$x4=aIF(NTuqSOBeZT>|8DFI#Br@0dG!$_LFA#sUw|MKcC0#vZ1yhTG}aY zWmmZl%<}1v(|QJ@AVQC`Wkc0&_>3h74KH1GXURm|Rea zNX%k?wbqa=(;=QqW^xft=aP!pSCI!q@0T)kE8EnrBI8J9PQ;w7gUn+1; zS!&iBDw_a$RUjb0!|p%TT7lB15C2qijSJX~TQm8+0HBR~TjckUU%Jp*S`%?ld6diJ zev&o+NL_bFl2)!>uL290p+ekeTvUftr9G(HNz<`FlUjJep3Zt`~JZnnLwz=tc@=t6~brELS0g!9Rjh z$JXMNTl&@7=(D3rq;Gm#6@(tU=4HiNFDJ=BYm*{<^AC4P!!PGJ(cnI?JI$|&skA;X zaI8eiAdrlEQ?GBrOTey*$pm*Us50iV4e(Fzx+@!g*^8$8V>s|R8iq~U@JplENGBV(twx{d>tTP7>nUtj!1wS&VOLcvnXD2W z=#f*iNX!^xXzEk$nkj7qWceirRlFK4MET{Bd@f}d0*fV#zbw7$t~y0ZLxGP{>`0wD zsZ4n_pw>MGojR5hP}&}$PR*>+)u#Lihfc*Tu-mVwgOt1ScIp|_xhJ(&3MvL#Mdz5t z@Jl0J<})~kyL!X}^tOalH()zQjnpo+FE-6bNE+2Q^*j==y#^dTx|W1AHlV{h$r zqF+q<_)#7<14f{nRW|889j6Fd|3~m*Ai_7u4!rGuzsy?V(m4P zegH-9Np_UZvTk-wMF%sUp3`j^s>Q+>s9VwAvTWg!1&Zg9HF$AFH|=#gwRAXy0-wg8 zetIp9v{h@xqIfEAihDExo0{Bk(`(!JeYC6ai%F~2t5|w%Wde&?+6MSW;Kw;VcImj) z!x%Gw)F^OkG`*KLBL<=4AJqot#sKO$ER1*cQ_Md# zITfH%Gl*$btA-m;*q%XV#cacN*M4+3n{l4_n%5XMUcZ=!-4cl=Q;3-ds^1ogssS{( zXMbbdpfa*VP@kH;q0*;|IbO@Jj{YUlFo5lB0|IKvx%VLc)ws|BeP+0>aYD^P+n4-EfkUE-qd^%Ah!U3v}=XxDcU`s3Q@?^y&i{8#U;sh(?WAnPyv^6OhK z>cE*?7Se1tbRqgfTGxRkP)9c!<5lffRd2v9Y~9Y^Cw6J3+LY|K+@sYl$=wu zj1V{_#_86t_QnHit(hY;D{PD&w9c89a*;szbUNWM=~H5gz8G(j2-?#WrAbvy4FMJjnk4lZ1%O)syB zA4u+Z3xuwR5u>=GuwFmYMMxUm@E%-EBAk2FHdnbI@K`$YDDWL&yg zpr$D7R9S`epcruy0NyQxT4mi>R_5XMi*u+I-Oc*u5JV=F_94uT!UuV;Bi<{)GCn~A zH-_{L2Qk;f+-uo4fwh#;2l;W2ps)-2OQa9p{56Od^2edu6-{koMwZqB3(MTphAkW2lN9ncxO07QduJ7*Hde#H)$_FdGC za6e}<(tdGo=mZM)z7RZTy2nl75idW)Y?Wt<1fwA$^c8y6tmN4$|HO$ZKJxGC$-LB= z>X-u5GU_2;{)JZfFiSb>^8bJ>LDXbwrNZ}p4P323hQwt0iLB)FDh?gEGf}znQVTgb zKsh(mrn-I+F_oFEfU__)oO)LfsOk-U*0{VozWS-xPi^b+weLFWiQY8R3=sWB|4^}3 z@HsI0iGHsl>i-7@@I;?nkw4&u9!#(3D)+hEb@pfjZDQBoc=AOX=KB7?M2@LE-cME- zyPr4{>9!F4a0pTdUUCO>_f1j-GR71kbx=(QmOuxUksOK96sISrg-NOLXCJ20~EZUI(vTg<;~vGwKF~eoQz|oBX{A6!_Co&j{fIB z5u%oNv(9~|)*g`TNW6K!U8t-Ho^pn%ALQyl<=LUx2oZ3`0}TXte?r^E5R9O`!pQ!&56%d(BftJ^OXk#B%}bO2F)uy~Pc!N`3uze~)VRVzGT&gE>b3yyr;H(}zIoryuf*~DN5tLJZxs7iz8jmy5!9nwL5 zVDR*_Xa@sexJ}yL@Bceki4a3$TqMnso}B;RfH6%vaQ@#Ae169 zZIR%%dGjPiD4THjvqbbR%3rxm9@*u>RLH<9{Sv?-b!6JHTk4C-6fQq&dNjbW2Ensi zhc$VCUJ*;1+vgAl9yBFUoM8ez*eza??{3K(QU-e3pH@kf=7MpYaUH+bi(1^qn9$~i z(Z*M;irM?sH63AEhYI~RN#I^9L3#M!*eI`rh_w=m2kR&yLbHEZlm`QVjLq!aa74gy z=-&Jm5P3RO$QinNr#$o#k{9}sxScg*DDkDY<^dE&gj&lZF7fpY&p%;w ztEB1C`do<6PkHzOrTacofs~3ah>s2LP?UlxC|m`4q!E6vpkM_3<1tn2b*dSeqmfwa z>pu^o4vL)#bLs%U4jSNJT{F`NHMr2c(f%5)bIq)R`n)sf{>(rA+o?7T#S@!FsLxCB z?;D4X&10ir8Ps;t(E_tTba-OSuOE}^&R7PzwIayUJFS*vc)pGZ8~#?Mw7Y^EVe40) zjQSaAv)l$^tTF~%b-Z+rObF0bmo1XI zK=NnWw}W>)hJ*%Z2wUQBxos3m1G3&o;JJ#p=J67N9n}E>UL@ru&9D9mXUUts=fH*eYHYqd9($IPv|?UMoa8;mNc zsH%N|2t{9`{FfJ#B6EcUG3>mZLSFR~zH+OXO9n0?y@x1_u1%j`sIo~REce2q+m)^yj zKJhuEFCOx?r7c=wIN&ZE?$f{h<{3L1u6VYP>sun01T1BY$q%>b+UFd!=z8XiwCM)r zz%)N&MoGFU%JtoT#w8z_f!tu~pZU4OqzDG$^-E7V<6b;g+?cE@Kc2FQpOq=emh?91 z{{kTS5I#y`diV^i#uFP4;mGr55_ViBKdJ$#88;tgNPD-IR92R#@H4TQGi#bN=v*lU zH+=`%dmf+J%;&hoUlrIJMJSOuAH+F}Im|P-|La3(!0Bnj`GcL3=)d40o)eOTk{k@; z`_sVGk51#LxwI$(`mCltKz5N|1c;#AN+!R^kA~mVUin#sjnoONfS{`^%aFeBV8j!_o>f%Azs!uSl#wL}GL#c}7LdpzzJ=_=`9Q>3J1g;( z%1r9B<$qu_(EKotvJU!L<&#?xKCT!GT;D>*(Sl%R3L&b1Lb#Slujbb<>4QcT&wj_XG+J`$)rC zwqmDAfYBP<%kHP#unk9$vhi)!}5>!b02xJJi% z-bIW%;q^gyK#<`v(5t9sGrZmt4>)RgOy~vJ)gH0&mI*u~dM3qkSDqIVeHc8gm?>s`it;A6RgeE23qIFfL8)d zq}-o;u$GkAgjCZJe_UJx4@BDfYIXPd=uY2 zx_KcCAho?1H;od+CYDvue_H$RW;=E)sM~Nh|8s@V8CZDg1HtJ!P!F_g1tx%yx9`VK z!|!470tZcmkA`0mI3Lvpei_F-P7Z_-D~$g?!>~R8X(sgF5mwuM5V#)xOcy*-wR6%J z55!?(#o5ru9HDN+P8Ws!SCyK9J+DSgtpUsN@(^R2D9O72)7#Rj4C-iWp~iV#8PJjA zvk$#!gz_9@SwrzNVLcCpaz;lD2EXXizw-J!|_ge*F<;3#}EL#f`e zXTWES0tcpHU{fPz?ZNPLGwVI!@!uAwaMi-ce;%eXIK~-PxDlWsa=1-y!^Z&)Z%aYpV>+4tB@kTzjQ^%zwe7 z5PH310C|^Wp*}S5U-*7W)0^|;xYzX$^HR5&0gArG3hTD2y869exoG7Q2ytA+3t%}e z;O#@dlgsV<6kW)R6L`5D*M4He+lOt?56J3+#jO~`6WG&TbvtB*GekJD5``OluKC(N z@Q>5DG9;>#gV=ZKXAa>KV2x!T!Q6;5X-Z@tNz#brIpDYkY{fIesYhT z>2LxU(T1f-!}pybl?Lgf+Vg^&RUnRb1U1BPG{j%E{uB57YXwR6vH{PE|3}~x#nO;K z!4DJ;Ki)cJc=0FEIqLIdj{EUwdL_y5+V*k{Q^IKHuAdhAxWJwUdc0NJB@6Tr#2``1 z3MAW9z=H_A+*jLt)p!d1pfRc#I`PBsW`(@e4d@fZd4F2>P6s{OnR+n1(u&}EK;Gno z9^Lx@w5LL?ms4uHcxWT?d+xUi46nZc#FB*Di%)@M^S6QW46jv<_xZmc4SKgv&lkA^ z!1AVWZ2VbqFC`CpQoFbF5nqf($u_hp-phFN5hHKSeeSv|uHTw8o?^U;l~A{)2K@NE zS>Y}{{xBw7G9q6d?DP%#RZ+6@5J^%L6 zrS9uxifa$*$(+T{C)=GSR3bQl zcUccXMny_bQp#eU&ta5Ei?2Q(6s$7^0$8j?W?@+vu+peOb0iZNdhfnA-4cKfSADNA z!2of*SnCJMg_&PQCKgStKXIkb38d2LY^f+ea}{&y`Y=tBT3A$B>Ed5ME=4)|96b0^ zdU8-MeEb?E)y+R-6()6xd7o1g#LS}tv~(wFlG?;k)(AyA07oeuJg8Dtca^JP-c$A1 z%rdz50F4-YBp4kS0{IxKD`_4B`;!z|Vk#L~k67ph(p zd)Z$kohi|$N+XbFMB}4Tq(TQp*Hs=#56g-Hf9^ zBEbf7fxBc<*Z)^>UjY}@_O2}=Aky6oDk##W(ufF1OCuczLApy|3rLrOFd(T2C`d~U zNDoMtgfv4pLyj=Ow?U73&i~wdzZ>8Ee(-yFX7w<8_FC`rK5K1~u>pY1)PS);3_h$# zG*yFO30d36PhFVfL=QZSo@lW4colZM+oH3GcY@(5z$Tu7;Ai8`aK7_gX2Gu~qN|(J z%J^2WQ9$?9kTWY=8A|mvjRE$p)9rqc9?>3e|^n zaizVOOb!|6Z?pZ?))XFY{O5X#9P|=hJOxt&Z~leK5WJAv z7gnBxxN4TraSPO~h%g1!uAUDtjM~7EGKkv1#MF<1oNLsLf?!~3M?nG>Uporsp$=k; zJTkPS=<=P=As`USM|on z>kF$zf35zAXt4lScYNtZan*xDkEOTETgX0?bz!}JoLN=+;FX;h^Z7i!FKi@vfd3aZ zro6r{Y}|Q>em3zuWOrNSN5u6Lf&EH}n=cx>yF)&|Q@Y&#UrH}o=Q5QVKJ`dhEY-@S08q8??u6No^6I$)rSj_5 zU*yh!@=D%EL^~(4vS9!mn9~3_MDTt7F!no&ZNVO+CBR2StyqMty?R+278KEUJ^|C& zgps_#Tjv~}3D)AI#w#_q`Wg>=5)OY-9ejm!^7sb6&kgc|7u(g{=2CU)*mN+hC9~hF zrDVwuHDV86Ofu%T@ymNaIBG1i`ZT2w&#jShmrl&wTKXKz28xwYUN-%X_R=M_jKbuUdy3NwQa0i+QHTK9<)8^N46Bm5$$=k0m zlIrd2wlN;e=wM3q$VUpXejf{=;JZ&uAUp;t zW=HieeJVr;cZdtEE@~F>s>8A6z$5yScU#o=;1Ur-FZ5NM#9DU&=Al>+`QU5JmWu~n z-_nBwkjmvpzYgisfM60Y5)e@IbZzt9$gcj#SHisf&f!3J^<~*Gja?DhgemyY>#O1Fd(PG~t{;RY zIo)c&L#&+*D3dc!n`C@JkX;GydK8{AoqrU;xljo2G6_$qp%iiEbnDYyUHvp%>4E&* z^>Ist3XbzawD?9IIw&o|G&x8in}5jk`aAg5dvnUVfVS^Sd6R;mdycNn1IHrOCU}>2 zcuEeXh$bgv=*?1gha96-bop?oW05n$)S~6Ak48$7V9s036&`Qd^3dzGQQglm&0d73 zRGxJ`uPaK5Df^AV^SPEU(!s9rc%cOuMNQ##HP6PAMjDYaO(`P6#Te@N{!NTXrNKAA zK6U;}4SL=q99#7k!hu4AC#BX@#i}suAau zo~LykFSov9zi&~C3`V@*O&!2?(BcMPl?pD0)t&2FR^zcL@uKNulacX{5HJ7YB6 zG1L+^W(s;rf)_yr?u5Vn<{rY%{i+kUAt9^FV zrxa#)(vidxi31fgjAZw91&fpI?t3rFl_!J~mpD``PKKPS^cAM+f?{a+kOUjLU?IO^hMXPoWYmgVNa}z z)!E|MX5|}8FJqL87DWlv`aH3_0#Gh(9v0F$2_<6OnjM`@cUxDO3$~SVSihybdy>Q! zbXyQRx#~f} zEFaY03d29BHwZ(r!)~6q+p!G!-U!|}c1J!APrpFfNE*UBV9g|>)>63g?Y-%Ks)y_i z4otB^X#TmG^X=STABidN&@>gU?56MU_1PA(X(pfK>1g2BMUf08nXot2S!HBF*UuYR zLf0{_zJ<~n0@YtU7BWZG;gJQAnN5_!=dfkD#a^-(`V+uh@W6+^>Vw9>;VS0BKJ*NucaG;nAz&^A#dJtrP{qGX0LlA4PK20wkdqht-F3Lp_r`q=9Q+wpoV zYgZu1KupiDRI5dFdk`G-aCc^ISJiNFr?4MRdvNE<@VykwXLr=sR!dW&7&k+5=tWJ- zFNdqcqr1X|zdC%-M(7m0700HODfeMOF-XTJe0tsV`j5~`2Ki;G?65Rpl8y0;t0Lgx z@{VY21gfA3X%sqB8*@NSQ7aCr&IUbX@e89#c6&>Nn_I|?AQ=cE$%sIS^Rnvjjr_23 zq*g7rCR*(=`M136!Cn)vCTR=6LO3f=|2a#gJ;jmmIAO(y4k$qgPW7z5lTFmJ@b& zQ4&R%iQ+l;RgMEBt~QZm5?$Xa@FVFwc)La`1R|Yxmgd5y7I+8q2lclu(^So9HO%1m@#csQ*~41Jg5jv0i?52+KtzBD#8 z)@EC1k1horQou3NL;p&%N~W{DN(-4A%?vgdv;}-p4ox%-*@egY)Xiqa&k}GYcbezS z(fY#s1pA1$MitF#G^fAPR{Dd@8yK}S=qPm&U$KZ25 zE~W{xTM4a}U%>OdGEv2z zVzh;cw1mv=;R8p!VOM%6b1zfc-tE7}VjI(cO~4k>?=^j|XpY+t%G?ghvxCznAx7*r)o6I;V_yHRWeR%qPiX5!dWespGWIT=2Tu3s(vk7z> z#vV1nxd#~={}n7s_WQJi&H$wzvQw<|0b~xOY*T#6N(+-UAyjDrJO;R$4+yBzu@NoP zuVl3^Ga3Ygvm;|;oXhb_?R82oJiA7Q3cUR(@g{vhfN1)Kfsc1$w(*<9pyyl6DJStN zMei1j%My3F>*@Jdj4&5q5?qg`s{OXHyXXY%e}MVy?V}b19E`BZKV8T6rAv6sD!%}v z3m9r&O1|wdVO(d9i6m&cO+0zW`yaqKfy?cl@jLDTk-)HV(k&bL1-)>Dvvj)T1=@S* zCf7ep2G9#!eAH<8JOn$`5;Sy0l2>S%-<)NGCJM~{EZKNNkRYbtf%1um57W z8d!+m2C*~Y5IFVxIRXh9ul&qyhEGVWxpYZF+Syan0o?n-Bt;-oe(R!?)HA=MpakoX zBkVo8VS5kE%E_lECo7yTF(^62^&3eYDhoJiO=M0yH*jK|c;2t6SRKZi-U9#1H@&^5 z_{03+;xc6!b0mk6$n4_uQ26A@i6|vENh~Svjejs;-Ah2@+YR2z%PA-B*UeOmd2i6g zg66b?|2L*B){Q8(XrRedjpG{p)Btc(KGVzpZinC6h@5RoZ!e*ZI3htuX|BJ!<%1e; zXHKqhwrn<jW&11qloMKA$$9%svRjM;_S@68l-;&*(CX2u&l9Ncxg)Qi zSHYxtd=TnUMolS+%MrvnKaF*`q}&LA(Nziu!Y(Nm4auAOPiettFHG_M z3U>4A)&1j=o@$fSu--c4E4P!#QLP(|<>QorJcajLfyH;3xV8V8qnp_pfVWs`T!1jiJ2Jojtm)7G?Cbu}&(IYM zHcD~Ny$YOVB6_)4pDmJ=oO?5>N}s&InBc=Gx+W?2M_d4y(FuOrgP2Z)Sjy!?^yKsj~C)}^s9nX zP=NSbEZ!aTgB)EAYWx1ioVxTw|6B)w{ibL*SEN+i2Fp22g-Kpm@i`mZBs4w>YOUA04WDk?Q{ukzx8%3u5}90V5-fL$3`{??e|vO zM(~))J3B-(c`@Z})Oy`|EP8P^n$4w^qwkm3QYujQRanI0b~O6b<-UXFrfZq+mxo_? z;Hbvk(Fm_JvLVae2nD-@*G9NyYu+OXtK9V(ltt!lJ^fsrZ zmJTl@(lYlZ+pSAL#^!C%L=IbCy)_aN>16b+?dr7sM;5wp^?}KQ7aj$X!xe&>KBytp zKeAL&bhiC6qaS;3*?v?4&TwXLyug#se9jj+t;xU1B$f2e+eCEvls(R{9bw&yyk#?^ z#fnpD|ME~q(*DbCrRoTs?V-$Ld*%WVJ+%DzmF{MY%;*ID>-G-a;*RRO?X+g8xZi+wBf#COo{=^;iw8byUDb;m zxqHs#T~Plw4ZY`is0C}Mnl_4Gp9YY+!{vni(EDR_?Wniygdo%o!Z10S1v{9W;r zyx`NA)rVL4pLCM+Q!=P&&#MN8x)QQ?`Qe2rbi9w1)0})yQZVMxa!)Y&Q~4O#w`I2^ zVT(W^2gMgwHM>3O>FOi@E%}NO_PG|r2|ENy=w(1fr4`FtI_~xbSo1W+UILD zy~Xk9zhrFi2*SS>Cj3_n@Nd`KloP}PbwVK%g^L8?-wn?~V=|Gmc*nQ@Hjv3T-}&4g z;Q-|08Ol&qM{s%27;N$#44LE0v{zK!X?|YRaewu3*V~+0cP2{WSglXs32Hu_Q~oq> z2|ac?GRUq)d&TGYZl1LDzlpLk?-ocV%W@Y<$no7`S9n36(am=-ZN5{}zUTq%UEs>t zH;}QYj;QgZ`Lx03HF=id1MNNJ%1|%@n(q`v_?gnA9P$b8o4XvfQ-6%_72(NnHuwQjyM)=n)A?N#75+bfB#T+0Ey*ZN4+#zSs%vP2$eDZ6sq~6Cr6$lX8w&%^z zYuL};5F$Hq!9JX zfWMfCO3XRq2ZY%FY=FPz@XYr^1L_l`C4Av#>)!v;*x%az@v=UoZb@TzyB1>Pl~&0< zqc?G16V$+bX>FdmA^1GU*V*U`oKWQ!wz=7ZABKj$gL7x!7d#LOU~w`ID=^ZX!byPAF&ss0<`WYXCD*jOhKDsSJ%>SqZA{ zKC#a`Osyp(idGiyQ!?Fd(SK6X1Yn}6bMEnz53MX7rkK0N4}6W$FmU8DlwIV|E1B)& zk{ejULEy$%d`rm$+~V6Ga#>U+&zZ%ievNzYB?(jqjC`#ix;ut?+Vizy9OE@uBj$E) zUYDK9fPw^-{frY>V}Fcw2>;Q{JMO4m0mMVKM?_i6n$zy_#ShCK;ie3PSS%$D+_eyT zHD?*0@sRCNch>T*5o9CNCjQ++UyIV7hi#8a+rOeV>E6QtG&_VG=dJDxI5ORt4`ny$ zDA%)>ePWTq6JVK#Z%zwBeZ97sB*hah?kVed#OA2jgj*~$h$awSi>xl;(F9iZTS^=& zbkB#^GZ(v4W-h;yh_rzEiR`?b+_%L0Lwz^WD9S>+-U^JPyv84__ZmJ&XF_I!9o*%P zpd{4;)OSBk>u8Kcn&LExvAWeWhK$P7pSvAf;e1ii#nZwl$9IHoL+t#I)#rToG^c307=Sbq?UlCFPWGD3T(&<^1DRN9GpJcU7gtpWm?irScI=Ii=NJgYBsa_lW4M25V zYy$<^owoXa=9*vW=hCVg-Wb7g6d}g00;0}G8VI-*^_b`PbG?BPzFp?lXjv{E0SB@4 zpbE8?b3v=hV+E175{9d?{rVi@6P22)-m|Rm9OlM^)Oc{&X4TUPCONvjgwFu=!Yf!u?;G9cpy&4mp7cr)ir+E6xPpr=DFSCXbwJ&A0akg>Cbb3Ipm%W=D*T z>K@qL^`Xkg3LaPm(*)I}=j@#ya;+5W51LngXm@%Doh#;QH&>!galQl^@uh9%|1P=YKXgc+q}ZR+?)iOn;C9_}3f;t`%YZLDz~8D-I8bri=3%%?*Ov zVT4fEvkW(;3;J?Y@+Y-A5_jp$uwAqa{M%s{ptceH+CLx|ZC)YOcdL7Xqr>o7g-Y4` zMwphju`;Z1jw<8x^0{2h4}^unbw2>`6a5277b3Fk!bB5piqvhKs|A7OFs7PldJ$2f zaJmwaW&dBYV3>~ga+kiBeT^9`d6hBU?db@H70x?`pWvN?Do0uSH<#%<>Y@nu(_G-s zY)RT4U!41lOrB3?F=B8~3{&n;Coz0+8VY1Y(@BUdn=pA>MO!hMiJptz**fZefP zOh@ctjiek&eLCxQo5|7wma^oQHJWJmJD7Eg8I`lUUYYWr1VXlxgf8X%<2CFCsP&DA z0=T_M?HamlRB-J{Utoc4hz0Po)frRz)-~qx*fC|NCu1^^|8_@5Z2FjTHnkY1?J~l^ z3uDc38|Sy-y|>LSOBvaNu3sWaLkbwYlYmS{p1z|=uUkZ z182f)H^KUG|9N!u>9_f!q6$9oOBaWS9xrq!I*TIeyNy2~CagF4MIkBIKR#RUjIrBq zcsc}Ef6|<)@p!`hv}$_o)5Uea@_i@RCVy-5dN_gGO#@4SE!q|!$Zu4t!1}&9XsQi4 zfitCb;R)ntbdid9&j_R<4xc%!_xNgZFMLYgcbaJT{8vy=(DP5p|61@@3h=kqR`#xc zYT75ARPg3T{x`rAnz60IeYT!)1^0rg(w%=E?&&Cie|#%cy))I(+u~h^f*XGaVf}$= zVu?^LG?J)EO>iTlDtbvg>o8$Gqo{z{0QGIqBSmLN?jB^^M{yrH+F}o>1)bbUn9H=b zc8kd3x*6<8@jn5u9uANv{+W(in<SmRcW21%>a`xYwH-PrF6${pcTQPYh;1c_C}(PovPfmVcrIcw?9P zeA!bSm9+&Rr|8pel<58E;I8$*+&CIfwYuMTwgupG1XDc!NvnL1%lxw#gCSdx#Yl0f;bDWNpsR^(JK4tO4z5=X0p{hOr{LRqP3+9+oZ~ss&jQ{ z@58xWA1MzR!!Ez><3KgWJ@0o27xg$tbUFDwOHa^#x;k*1GDgoW^VOSb4~BkD#d01oN~44O zIS<8YyPYN)Jnqe-`@>K~V)JZ>gDL^tkfPI3q$lCmxx7 z>TxrdXjPFto&o&rhs62e+0yso4w{SRIm^ykXE55_JFf*Xoh=>xt? zcz;_Mf%}0RFo2&^NyE(_+u%kWt`B&(B=$IiLf8XmqWbZ-68q%qnXjTJA>5t>-D;h; z(K6&|Qe!tbu6+wVlyAv;5^Htbwd8?&=!+iODVgl{l{h?F-T%J>z`s+v_Qn8OKWu=d zCJp6_I1Jsm{uf|%SpN3a1`L8XRh~BK>wEZZZQ(aCaGddeK6t+QNhh@dWv*77Rn6v= z<;C^vs=ll8NE2Z2Y;wHqwI?(#& zna0VkiIo*?e8!5di4*STc1;G49xd_3%0m-X09c1cpZV$Zlle*lm8DY}S%`b9k&2Jn;;oABI+oz+3$wm(;0Om1Uyvo07g^xSH-O*Wq^9imwYL2% zsPUZs_F(R_QzFWEbv8M=Y9&yP)C7$rE+ME;5nK(XF@{suR{h-acu zYx^778F0Cf<;q#IXYP0v1tl&A00PH;_n6MQ!m{|;k&1GW)>21V_ZVxre3nWu0c#0? zh(!|mT7S!%E03Sl^|i*$%{z^%X*zU=>Q2O5kz*&8|(7EzGb6CYDooVyL=HV>^j&G*qSHE)iMQ%K# zlFpJaJ19vAk6Y>%Sm;KSxxL!9aO|&QbvmY5NP{bG^Dd;`I(pcVLcF~aT4%wla(+DR zaeo@z2Fa`H-9ZBBZ|py!8Bgo|yLmX)&a`d}6n4UzbRAEdT2rKgp4b?|Jl0GICl5J- z_r9X+aQfiARmeqS7%KZjkdZ+idJFAn2;159Q5Ai~b#tfS=u7Xi;|^S+Uh=fv>rNnQqQWD)eh_u&8TX^iV@H)pf64V zh;O`&RwR_rAyLtn(-vNFhEE>Pu^OsqXYDOy=9+({x8sP0i7Z)d`|BfHM3MbzTYaUK zl^bqrNnA}OD*dGZ@}w!lVrc}D8YbJ_zuP~V49(v^(lLY;?X$0-uZ>%xpLj0q6;V{e z(om7~FkkK_s<%lBcJK_LrFmeVJ5<)WKQ9v?jh@fc<38qLq{z~nG$MQDM)dl- zEjvi3T3F!2tA63gB$ zxNL`9J2`Ss^?@=$F7>Uw>XuGPlC4R?+wNPV10>4d;SdJ4i6`XGgXbMVI!q2sFcP}A zq)06JA!Dp)DO_p*bGx2_S%Uh_alNQJ1m70@9OKAY{KL8a1Rot-P-0G8Ux zUC$68kx)7tKo{V>8GMXW?)a^cro;5OK2KcYWx)JaJ>&!eir#qq=5Y4Whg0$AAZT8+ zWNi+S-SdNbTN82mXHrvys*tFsNm4$7r`y;UV^8YEXaMnK?4ca-3f{)x)5Su)*cFNI zu`?c3c(8)8%?J*^5wO|P7Yy!eS9C;AUjyTz>Ct02?l|A3f>a@(``n|x&S#RB} zKeCoM+qE-06+rL(Jb=h)Q<5;q$+uS6?S)hW4>P`0*Q4NBbzv z@4MO^=#}gKWo^fG=afr@s^X}z0q2lPLdZ!or&?E~rrRWw_q@rF|C<2#U+WC*qKuAC zN_89;K=wDOkVz<^PXX`~{r>^Lp9A^NcfWIzv&a>b8}^13|9S-u>DVCQfrC3Ptv+ME zq)a_EHG$dG&f^DgW98^W*BaQ-fUxFCzBS73Z$E$?N*q5e&;(^9am`!Fl!Vd@H{O&c z-V962ltRmlV9=BytB{e7Cz8gd>6%S5r49U+O$*^_6W6NDg9JF^DqMWE1%tlnVz2|X ztOI$A1O0Ue(rgD>3kS*t2SzFf5~u@>wgbhG1A}vgUs6TjXhlF(LW|f~3#Mq(RncZL zQ8>Ua+Ct5}Nm{T;YrjdkvB?P8BuU$(!9)2Mpn^7dyy=2YI0?e(c{(>~8wDCgaOC)_ z>3N*$K4VT=Z^QzABJLueOsJn=H6+eQ9=dU0|k-z#HIHJF% z{wfD%3-c`3y~E5PjQEd$B4&Tkw6y^K$xyd!+YL7%I9K-Y9C=l;DO7#cDa=5*sQuqe n%At9|%9+*%DW;LcuJc4|eSXiW0WG?+5m@o;6 From 19ab4811d5516f3a36756867602b67c07f6d9af4 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 7 Oct 2024 17:00:27 +1100 Subject: [PATCH 032/102] Add i/o indicators for reftran and geoid --- dynadjust/include/io/dnaiobase.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dynadjust/include/io/dnaiobase.cpp b/dynadjust/include/io/dnaiobase.cpp index 24315e4d..c2f4fec2 100644 --- a/dynadjust/include/io/dnaiobase.cpp +++ b/dynadjust/include/io/dnaiobase.cpp @@ -91,6 +91,9 @@ void dna_io_base::writeFileMetadata(std::ofstream& file_stream, binary_file_meta file_stream.write(reinterpret_cast(file_meta.epsgCode), STN_EPSG_WIDTH); file_stream.write(reinterpret_cast(file_meta.epoch), STN_EPOCH_WIDTH); + file_stream.write(reinterpret_cast(&file_meta.reftran), sizeof(bool)); + file_stream.write(reinterpret_cast(&file_meta.geoid), sizeof(bool)); + // Write file count and file meta file_stream.write(reinterpret_cast(&file_meta.inputFileCount), sizeof(UINT16)); for (UINT16 i(0); i(file_meta.epsgCode), STN_EPSG_WIDTH); file_stream.read(reinterpret_cast(file_meta.epoch), STN_EPOCH_WIDTH); + file_stream.read(reinterpret_cast(&file_meta.reftran), sizeof(bool)); + file_stream.read(reinterpret_cast(&file_meta.geoid), sizeof(bool)); + // Read file count and file meta file_stream.read(reinterpret_cast(&file_meta.inputFileCount), sizeof(UINT16)); if (file_meta.inputFileMeta != NULL) From 08055b23552ce06effdb3e0a8d5414830305e2fe Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:35:54 +1100 Subject: [PATCH 033/102] Add file type test method --- dynadjust/include/config/dnatypes.hpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/dynadjust/include/config/dnatypes.hpp b/dynadjust/include/config/dnatypes.hpp index e69127c9..f7164c9e 100644 --- a/dynadjust/include/config/dnatypes.hpp +++ b/dynadjust/include/config/dnatypes.hpp @@ -678,4 +678,28 @@ S formatStnMsrFileSourceString(const vifm_t* vfile_meta, const size_t& file_type return source_files; } +template +S FormatFileType(const size_t& file_type) +{ + switch (file_type) + { + case dna: + return "DNA"; + break; + case sinex: + return "SNX"; + break; + case geodesyml: + return "GML"; + break; + case dynaml: + return "XML"; + break; + case csv: + return "CSV"; + break; + } + return "unknown"; +} + #endif // DNATYPES_H_ From 24b7457459ef5be5cabc36489fdae7aaf01e43fc Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:36:54 +1100 Subject: [PATCH 034/102] Improve reference frame reporting --- .../dnaimportwrapper/dnaimportwrapper.cpp | 70 ++++++++++++------- 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index 4384d73c..b7aa6552 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -59,16 +59,20 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, pro str = " "; } } - - if (!p->i.reference_frame.empty()) - { - *f_out << setw(PRINT_VAR_PAD) << left << "Default reference frame:" << p->i.reference_frame; - if (p->i.user_supplied_frame) - *f_out << " (user supplied)"; - else - *f_out << " (default)"; - *f_out << endl; - } + + // If a reference frame has been supplied, report it. + // If not, the assumption is, the project frame will be assumed from the first file and + // in this case, it will be reported later + if (p->i.user_supplied_frame) + *f_out << setw(PRINT_VAR_PAD) << left << "Project reference frame:" << p->i.reference_frame << " (user supplied)" << endl; + else + *f_out << setw(PRINT_VAR_PAD) << left << "Project reference frame:" << "To be assumed from the first input file" << endl; + + if (p->i.override_input_rfame) + *f_out << setw(PRINT_VAR_PAD) << left << "Override input file ref frame:" << yesno_string(p->i.override_input_rfame) << endl; + + + if (!p->i.include_msrs.empty()) *f_out << setw(PRINT_VAR_PAD) << left << "Strip all measurements except:" << p->i.include_msrs << endl; @@ -975,13 +979,13 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* if (referenceframeChanged) { - ssEpsgWarning << "- Warning: The default reference frame (" << GDA2020_s << ") has been changed to " << endl << - " the default datum of " << leafStr(p.i.input_files.at(i)) << " (" << inputFileDatum << ")."; + ssEpsgWarning << "- Warning: The project reference frame has been set to the default" << endl << + " file datum of " << leafStr(p.i.input_files.at(i)) << " (" << inputFileDatum << ")."; } else { ssEpsgWarning << "- Warning: Input file reference frame (" << inputFileDatum << - ") does not match the " << endl << " default reference frame (" << p.i.reference_frame << ")."; + ") does not match the " << endl << " project reference frame (" << p.i.reference_frame << ")."; } if (!p.g.quiet) @@ -1324,20 +1328,18 @@ int main(int argc, char* argv[]) cout << setw(PRINT_VAR_PAD) << left << " Binary station output file: " << p.i.bst_file << endl; cout << setw(PRINT_VAR_PAD) << left << " Binary measurement output file: " << p.i.bms_file << endl; - if (!p.i.reference_frame.empty()) - { - cout << setw(PRINT_VAR_PAD) << left << " Default reference frame:" << p.i.reference_frame; - - if (p.i.user_supplied_frame) - cout << " (user supplied)"; - else - cout << " (default)"; - cout << endl; - } - + // If a reference frame has been supplied, report it. + // If not, the assumption is, the project frame will be assumed from the first file and + // in this case, it will be reported later + if (p.i.user_supplied_frame) + cout << setw(PRINT_VAR_PAD) << left << " Project reference frame:" << p.i.reference_frame << " (user supplied)" << endl; + else + cout << setw(PRINT_VAR_PAD) << left << " Project reference frame:" << "To be assumed from the first input file" << endl; + if (p.i.override_input_rfame) cout << setw(PRINT_VAR_PAD) << left << " Override input file ref frame:" << yesno_string(p.i.override_input_rfame) << endl; + if (p.i.export_dynaml) { if (p.i.export_single_xml_file) @@ -1523,6 +1525,7 @@ int main(int argc, char* argv[]) if (!p.g.quiet) cout << endl; + imp_file << endl; vstring vPoorlyConstrainedStns; @@ -1664,7 +1667,7 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } } - + ///////////////////////////////////////////////////////////////////////// // Add discontinuity sites to vStations // @@ -1791,6 +1794,23 @@ int main(int argc, char* argv[]) UINT32 stnCount(static_cast(vstationsTotal.size())); UINT32 msrCount(static_cast(vmeasurementsTotal.size())); + if (!p.i.user_supplied_frame) + { + stringstream datumSource; + switch (vinput_file_meta.at(0).filetype) + { + case sinex: + datumSource << ". DynAdjust default (Frame not found in SNX)"; + break; + default: + datumSource << ". From first file (" << FormatFileType(vinput_file_meta.at(0).filetype) << ")"; + } + + if (!p.g.quiet) + cout << setw(PRINT_VAR_PAD) << left << "+ Project reference frame:" << p.i.reference_frame << datumSource.str() << endl; + imp_file << setw(PRINT_VAR_PAD) << left << "+ Project reference frame:" << p.i.reference_frame << datumSource.str() << endl; + } + if (!p.g.quiet) cout << endl; imp_file << endl; From a06debc5b429c192ebcde689e1d607bca91db7e0 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:38:41 +1100 Subject: [PATCH 035/102] Remove unnecessary guard on writing file metadata --- dynadjust/dynadjust/dnareftran/dnareftran.cpp | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/dynadjust/dynadjust/dnareftran/dnareftran.cpp b/dynadjust/dynadjust/dnareftran/dnareftran.cpp index 86fb6809..24d03c2d 100644 --- a/dynadjust/dynadjust/dnareftran/dnareftran.cpp +++ b/dynadjust/dynadjust/dnareftran/dnareftran.cpp @@ -88,23 +88,14 @@ void dna_reftran::TransformBinaryFiles(const string& bstFile, const string& bmsF // coordinates are required) TransformMeasurementRecords(newFrame, newEpoch); - // Were any measurements updated? - if (transformationPerformed_) - { - // write the binary measurement file - WriteBinaryMeasurementFile(bmsFile); - } + // write the binary measurement file + WriteBinaryMeasurementFile(bmsFile); // 3. Transform stations TransformStationRecords(newFrame, newEpoch); - // Were any coordinates updated? - if (transformationPerformed_) - { - // write the binary station file - WriteBinaryStationFile(bstFile); - } - + // write the binary station file + WriteBinaryStationFile(bstFile); } // Obtain the two-character ID for the tectonic plate on which each station lies, and assign @@ -583,7 +574,7 @@ void dna_reftran::WriteBinaryStationFile(const string& bstfileName) sprintf(bst_meta_.epsgCode, "%s", strEpsg.substr(0, STN_EPSG_WIDTH).c_str()); sprintf(bst_meta_.epoch, "%s", strEpoch.substr(0, STN_EPOCH_WIDTH).c_str()); bst_meta_.reftran = true; - + try { // write binary stations data. Throws runtime_error on failure. dna_io_bst bst; @@ -617,7 +608,7 @@ void dna_reftran::WriteBinaryMeasurementFile(const string& bmsfileName) sprintf(bms_meta_.epsgCode, "%s", strEpsg.substr(0, STN_EPSG_WIDTH).c_str()); sprintf(bms_meta_.epoch, "%s", strEpoch.substr(0, STN_EPOCH_WIDTH).c_str()); bms_meta_.reftran = true; - + try { // write binary measurement data. Throws runtime_error on failure. dna_io_bms bms; From 88eabe6a2668d600002bac675ddb1e611c767c27 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 22 Oct 2024 14:58:37 +1100 Subject: [PATCH 036/102] Capture if reference frame source is the file --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 5 +++++ dynadjust/dynadjust/dnaimport/dnainterop.hpp | 5 ++++- dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx | 1 + dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx | 1 + dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx | 1 + dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx | 1 + .../dnaimportwrapper/dnaimportwrapper.cpp | 15 +++++++++++---- dynadjust/include/io/dnaiodna.cpp | 4 ++++ dynadjust/include/io/dnaiodna.hpp | 9 +++++++-- 9 files changed, 35 insertions(+), 7 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index 66082452..1619ccce 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -233,6 +233,7 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS percentComplete_ = -99.0; isProcessing_ = true; + _filespecifiedreferenceframe = false; stringstream ss; try @@ -399,6 +400,7 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 { parseStatus_ = PARSE_SUCCESS; + _filespecifiedreferenceframe = false; try { @@ -474,6 +476,7 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 *stnCount = DnaXmlFormat_p.NumStationsRead(); *msrCount = DnaXmlFormat_p.NumMeasurementsRead(); *success_msg = DnaXmlFormat_p.DnaXmlParseMessage() + "\n"; + _filespecifiedreferenceframe = DnaXmlFormat_p.filespecifiedreferenceframe(); try { @@ -1081,6 +1084,8 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 m_strProjectDefaultEpsg = fileEpsg; } } + + _filespecifiedreferenceframe = dnaFile.filespecifiedReferenceFrame(); // Station file if (idt == stn_data || diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.hpp b/dynadjust/dynadjust/dnaimport/dnainterop.hpp index ef87d3cb..6ca581b3 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.hpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.hpp @@ -186,7 +186,8 @@ class dna_import { inline _PARSE_STATUS_ GetStatus() const { return parseStatus_; } - void inline ResetFileOrder() const { g_fileOrder = 0; } + inline void ResetFileOrder() const { g_fileOrder = 0; } + inline bool filespecifiedReferenceFrame() const { return _filespecifiedreferenceframe; } void InitialiseDatum(const string& reference_frame, const string epoch=""); void PrintMeasurementsToStations(string& m2s_file, MsrTally* parsemsrTally, @@ -375,6 +376,8 @@ class dna_import { vUINT32 v_measurementCount_, v_unknownsCount_, v_ContiguousNetList_, v_parameterStationCount_; + bool _filespecifiedreferenceframe; + }; } // namespace dynamlinterop diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index 7e4f133f..749b0ea8 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -917,6 +917,7 @@ DnaXmlFormat_pimpl::DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, con // Has the user supplied a reference frame and should this be used to override all? _userspecifiedreferenceframe = userspecifiedreferenceframe; + _filespecifiedreferenceframe = false; _overridereferenceframe = overridereferenceframe; } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx index 086976aa..46dec9a1 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx @@ -126,6 +126,7 @@ public: virtual void referenceframe (); virtual void epoch (); virtual void post_DnaXmlFormat (vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements); + inline bool filespecifiedreferenceframe() { return _filespecifiedreferenceframe; } string DnaXmlParseMessage() { return _parse_msg; } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx index 23339572..a3c16ba2 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx @@ -2165,6 +2165,7 @@ bool DnaXmlFormat_pskel::_attribute_impl (const ::xml_schema::ro_string& ns, this->referenceframe_parser_->_post_impl (); this->referenceframe_parser_->post_type (_referenceframe, _fileEpsg, _userspecifiedreferenceframe, _overridereferenceframe, _firstFile); this->referenceframe (); + _filespecifiedreferenceframe = true; } return true; diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx index c072452b..5423e0d8 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx @@ -824,6 +824,7 @@ protected: string _fileEpoch; bool _firstFile; bool _userspecifiedreferenceframe; + bool _filespecifiedreferenceframe; bool _overridereferenceframe; }; diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index b7aa6552..c18f5911 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -973,10 +973,17 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* p.r.epoch = inputFileEpoch; } - if (!iequals(epsgCode, input_file_meta.epsgCode)) + if (!parserDynaML.filespecifiedReferenceFrame()) + { + stringstream ssEpsgWarning; + ssEpsgWarning << "- Warning: Input file reference frame empty. Assuming the default reference frame (" << inputFileDatum << ")."; + if (!p.g.quiet) + cout << ssEpsgWarning.str() << endl; + *imp_file << ssEpsgWarning.str() << endl; + } + else if (!iequals(epsgCode, input_file_meta.epsgCode)) { stringstream ssEpsgWarning; - if (referenceframeChanged) { ssEpsgWarning << "- Warning: The project reference frame has been set to the default" << endl << @@ -1800,10 +1807,10 @@ int main(int argc, char* argv[]) switch (vinput_file_meta.at(0).filetype) { case sinex: - datumSource << ". DynAdjust default (Frame not found in SNX)"; + datumSource << ". DynAdjust default (frame not found in SNX)"; break; default: - datumSource << ". From first file (" << FormatFileType(vinput_file_meta.at(0).filetype) << ")"; + datumSource << ". Taken from first file (" << FormatFileType(vinput_file_meta.at(0).filetype) << ")"; } if (!p.g.quiet) diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index 3d84a5cf..d3d6fb6b 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -255,6 +255,7 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA string sBuf; getline((*ptr), sBuf); sBuf = trimstr(sBuf); + m_filespecifiedReferenceFrame_ = false; // Set the default version version = "1.00"; @@ -341,6 +342,9 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA file_referenceframe = ""; } + if (!file_referenceframe.empty()) + m_filespecifiedReferenceFrame_ = true; + string epoch_version; // Attempt to get the default epoch / geoid version try { diff --git a/dynadjust/include/io/dnaiodna.hpp b/dynadjust/include/io/dnaiodna.hpp index 79deb899..44e5f52f 100644 --- a/dynadjust/include/io/dnaiodna.hpp +++ b/dynadjust/include/io/dnaiodna.hpp @@ -50,11 +50,13 @@ class dna_io_dna : public dna_io_base public: dna_io_dna(void) : pv_msr_db_map_(0) - , m_databaseIDsSet_(false) {}; + , m_databaseIDsSet_(false) + , m_filespecifiedReferenceFrame_(false) {}; dna_io_dna(const dna_io_dna& dna) : dna_io_base(dna) , pv_msr_db_map_(0) - , m_databaseIDsSet_(false) {}; + , m_databaseIDsSet_(false) + , m_filespecifiedReferenceFrame_(false) {}; virtual ~dna_io_dna(void) {}; dna_io_dna& operator=(const dna_io_dna& rhs); @@ -98,6 +100,8 @@ class dna_io_dna : public dna_io_base inline const dna_msr_fields dna_msr_widths() { return dmw_; } void set_dbid_ptr(pv_msr_database_id_map pv_msr_db_map); + + inline bool filespecifiedReferenceFrame() { return m_filespecifiedReferenceFrame_; } protected: @@ -133,6 +137,7 @@ class dna_io_dna : public dna_io_base pv_msr_database_id_map pv_msr_db_map_; bool m_databaseIDsSet_; + bool m_filespecifiedReferenceFrame_; }; } // namespace iostreams From fd65bc419a05f20bba2884d741291160050c47f6 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:00:07 +1100 Subject: [PATCH 037/102] Manage epoch reporting with static frames --- .../dnareftranwrapper/dnareftranwrapper.cpp | 55 +++++++++++++------ 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index 5d34f010..ed2474ed 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -24,7 +24,7 @@ using namespace dynadjust; -void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, project_settings* p, const string& header) +void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, project_settings* p, const string& header, UINT32& epsgCode) { // Print formatted header print_file_header(*f_out, header); @@ -39,7 +39,8 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, pro *f_out << setw(PRINT_VAR_PAD) << left << "Output folder: " << system_complete(p->g.output_folder).string() << endl; *f_out << setw(PRINT_VAR_PAD) << left << "Stations file:" << system_complete(p->r.bst_file).string() << endl; *f_out << setw(PRINT_VAR_PAD) << left << "Measurements file:" << system_complete(p->r.bms_file).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Target reference frame:" << p->r.reference_frame << endl; + *f_out << setw(PRINT_VAR_PAD) << left << "Target reference frame:" << p->r.reference_frame << + " (EPSG " << epsgCode << ")" << endl; if (!p->r.epoch.empty()) { @@ -47,8 +48,11 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, pro if (p->r.epoch.rfind(".") == string::npos) p->r.epoch.insert(0, "01.01."); - *f_out << setw(PRINT_VAR_PAD) << left << "Target Epoch: " << - formattedDateStringFromNumericString(p->r.epoch) << endl; + *f_out << setw(PRINT_VAR_PAD) << left << "Target Epoch: " << + formattedDateStringFromNumericString(p->r.epoch); + if (isEpsgDatumStatic(epsgCode)) + *f_out << " (ignored: " << p->r.reference_frame << " is static)"; + *f_out << endl; } if (p->r.plate_model_option > 0) @@ -81,7 +85,7 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, pro } -int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& vm, project_settings& p) +int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& vm, project_settings& p, UINT32& epsgCode) { // capture command line arguments for (int cmd_arg(0); cmd_arg(p.r.reference_frame); } if (!vm.count(EPOCH)) @@ -224,9 +231,12 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& string fileName(p.g.network_name); fileName.append(".").append(p.r.reference_frame); - if (iequals(p.r.epoch, "today")) - p.r.epoch = stringFromToday(); - fileName.append(".").append(p.r.epoch); + if (!isEpsgDatumStatic(epsgCode)) + { + if (iequals(p.r.epoch, "today")) + p.r.epoch = stringFromToday(); + fileName.append(".").append(p.r.epoch); + } // Export to dynaml? if (vm.count(EXPORT_XML_FILES)) @@ -433,7 +443,9 @@ int main(int argc, char* argv[]) } } - if (ParseCommandLineOptions(argc, argv, vm, p) != EXIT_SUCCESS) + UINT32 epsgCode(epsgCodeFromName(p.r.reference_frame)); + + if (ParseCommandLineOptions(argc, argv, vm, p, epsgCode) != EXIT_SUCCESS) return EXIT_FAILURE; std::ofstream rft_file; @@ -450,7 +462,7 @@ int main(int argc, char* argv[]) if (vm.count(QUIET)) p.g.quiet = 1; - + if (!p.g.quiet) { cout << endl << cmd_line_banner; @@ -477,8 +489,11 @@ int main(int argc, char* argv[]) if (p.r.epoch.rfind(".") == string::npos) p.r.epoch.insert(0, "01.01."); - cout << setw(PRINT_VAR_PAD) << left << " Target Epoch: " << - formattedDateStringFromNumericString(p.r.epoch) << endl; + cout << setw(PRINT_VAR_PAD) << left << " Target Epoch: " << + formattedDateStringFromNumericString(p.r.epoch); + if (isEpsgDatumStatic(epsgCode)) + cout << " (ignored: " << p.r.reference_frame << " is static)"; + cout << endl; } } catch (const runtime_error& e) { @@ -526,7 +541,7 @@ int main(int argc, char* argv[]) cout << endl; } - PrintOutputFileHeaderInfo(&rft_file, p.r.rft_file, &p, "DYNADJUST REFTRAN LOG FILE"); + PrintOutputFileHeaderInfo(&rft_file, p.r.rft_file, &p, "DYNADJUST REFTRAN LOG FILE", epsgCode); dna_reftran refTran(p, &rft_file); stringstream ss_msg; @@ -641,8 +656,11 @@ int main(int argc, char* argv[]) ss_msg << " stations were"; ss_msg << " already referenced to " << p.r.reference_frame; - if (!p.r.epoch.empty()) - ss_msg << ", epoch " << p.r.epoch; + if (!isEpsgDatumStatic(epsgCode)) + { + if (!p.r.epoch.empty()) + ss_msg << ", epoch " << p.r.epoch; + } ss_msg << endl; } @@ -685,8 +703,11 @@ int main(int argc, char* argv[]) ss_msg << " measurements were"; ss_msg << " already referenced to " << p.r.reference_frame; - if (!p.r.epoch.empty()) - ss_msg << ", epoch " << p.r.epoch; + if (!isEpsgDatumStatic(epsgCode)) + { + if (!p.r.epoch.empty()) + ss_msg << ", epoch " << p.r.epoch; + } ss_msg << endl; } From 01fd6811bbd1b4ac91a8253307e33ab7234e6cb6 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 23 Oct 2024 15:33:59 +1100 Subject: [PATCH 038/102] Restrict parsing of cluster id to field width --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index 1619ccce..fbb85bb1 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -2273,7 +2273,7 @@ void dna_import::ParseDatabaseClusterId(const string& sBuf, const string& callin string parsed_value; // Cluster ID try { - parsed_value = trimstr(sBuf.substr(dml_.msr_id_cluster)); + parsed_value = trimstr(sBuf.substr(dml_.msr_id_cluster, dmw_.msr_id_cluster)); if (!parsed_value.empty()) { m_msr_db_map.cluster_id = val_uint(parsed_value); From 310a3aaad923d87f833533e519c62a449f74ab75 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 23 Oct 2024 15:35:51 +1100 Subject: [PATCH 039/102] Minor UI enhancements --- .../dynadjust/dnareftranwrapper/dnareftranwrapper.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index ed2474ed..398cad57 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -39,8 +39,7 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, pro *f_out << setw(PRINT_VAR_PAD) << left << "Output folder: " << system_complete(p->g.output_folder).string() << endl; *f_out << setw(PRINT_VAR_PAD) << left << "Stations file:" << system_complete(p->r.bst_file).string() << endl; *f_out << setw(PRINT_VAR_PAD) << left << "Measurements file:" << system_complete(p->r.bms_file).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Target reference frame:" << p->r.reference_frame << - " (EPSG " << epsgCode << ")" << endl; + *f_out << setw(PRINT_VAR_PAD) << left << "Target reference frame:" << p->r.reference_frame << endl; if (!p->r.epoch.empty()) { @@ -48,7 +47,7 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, pro if (p->r.epoch.rfind(".") == string::npos) p->r.epoch.insert(0, "01.01."); - *f_out << setw(PRINT_VAR_PAD) << left << "Target Epoch: " << + *f_out << setw(PRINT_VAR_PAD) << left << "Target epoch: " << formattedDateStringFromNumericString(p->r.epoch); if (isEpsgDatumStatic(epsgCode)) *f_out << " (ignored: " << p->r.reference_frame << " is static)"; @@ -489,7 +488,7 @@ int main(int argc, char* argv[]) if (p.r.epoch.rfind(".") == string::npos) p.r.epoch.insert(0, "01.01."); - cout << setw(PRINT_VAR_PAD) << left << " Target Epoch: " << + cout << setw(PRINT_VAR_PAD) << left << " Target epoch: " << formattedDateStringFromNumericString(p.r.epoch); if (isEpsgDatumStatic(epsgCode)) cout << " (ignored: " << p.r.reference_frame << " is static)"; From 67e93ba32d7748c48eb7267fd4e00c1275974e82 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 25 Oct 2024 17:49:43 +1100 Subject: [PATCH 040/102] Harmonise all references to zenith distance --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 34 +- .../dynadjust/dnaimport/dnaparser_pimpl.cxx | 8 +- dynadjust/dynadjust/dnaplot/dnaplot.cpp | 12 +- dynadjust/dynadjust/dnareftran/dnareftran.cpp | 2 +- .../include/functions/dnatemplatefuncs.hpp | 2 +- .../functions/dnatemplatestnmsrfuncs.hpp | 6 +- dynadjust/include/io/dnaioaml.cpp | 2 +- dynadjust/include/io/dnaioseg.cpp | 2 +- .../measurement_types/dnadirectionset.cpp | 2 +- .../measurement_types/dnameasurement.hpp | 2 +- .../include/measurement_types/dnamsrtally.cpp | 14 +- sampleData/urban-networkmsr.xml | 600 +++++++++--------- 12 files changed, 343 insertions(+), 343 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index fbb85bb1..0c3a8799 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -861,7 +861,7 @@ void dna_import::ApplyDiscontinuitiesMeasurements(vdnaMsrPtr* vMeasurements) case 'L': // Level difference case 'M': // MSL arc case 'S': // Slope distance - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle continue; } @@ -1594,7 +1594,7 @@ void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT3 ParseDNAMSRLinear(sBuf, msr_ptr); (*msrCount) += 1; break; - case 'V': // Zenith angle + case 'V': // Zenith distance g_parsemsr_tally.V++; msr_ptr.reset(new CDnaDirection); ParseDNAMSRAngular(sBuf, msr_ptr); @@ -2914,7 +2914,7 @@ void dna_import::IncludeMeasurementTypes(const string& includeMsrs, vdnaMsrPtr* case 'S': // Slope distance msrtallyTmp.S = parsemsrTally->S; break; - case 'V': // Zenith angle + case 'V': // Zenith distance msrtallyTmp.V = parsemsrTally->V; break; case 'X': // GPS Baseline cluster @@ -2994,7 +2994,7 @@ void dna_import::ExcludeMeasurementTypes(const string& excludeMsrs, vdnaMsrPtr* case 'S': // Slope distance parsemsrTally->S = 0; break; - case 'V': // Zenith angle + case 'V': // Zenith distance parsemsrTally->V = 0; break; case 'X': // GPS Baseline cluster @@ -3573,7 +3573,7 @@ void dna_import::ExtractAssociatedStns(vdnaMsrPtr* vMeasurements, pvstring pvUse case 'M': // MSL arc case 'S': // Slope distance case 'L': // Level difference - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle continue; } @@ -3852,7 +3852,7 @@ void dna_import::ImportStnsMsrsFromNetwork(vdnaStnPtr* vStations, vdnaMsrPtr* vM case 'S': // Slope distance g_parsemsr_tally.S++; break; - case 'V': // Zenith angle + case 'V': // Zenith distance g_parsemsr_tally.V++; break; case 'X': // GPS Baseline cluster @@ -4010,7 +4010,7 @@ void dna_import::ImportStnsMsrsFromBlock(vdnaStnPtr* vStations, vdnaMsrPtr* vMea case 'S': // Slope distance g_parsemsr_tally.S++; break; - case 'V': // Zenith angle + case 'V': // Zenith distance g_parsemsr_tally.V++; break; case 'X': // GPS Baseline cluster @@ -5089,7 +5089,7 @@ UINT32 dna_import::FindSimilarMeasurements(vdnaMsrPtr* vMeasurements, vdnaMsrPtr continue; break; - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle if (*(static_cast(&(*_it_msr->get()))) == *(static_cast(&(*_it_msrprev->get())))) @@ -5773,11 +5773,11 @@ void dna_import::IgnoreInsufficientMeasurements(vdnaStnPtr* vStations, vdnaMsrPt continue; case 'H': // Orthometric height case 'R': // Ellipsoidal height - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle case 'L': // Level difference // Continue if: - // - an ellipsoid/orthometric height or vertical/zenith angle is found, and either + // - an ellipsoid/orthometric height or vertical angle/zenith distance is found, and either // - the station is constrained in 3D, or // - the station is constrained in 2D switch (vStations->at(stnIndex)->GetConstraintType()) @@ -5798,7 +5798,7 @@ void dna_import::IgnoreInsufficientMeasurements(vdnaStnPtr* vStations, vdnaMsrPt default: // All other 2D measurement types, which, alone, do not // sufficiently constrain coordinates in 2D. So, continue if: - // - a latitude or longitude or ellipsoid/orthometric height or vertical/zenith angle is found, and + // - a latitude or longitude or ellipsoid/orthometric height or vertical angle/zenith distance is found, and // - the station is held constrained in two dimensions switch (vStations->at(stnIndex)->GetConstraintType()) { @@ -5867,7 +5867,7 @@ void dna_import::IgnoreInsufficientMeasurements(vdnaStnPtr* vStations, vdnaMsrPt case 'L': // Level difference case 'M': // MSL arc case 'S': // Slope distance - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle if (binary_search(vInsufficientMsrStns.begin(), @@ -6064,7 +6064,7 @@ void dna_import::MapMeasurementStations(vdnaMsrPtr* vMeasurements, pvASLPtr vAss case 'L': // Level difference case 'M': // MSL arc case 'S': // Slope distance - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle ss << " to " << _it_msr->get()->GetTarget(); } @@ -6176,7 +6176,7 @@ void dna_import::MapMeasurementStations(vdnaMsrPtr* vMeasurements, pvASLPtr vAss g_map_tally.L ++; (*lMapCount)++; continue; - case 'V': // Zenith angle + case 'V': // Zenith distance g_map_tally.V ++; (*lMapCount)++; continue; @@ -6301,7 +6301,7 @@ UINT32 dna_import::ComputeMeasurementCount(vdnaMsrPtr* vMeasurements, const vUIN case 'S': // Slope distance msr_tally.S++; break; - case 'V': // Zenith angle + case 'V': // Zenith distance msr_tally.V++; break; case 'Y': // GPS point cluster @@ -6708,7 +6708,7 @@ void dna_import::CompleteAssociationLists(vdnaMsrPtr* vMeasurements, pvASLPtr vA case 'M': // MSL arc case 'S': // Slope distance case 'L': // Level difference - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle currentBmsFileIndex ++; continue; @@ -6772,7 +6772,7 @@ void dna_import::CompleteAssociationLists(vdnaMsrPtr* vMeasurements, pvASLPtr vA // case 'M': // MSL arc // case 'S': // Slope distance // case 'L': // Level difference -// case 'V': // Zenith angle +// case 'V': // Zenith distance // case 'Z': // Vertical angle // vIgnoredMsrStations.push_back(it_Dirns->GetStn2Index()); // case 'H': // Orthometric height diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index 749b0ea8..1b4b77ee 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -302,7 +302,7 @@ void DnaMeasurement_pimpl::Type(const ::std::string& Type) *(_pMeasurementCount) += 1; _dnaCurrentMsr.reset(new CDnaDistance); break; - case 'V': // Zenith angle + case 'V': // Zenith distance g_parsemsr_tally.V++; *(_pMeasurementCount) += 1; _dnaCurrentMsr.reset(new CDnaDirection); @@ -363,7 +363,7 @@ void DnaMeasurement_pimpl::Second(const ::std::string& Second) case 'D': // Direction set case 'G': // GPS Baseline case 'L': // Level difference - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle case 'X': // GPS Baseline cluster if (Second.empty()) @@ -417,7 +417,7 @@ void DnaMeasurement_pimpl::Value(const ::std::string& Value) case 'P': // Geodetic latitude case 'Q': // Geodetic longitude case 'L': // Level difference - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle if (Value.empty()) { @@ -452,7 +452,7 @@ void DnaMeasurement_pimpl::StdDev(const ::std::string& StdDev) case 'P': // Geodetic latitude case 'Q': // Geodetic longitude case 'L': // Level difference - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle if (StdDev.empty()) { diff --git a/dynadjust/dynadjust/dnaplot/dnaplot.cpp b/dynadjust/dynadjust/dnaplot/dnaplot.cpp index e3b44a55..529d89cf 100644 --- a/dynadjust/dynadjust/dnaplot/dnaplot.cpp +++ b/dynadjust/dynadjust/dnaplot/dnaplot.cpp @@ -393,7 +393,7 @@ void dna_plot::ComputeMeasurementCount() case 'S': // Slope distance v_msr_tally_.at(block).S++; break; - case 'V': // Zenith angle + case 'V': // Zenith distance v_msr_tally_.at(block).V++; break; case 'Y': // GPS point cluster @@ -2979,7 +2979,7 @@ void dna_plot::PrintMeasurementsDatFiles() _combined_msr_list.push_back('Q'); // Geodetic longitude _combined_msr_list.push_back('R'); // Ellipsoidal height _combined_msr_list.push_back('S'); // Slope distance - _combined_msr_list.push_back('V'); // Zenith angle + _combined_msr_list.push_back('V'); // Zenith distance _combined_msr_list.push_back('X'); // GPS Baseline cluster _combined_msr_list.push_back('Y'); // GPS point cluster _combined_msr_list.push_back('Z'); // Vertical angle @@ -3143,7 +3143,7 @@ void dna_plot::PrintMeasurementsDatFileBlock(const UINT32& block, char msrType, case 'M': // MSL arc case 'S': // Slope distance case 'L': // Level difference - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle // Get the measurement indices involved in this measurement GetMsrIndices(bmsBinaryRecords_, *_it_block_msr, msrIndices); @@ -3289,7 +3289,7 @@ void dna_plot::PrintMeasurementsDatFile(char msrType, std::ofstream* msr_file_st case 'M': // MSL arc case 'S': // Slope distance case 'L': // Level difference - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle if (!default_limits_) @@ -3524,7 +3524,7 @@ void dna_plot::LoadBinaryFiles() case 'S': // Slope distance parsemsrTally_.S++; break; - case 'V': // Zenith angle + case 'V': // Zenith distance parsemsrTally_.V++; break; case 'X': // GPS Baseline cluster @@ -4253,7 +4253,7 @@ void dna_plot::SignalExceptionPlot(const string& msg, const int& line_no, const // case 'M': // MSL arc // case 'S': // Slope distance // case 'L': // Level difference -// case 'V': // Zenith angle +// case 'V': // Zenith distance // case 'Z': // Vertical angle // // First // it_stnmap_range = equal_range(stnsMap_.begin(), stnsMap_.end(), diff --git a/dynadjust/dynadjust/dnareftran/dnareftran.cpp b/dynadjust/dynadjust/dnareftran/dnareftran.cpp index 24d03c2d..0f5b2ed8 100644 --- a/dynadjust/dynadjust/dnareftran/dnareftran.cpp +++ b/dynadjust/dynadjust/dnareftran/dnareftran.cpp @@ -1600,7 +1600,7 @@ void dna_reftran::TransformMeasurementRecords(const string& newFrame, const stri case 'Q': // Geodetic longitude case 'R': // Ellipsoidal height case 'S': // Slope distance - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle continue; } diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index 2336689c..e292cfc3 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -1943,7 +1943,7 @@ class CompareFreeClusterAllStns case 'M': // MSL arc case 'S': // Slope distance case 'L': // Level difference - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle case 'G': // GPS Baseline (treat as single-baseline cluster) case 'X': // GPS Baseline cluster diff --git a/dynadjust/include/functions/dnatemplatestnmsrfuncs.hpp b/dynadjust/include/functions/dnatemplatestnmsrfuncs.hpp index 824ca8c6..347c50d5 100644 --- a/dynadjust/include/functions/dnatemplatestnmsrfuncs.hpp +++ b/dynadjust/include/functions/dnatemplatestnmsrfuncs.hpp @@ -704,7 +704,7 @@ class FindMsrsConnectedToStns{ case 'L': // Level difference case 'B': // Geodetic azimuth case 'K': // Astronomic azimuth - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle return false; } @@ -770,7 +770,7 @@ void ResetMeasurementPtr(dnaMsrPtr* msrPtr, const T& cType) case 'R': // Ellipsoidal height msrPtr->reset(new CDnaHeight); break; - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle msrPtr->reset(new CDnaDirection); break; @@ -857,7 +857,7 @@ class CompareMsr { return *(dynamic_cast(&(*left))) < *(dynamic_cast(&(*right))); - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle return *(dynamic_cast(&(*left))) < *(dynamic_cast(&(*right))); diff --git a/dynadjust/include/io/dnaioaml.cpp b/dynadjust/include/io/dnaioaml.cpp index 5bdb3a5f..29fd293b 100644 --- a/dynadjust/include/io/dnaioaml.cpp +++ b/dynadjust/include/io/dnaioaml.cpp @@ -398,7 +398,7 @@ void dna_io_aml::write_aml_file_txt(const string& bms_filename, const string& am case 'L': // Level difference case 'M': // MSL arc case 'S': // Slope distance - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle if (stn_index == binaryMsrRecords.at(*_it_msr).station2) ss_aml << left << " (Second)"; diff --git a/dynadjust/include/io/dnaioseg.cpp b/dynadjust/include/io/dnaioseg.cpp index 7ad8fc7a..3bf8f48e 100644 --- a/dynadjust/include/io/dnaioseg.cpp +++ b/dynadjust/include/io/dnaioseg.cpp @@ -380,7 +380,7 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, case 'R': // Ellipsoidal height case 'M': // MSL arc case 'S': // Slope distance - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle default: v_measurementCount->at(b)++; // single measurement quantity diff --git a/dynadjust/include/measurement_types/dnadirectionset.cpp b/dynadjust/include/measurement_types/dnadirectionset.cpp index ffdd90b1..64e63b40 100644 --- a/dynadjust/include/measurement_types/dnadirectionset.cpp +++ b/dynadjust/include/measurement_types/dnadirectionset.cpp @@ -325,7 +325,7 @@ void CDnaDirectionSet::SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* e // Deflections available? if (fabs(stn1_it->get()->GetverticalDef()) > E4_SEC_DEFLECTION || fabs(stn1_it->get()->GetmeridianDef()) > E4_SEC_DEFLECTION) { - // 1. compute zenith angle + // 1. compute zenith distance double zenithDistance = ZenithDistance( stn1_it->get()->GetXAxis(), stn1_it->get()->GetYAxis(), diff --git a/dynadjust/include/measurement_types/dnameasurement.hpp b/dynadjust/include/measurement_types/dnameasurement.hpp index d5d8dafa..0f251eac 100644 --- a/dynadjust/include/measurement_types/dnameasurement.hpp +++ b/dynadjust/include/measurement_types/dnameasurement.hpp @@ -104,7 +104,7 @@ S measurement_name(const C& type) case 'R': return "(R) Ellipsoidal height"; case 'V': - return "(V) Zenith angle"; + return "(V) Zenith distance"; case 'Z': return "(Z) Vertical angle"; case 'Y': diff --git a/dynadjust/include/measurement_types/dnamsrtally.cpp b/dynadjust/include/measurement_types/dnamsrtally.cpp index c9e73ab7..e630769d 100644 --- a/dynadjust/include/measurement_types/dnamsrtally.cpp +++ b/dynadjust/include/measurement_types/dnamsrtally.cpp @@ -55,7 +55,7 @@ void MsrTally::FillMsrList(vchar& msr_list) msr_list.push_back('Q'); // Geodetic longitude msr_list.push_back('R'); // Ellipsoidal height msr_list.push_back('S'); // Slope distance - msr_list.push_back('V'); // Zenith angle + msr_list.push_back('V'); // Zenith distance msr_list.push_back('X'); // GPS Baseline cluster msr_list.push_back('Y'); // GPS point cluster msr_list.push_back('Z'); // Vertical angle @@ -423,7 +423,7 @@ UINT32 MsrTally::MeasurementCount(const char& msrType) return R; case 'S': // Slope distance return S; - case 'V': // Zenith angle + case 'V': // Zenith distance return V; case 'X': // GPS Baseline cluster return X; @@ -496,7 +496,7 @@ void MsrTally::CreateTally(const vdnaMsrPtr& vMeasurements) case 'S': // Slope distance S++; break; - case 'V': // Zenith angle + case 'V': // Zenith distance V++; break; case 'Y': // GPS point cluster @@ -565,7 +565,7 @@ void MsrTally::IncrementMsrType(const char& msrType, const UINT32& count) case 'S': // Slope distance S += count; break; - case 'V': // Zenith angle + case 'V': // Zenith distance V += count; break; case 'Y': // GPS point cluster @@ -641,7 +641,7 @@ void MsrTally::CreateTally(const vmsr_t& vMeasurements, const vUINT32& CML) case 'S': // Slope distance S++; break; - case 'V': // Zenith angle + case 'V': // Zenith distance V++; break; case 'Y': // GPS point cluster @@ -730,7 +730,7 @@ UINT32 MsrTally::CreateTally(const vmsr_t& vMeasurements, bool countValidOnly) case 'S': // Slope distance S++; break; - case 'V': // Zenith angle + case 'V': // Zenith distance V++; break; case 'Y': // GPS point cluster @@ -769,7 +769,7 @@ _MEASUREMENT_STATIONS_ MsrTally::Stations(const char& measType) case 'M': // MSL arc case 'S': // Slope distance case 'L': // Level difference - case 'V': // Zenith angle + case 'V': // Zenith distance case 'Z': // Vertical angle return TWO_STATION; // triple station measurements diff --git a/sampleData/urban-networkmsr.xml b/sampleData/urban-networkmsr.xml index 7006d7b7..33bd9fdc 100644 --- a/sampleData/urban-networkmsr.xml +++ b/sampleData/urban-networkmsr.xml @@ -224,7 +224,7 @@ 91.20310000 2.000000e+01 - + V @@ -237,7 +237,7 @@ 1.545 0.125 - + V @@ -4528,7 +4528,7 @@ 1.606 1.715 - + V @@ -4541,7 +4541,7 @@ 1.606 1.715 - + V @@ -4554,7 +4554,7 @@ 1.606 1.565 - + V @@ -4567,7 +4567,7 @@ 1.606 1.337 - + V @@ -4580,7 +4580,7 @@ 1.428 1.514 - + V @@ -4593,7 +4593,7 @@ 1.428 1.645 - + V @@ -4606,7 +4606,7 @@ 1.428 1.570 - + V @@ -4619,7 +4619,7 @@ 1.665 1.337 - + V @@ -4632,7 +4632,7 @@ 1.665 1.445 - + V @@ -4645,7 +4645,7 @@ 1.665 1.386 - + V @@ -4658,7 +4658,7 @@ 1.480 1.570 - + V @@ -4671,7 +4671,7 @@ 1.480 1.422 - + V @@ -4684,7 +4684,7 @@ 1.510 1.514 - + V @@ -4697,7 +4697,7 @@ 1.510 1.384 - + V @@ -4710,7 +4710,7 @@ 1.550 1.660 - + V @@ -4723,7 +4723,7 @@ 1.583 1.460 - + V @@ -4736,7 +4736,7 @@ 1.583 1.625 - + V @@ -4749,7 +4749,7 @@ 1.583 1.660 - + V @@ -4762,7 +4762,7 @@ 1.572 1.460 - + V @@ -4775,7 +4775,7 @@ 1.572 1.625 - + V @@ -4788,7 +4788,7 @@ 1.572 1.358 - + V @@ -4801,7 +4801,7 @@ 1.694 1.532 - + V @@ -4814,7 +4814,7 @@ 1.770 1.565 - + V @@ -4827,7 +4827,7 @@ 1.770 1.432 - + V @@ -4840,7 +4840,7 @@ 1.770 1.574 - + V @@ -4853,7 +4853,7 @@ 1.574 1.210 - + V @@ -4866,7 +4866,7 @@ 1.542 1.300 - + V @@ -4879,7 +4879,7 @@ 1.542 2.595 - + V @@ -4892,7 +4892,7 @@ 1.542 1.559 - + V @@ -4905,7 +4905,7 @@ 1.654 1.362 - + V @@ -4918,7 +4918,7 @@ 1.654 1.445 - + V @@ -4931,7 +4931,7 @@ 1.654 1.743 - + V @@ -4944,7 +4944,7 @@ 1.390 0.000 - + V @@ -4957,7 +4957,7 @@ 1.390 0.000 - + V @@ -4970,7 +4970,7 @@ 1.398 0.000 - + V @@ -4983,7 +4983,7 @@ 1.398 0.000 - + V @@ -4996,7 +4996,7 @@ 1.367 0.000 - + V @@ -5009,7 +5009,7 @@ 1.367 0.000 - + V @@ -5022,7 +5022,7 @@ 1.367 1.908 - + V @@ -5035,7 +5035,7 @@ 1.622 1.425 - + V @@ -5048,7 +5048,7 @@ 1.622 1.571 - + V @@ -5061,7 +5061,7 @@ 1.622 1.523 - + V @@ -5074,7 +5074,7 @@ 1.662 1.523 - + V @@ -5087,7 +5087,7 @@ 1.662 1.535 - + V @@ -5100,7 +5100,7 @@ 1.662 1.461 - + V @@ -5113,7 +5113,7 @@ 1.547 1.678 - + V @@ -5126,7 +5126,7 @@ 1.547 1.573 - + V @@ -5139,7 +5139,7 @@ 1.547 1.492 - + V @@ -5152,7 +5152,7 @@ 1.584 1.456 - + V @@ -5165,7 +5165,7 @@ 1.584 1.588 - + V @@ -5178,7 +5178,7 @@ 1.520 1.588 - + V @@ -5191,7 +5191,7 @@ 1.722 1.537 - + V @@ -5204,7 +5204,7 @@ 1.722 1.510 - + V @@ -5217,7 +5217,7 @@ 1.722 1.469 - + V @@ -5230,7 +5230,7 @@ 1.560 1.627 - + V @@ -5243,7 +5243,7 @@ 1.560 1.759 - + V @@ -5256,7 +5256,7 @@ 1.532 1.272 - + V @@ -5269,7 +5269,7 @@ 1.532 1.763 - + V @@ -5282,7 +5282,7 @@ 1.532 1.513 - + V @@ -5295,7 +5295,7 @@ 1.473 1.545 - + V @@ -5308,7 +5308,7 @@ 1.473 1.763 - + V @@ -5321,7 +5321,7 @@ 1.473 1.580 - + V @@ -5334,7 +5334,7 @@ 1.708 1.860 - + V @@ -5347,7 +5347,7 @@ 1.708 1.545 - + V @@ -5360,7 +5360,7 @@ 1.675 1.523 - + V @@ -5373,7 +5373,7 @@ 1.675 1.502 - + V @@ -5386,7 +5386,7 @@ 1.675 1.528 - + V @@ -5399,7 +5399,7 @@ 1.623 1.524 - + V @@ -5412,7 +5412,7 @@ 1.623 1.472 - + V @@ -5425,7 +5425,7 @@ 1.623 1.578 - + V @@ -5438,7 +5438,7 @@ 1.621 1.524 - + V @@ -5451,7 +5451,7 @@ 1.621 1.493 - + V @@ -5464,7 +5464,7 @@ 1.538 1.113 - + V @@ -5477,7 +5477,7 @@ 1.538 1.380 - + V @@ -5490,7 +5490,7 @@ 1.538 0.000 - + V @@ -5503,7 +5503,7 @@ 1.769 1.481 - + V @@ -5516,7 +5516,7 @@ 1.769 1.416 - + V @@ -5529,7 +5529,7 @@ 1.614 1.500 - + V @@ -5542,7 +5542,7 @@ 1.614 1.404 - + V @@ -5555,7 +5555,7 @@ 1.731 1.500 - + V @@ -5568,7 +5568,7 @@ 1.731 1.404 - + V @@ -5581,7 +5581,7 @@ 1.731 1.392 - + V @@ -5594,7 +5594,7 @@ 1.499 1.433 - + V @@ -5607,7 +5607,7 @@ 1.499 1.638 - + V @@ -5620,7 +5620,7 @@ 1.499 1.401 - + V @@ -5633,7 +5633,7 @@ 1.491 1.410 - + V @@ -5646,7 +5646,7 @@ 1.491 1.452 - + V @@ -5659,7 +5659,7 @@ 1.369 1.401 - + V @@ -5672,7 +5672,7 @@ 1.369 1.410 - + V @@ -5685,7 +5685,7 @@ 1.369 1.539 - + V @@ -5698,7 +5698,7 @@ 1.649 1.436 - + V @@ -5711,7 +5711,7 @@ 1.649 1.444 - + V @@ -5724,7 +5724,7 @@ 1.649 1.634 - + V @@ -5737,7 +5737,7 @@ 1.512 1.410 - + V @@ -5750,7 +5750,7 @@ 1.512 1.470 - + V @@ -5763,7 +5763,7 @@ 1.512 1.614 - + V @@ -5776,7 +5776,7 @@ 1.564 1.419 - + V @@ -5789,7 +5789,7 @@ 1.564 1.614 - + V @@ -5802,7 +5802,7 @@ 1.705 1.489 - + V @@ -5815,7 +5815,7 @@ 1.705 1.470 - + V @@ -5828,7 +5828,7 @@ 1.705 1.642 - + V @@ -5841,7 +5841,7 @@ 1.735 1.614 - + V @@ -5854,7 +5854,7 @@ 1.735 1.413 - + V @@ -5867,7 +5867,7 @@ 1.614 1.433 - + V @@ -5880,7 +5880,7 @@ 1.522 1.543 - + V @@ -5893,7 +5893,7 @@ 1.516 1.543 - + V @@ -5906,7 +5906,7 @@ 1.516 1.550 - + V @@ -5919,7 +5919,7 @@ 1.385 1.394 - + V @@ -5932,7 +5932,7 @@ 1.606 1.616 - + V @@ -5945,7 +5945,7 @@ 1.385 1.368 - + V @@ -5958,7 +5958,7 @@ 1.385 1.287 - + V @@ -5971,7 +5971,7 @@ 1.462 1.291 - + V @@ -5984,7 +5984,7 @@ 1.462 1.296 - + V @@ -5997,7 +5997,7 @@ 1.392 1.369 - + V @@ -6010,7 +6010,7 @@ 1.392 1.295 - + V @@ -6023,7 +6023,7 @@ 1.392 1.340 - + V @@ -6036,7 +6036,7 @@ 1.393 1.329 - + V @@ -6049,7 +6049,7 @@ 1.393 1.298 - + V @@ -6062,7 +6062,7 @@ 1.640 1.570 - + V @@ -6075,7 +6075,7 @@ 1.540 1.530 - + V @@ -6088,7 +6088,7 @@ 1.540 1.520 - + V @@ -6101,7 +6101,7 @@ 1.540 1.530 - + V @@ -6114,7 +6114,7 @@ 1.530 1.550 - + V @@ -6127,7 +6127,7 @@ 1.490 1.450 - + V @@ -6140,7 +6140,7 @@ 1.240 1.690 - + V @@ -6153,7 +6153,7 @@ 1.550 1.470 - + V @@ -6166,7 +6166,7 @@ 1.540 1.080 - + V @@ -6179,7 +6179,7 @@ 1.603 1.190 - + V @@ -6192,7 +6192,7 @@ 1.696 1.604 - + V @@ -6205,7 +6205,7 @@ 1.696 1.616 - + V @@ -6218,7 +6218,7 @@ 1.696 1.634 - + V @@ -6231,7 +6231,7 @@ 1.490 1.570 - + V @@ -6244,7 +6244,7 @@ 1.530 1.355 - + V @@ -6257,7 +6257,7 @@ 1.530 1.550 - + V @@ -6270,7 +6270,7 @@ 1.540 1.540 - + V @@ -6283,7 +6283,7 @@ 1.312 1.237 - + V @@ -6296,7 +6296,7 @@ 1.312 1.458 - + V @@ -6309,7 +6309,7 @@ 1.468 1.523 - + V @@ -6322,7 +6322,7 @@ 1.548 1.615 - + V @@ -6335,7 +6335,7 @@ 1.319 1.314 - + V @@ -6348,7 +6348,7 @@ 1.319 1.581 - + V @@ -6361,7 +6361,7 @@ 1.688 1.665 - + V @@ -6374,7 +6374,7 @@ 1.322 1.581 - + V @@ -6387,7 +6387,7 @@ 1.322 1.338 - + V @@ -6400,7 +6400,7 @@ 1.338 1.306 - + V @@ -6413,7 +6413,7 @@ 1.310 1.306 - + V @@ -6426,7 +6426,7 @@ 1.370 1.438 - + V @@ -6439,7 +6439,7 @@ 1.381 1.361 - + V @@ -6452,7 +6452,7 @@ 1.540 1.510 - + V @@ -6465,7 +6465,7 @@ 1.540 1.540 - + V @@ -6478,7 +6478,7 @@ 1.560 1.480 - + V @@ -6491,7 +6491,7 @@ 1.520 1.530 - + V @@ -6504,7 +6504,7 @@ 1.520 1.520 - + V @@ -6517,7 +6517,7 @@ 1.530 1.550 - + V @@ -6530,7 +6530,7 @@ 1.540 1.540 - + V @@ -6543,7 +6543,7 @@ 1.560 1.600 - + V @@ -6556,7 +6556,7 @@ 1.644 1.641 - + V @@ -6569,7 +6569,7 @@ 1.490 1.590 - + V @@ -6582,7 +6582,7 @@ 1.540 1.080 - + V @@ -6595,7 +6595,7 @@ 1.540 1.615 - + V @@ -6608,7 +6608,7 @@ 1.540 1.580 - + V @@ -6621,7 +6621,7 @@ 1.170 1.675 - + V @@ -6634,7 +6634,7 @@ 1.520 1.530 - + V @@ -6647,7 +6647,7 @@ 1.570 0.880 - + V @@ -6660,7 +6660,7 @@ 1.545 1.610 - + V @@ -6673,7 +6673,7 @@ 1.505 2.000 - + V @@ -6686,7 +6686,7 @@ 1.738 1.704 - + V @@ -6699,7 +6699,7 @@ 1.505 1.514 - + V @@ -6712,7 +6712,7 @@ 1.612 1.414 - + V @@ -6725,7 +6725,7 @@ 1.612 1.322 - + V @@ -6738,7 +6738,7 @@ 1.412 1.514 - + V @@ -6751,7 +6751,7 @@ 1.412 1.305 - + V @@ -6764,7 +6764,7 @@ 1.555 1.415 - + V @@ -6777,7 +6777,7 @@ 1.555 1.492 - + V @@ -6790,7 +6790,7 @@ 1.501 1.461 - + V @@ -6803,7 +6803,7 @@ 1.501 1.492 - + V @@ -6816,7 +6816,7 @@ 1.601 1.406 - + V @@ -6829,7 +6829,7 @@ 1.601 1.337 - + V @@ -6842,7 +6842,7 @@ 1.601 1.337 - + V @@ -6855,7 +6855,7 @@ 1.601 1.406 - + V @@ -6868,7 +6868,7 @@ 1.549 1.333 - + V @@ -6881,7 +6881,7 @@ 1.549 1.619 - + V @@ -6894,7 +6894,7 @@ 1.549 1.619 - + V @@ -6907,7 +6907,7 @@ 1.549 1.530 - + V @@ -6920,7 +6920,7 @@ 1.525 1.578 - + V @@ -6933,7 +6933,7 @@ 1.730 1.493 - + V @@ -6946,7 +6946,7 @@ 1.730 1.242 - + V @@ -8031,7 +8031,7 @@ 111.18442000 2.000000e+01 - + V @@ -8044,7 +8044,7 @@ 1.608 1.560 - + V @@ -8057,7 +8057,7 @@ 1.608 1.500 - + V @@ -8070,7 +8070,7 @@ 1.608 1.474 - + V @@ -8083,7 +8083,7 @@ 1.608 1.425 - + V @@ -8096,7 +8096,7 @@ 1.608 1.482 - + V @@ -8109,7 +8109,7 @@ 1.562 1.567 - + V @@ -8122,7 +8122,7 @@ 1.562 1.472 - + V @@ -8135,7 +8135,7 @@ 1.562 1.467 - + V @@ -8148,7 +8148,7 @@ 1.562 1.486 - + V @@ -8161,7 +8161,7 @@ 1.562 1.501 - + V @@ -8174,7 +8174,7 @@ 1.562 1.512 - + V @@ -8187,7 +8187,7 @@ 1.604 1.533 - + V @@ -8200,7 +8200,7 @@ 1.604 1.567 - + V @@ -8213,7 +8213,7 @@ 1.604 1.472 - + V @@ -8226,7 +8226,7 @@ 1.604 1.467 - + V @@ -8239,7 +8239,7 @@ 1.604 1.512 - + V @@ -8252,7 +8252,7 @@ 1.604 1.560 - + V @@ -8265,7 +8265,7 @@ 1.580 1.472 - + V @@ -8278,7 +8278,7 @@ 1.580 1.533 - + V @@ -8291,7 +8291,7 @@ 1.580 1.486 - + V @@ -8304,7 +8304,7 @@ 1.580 1.501 - + V @@ -8317,7 +8317,7 @@ 1.580 1.579 - + V @@ -8330,7 +8330,7 @@ 1.580 1.472 - + V @@ -8343,7 +8343,7 @@ 1.580 1.512 - + V @@ -8356,7 +8356,7 @@ 1.580 1.528 - + V @@ -8369,7 +8369,7 @@ 1.537 1.570 - + V @@ -8382,7 +8382,7 @@ 1.537 1.530 - + V @@ -8395,7 +8395,7 @@ 1.457 1.448 - + V @@ -8408,7 +8408,7 @@ 1.457 1.470 - + V @@ -8421,7 +8421,7 @@ 1.457 1.627 - + V @@ -8434,7 +8434,7 @@ 1.457 1.510 - + V @@ -8447,7 +8447,7 @@ 1.457 1.450 - + V @@ -8460,7 +8460,7 @@ 1.457 1.530 - + V @@ -8473,7 +8473,7 @@ 1.457 1.530 - + V @@ -8486,7 +8486,7 @@ 1.575 1.577 - + V @@ -8499,7 +8499,7 @@ 1.575 1.530 - + V @@ -8512,7 +8512,7 @@ 1.575 1.448 - + V @@ -8525,7 +8525,7 @@ 1.575 1.470 - + V @@ -8538,7 +8538,7 @@ 1.575 1.450 - + V @@ -8551,7 +8551,7 @@ 1.575 1.627 - + V @@ -8564,7 +8564,7 @@ 1.570 1.618 - + V @@ -8577,7 +8577,7 @@ 1.570 1.548 - + V @@ -8590,7 +8590,7 @@ 1.570 1.607 - + V @@ -8603,7 +8603,7 @@ 1.570 1.575 - + V @@ -8616,7 +8616,7 @@ 1.570 1.802 - + V @@ -8629,7 +8629,7 @@ 1.615 1.538 - + V @@ -8642,7 +8642,7 @@ 1.615 1.505 - + V @@ -8655,7 +8655,7 @@ 1.615 1.578 - + V @@ -8668,7 +8668,7 @@ 1.615 1.496 - + V @@ -8681,7 +8681,7 @@ 1.615 1.583 - + V @@ -8694,7 +8694,7 @@ 1.615 1.538 - + V @@ -8707,7 +8707,7 @@ 1.615 1.595 - + V @@ -8720,7 +8720,7 @@ 1.615 1.525 - + V @@ -8733,7 +8733,7 @@ 1.620 1.505 - + V @@ -8746,7 +8746,7 @@ 1.620 1.523 - + V @@ -8759,7 +8759,7 @@ 1.620 1.555 - + V @@ -8772,7 +8772,7 @@ 1.620 1.496 - + V @@ -8785,7 +8785,7 @@ 1.620 1.578 - + V @@ -8798,7 +8798,7 @@ 1.620 1.583 - + V @@ -8811,7 +8811,7 @@ 1.620 1.538 - + V @@ -8824,7 +8824,7 @@ 1.612 1.505 - + V @@ -8837,7 +8837,7 @@ 1.612 1.578 - + V @@ -8850,7 +8850,7 @@ 1.612 1.583 - + V @@ -8863,7 +8863,7 @@ 1.612 1.538 - + V @@ -8876,7 +8876,7 @@ 1.582 1.659 - + V @@ -8889,7 +8889,7 @@ 1.582 1.583 - + V @@ -8902,7 +8902,7 @@ 1.582 1.563 - + V @@ -8915,7 +8915,7 @@ 1.582 1.538 - + V @@ -8928,7 +8928,7 @@ 1.582 1.496 - + V @@ -8941,7 +8941,7 @@ 1.582 1.504 - + V @@ -8954,7 +8954,7 @@ 1.576 1.676 - + V @@ -8967,7 +8967,7 @@ 1.587 1.656 - + V @@ -8980,7 +8980,7 @@ 1.576 1.581 - + V @@ -8993,7 +8993,7 @@ 1.587 1.645 - + V @@ -9006,7 +9006,7 @@ 1.576 1.451 - + V @@ -9019,7 +9019,7 @@ 1.587 1.624 - + V @@ -9032,7 +9032,7 @@ 1.576 1.411 - + V @@ -9045,7 +9045,7 @@ 1.587 1.601 - + V @@ -9058,7 +9058,7 @@ 1.620 1.561 - + V @@ -9071,7 +9071,7 @@ 1.529 1.581 - + V @@ -9084,7 +9084,7 @@ 1.620 1.573 - + V @@ -9097,7 +9097,7 @@ 1.529 1.620 - + V @@ -9110,7 +9110,7 @@ 1.620 1.610 - + V @@ -9123,7 +9123,7 @@ 1.529 1.411 - + V @@ -9136,7 +9136,7 @@ 1.620 1.601 - + V @@ -9149,7 +9149,7 @@ 1.397 1.425 - + V @@ -9162,7 +9162,7 @@ 1.397 1.411 - + V @@ -9175,7 +9175,7 @@ 1.397 1.557 - + V @@ -9188,7 +9188,7 @@ 1.397 1.558 - + V @@ -9201,7 +9201,7 @@ 1.579 1.376 - + V @@ -9214,7 +9214,7 @@ 1.590 1.583 - + V @@ -9227,7 +9227,7 @@ 1.579 1.425 - + V @@ -9240,7 +9240,7 @@ 1.590 1.624 - + V @@ -9253,7 +9253,7 @@ 1.579 1.558 - + V @@ -9266,7 +9266,7 @@ 1.590 1.604 - + V @@ -9279,7 +9279,7 @@ 1.579 1.557 - + V @@ -10644,7 +10644,7 @@ 1.730 1.346 - + V @@ -10990,7 +10990,7 @@ 178.46090000 2.000000e+01 - + V @@ -11003,7 +11003,7 @@ 1.550 1.572 - + V @@ -11016,7 +11016,7 @@ 1.358 1.565 - + V @@ -11029,7 +11029,7 @@ 1.458 1.210 - + V @@ -11042,7 +11042,7 @@ 1.458 1.295 - + V @@ -11055,7 +11055,7 @@ 1.314 1.295 - + V @@ -11068,7 +11068,7 @@ 1.581 1.371 - + V @@ -11081,7 +11081,7 @@ 1.310 1.259 - + V @@ -11094,7 +11094,7 @@ 1.730 1.346 - + V @@ -11107,7 +11107,7 @@ 1.652 1.545 - + V @@ -11120,7 +11120,7 @@ 1.510 1.585 - + V @@ -11133,7 +11133,7 @@ 1.735 1.543 - + V @@ -11146,7 +11146,7 @@ 1.538 0.000 - + V From 77981f928d2fdc1c8c7a496be427d227511800ad Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Thu, 23 Jan 2025 16:01:48 +1100 Subject: [PATCH 041/102] New method to get reference epoch from epsg string --- dynadjust/include/parameters/dnaepsg.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dynadjust/include/parameters/dnaepsg.hpp b/dynadjust/include/parameters/dnaepsg.hpp index 13809c3d..5ee97897 100644 --- a/dynadjust/include/parameters/dnaepsg.hpp +++ b/dynadjust/include/parameters/dnaepsg.hpp @@ -557,6 +557,12 @@ string referenceepochFromEpsgCode(const U& epsgCode) } return ""; } + +template +S referenceepochFromEpsgString(const S& epsgString) +{ + return referenceepochFromEpsgCode(LongFromString(epsgString)); +} template S datumFromEpsgCode(const U& epsgCode) From 57fdeb354e17f7bfc7798639293433eb359e9c96 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Thu, 23 Jan 2025 16:15:30 +1100 Subject: [PATCH 042/102] Add epoch as optional argument and handle datum init --- .../dnaimportwrapper/dnaimportwrapper.cpp | 195 ++++++++++++------ dynadjust/include/config/dnaoptions.hpp | 6 +- 2 files changed, 141 insertions(+), 60 deletions(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index c18f5911..cd4593b5 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -71,7 +71,10 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, pro if (p->i.override_input_rfame) *f_out << setw(PRINT_VAR_PAD) << left << "Override input file ref frame:" << yesno_string(p->i.override_input_rfame) << endl; - + if (p->i.user_supplied_epoch) + *f_out << setw(PRINT_VAR_PAD) << left << "Project epoch:" << p->i.epoch << " (user supplied)" << endl; + else + *f_out << setw(PRINT_VAR_PAD) << left << "Project epoch:" << "To be assumed from the first input file" << endl; if (!p->i.include_msrs.empty()) @@ -152,6 +155,12 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& return EXIT_FAILURE; } + if (vm.count(EPOCH) && !vm.count(REFERENCE_FRAME)) + { + cout << endl << "- A reference frame must be provided when providing an epoch. " << endl << endl; + return EXIT_FAILURE; + } + // Normalise files using input folder for_each(p.i.input_files.begin(), p.i.input_files.end(), [&p] (string& file) { @@ -208,7 +217,7 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& p.i.asl_file = formPath(p.g.output_folder, p.g.network_name, "asl"); // associated stations list p.i.aml_file = formPath(p.g.output_folder, p.g.network_name, "aml"); // associated measurements list p.i.map_file = formPath(p.g.output_folder, p.g.network_name, "map"); // station names map - p.i.dst_file = formPath(p.g.output_folder, p.g.network_name, "dst"); // fuplicate stations + p.i.dst_file = formPath(p.g.output_folder, p.g.network_name, "dst"); // duplicate stations p.i.dms_file = formPath(p.g.output_folder, p.g.network_name, "dms"); // duplicate measurements p.i.imp_file = formPath(p.g.output_folder, p.g.network_name, "imp"); // log @@ -217,7 +226,21 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (vm.count(OVERRIDE_INPUT_FRAME)) p.i.override_input_rfame = 1; if (vm.count(REFERENCE_FRAME)) + { + p.i.reference_frame = str_upper(p.i.reference_frame); p.i.user_supplied_frame = 1; + } + + if (vm.count(EPOCH)) + { + // Get today's date? + if (iequals(p.i.epoch, "today")) + p.i.epoch = stringFromToday(); + // Has the user supplied the year only? + else if (p.i.epoch.rfind(".") == string::npos) + p.i.epoch.insert(0, "01.01."); + p.i.user_supplied_epoch = 1; + } ////////////////////////////////////////////////////////////////////////////// // Data screening options @@ -522,6 +545,57 @@ int SearchForSimilarMeasurements(dna_import* parserDynaML, project_settings* p, return EXIT_SUCCESS; } + +void ReportExportedData(const project_settings& p, std::ostream& out, const size_t& file_type, + const UINT32& stnCount, const UINT32& msrCount) +{ + string dataExported; + if (stnCount > 0 && msrCount == 0) + dataExported = "stations"; + else if (stnCount == 0 && msrCount > 0) + dataExported = "measurements"; + else if (stnCount > 0 && msrCount > 0) + dataExported = "stations and measurements"; + + string stn_file, msr_file, single_file; + bool print_single_xml = (p.i.export_single_xml_file && p.i.export_dynaml); + + switch (file_type) + { + case dna: + stn_file = leafStr(p.i.dna_stnfile); + msr_file = leafStr(p.i.dna_msrfile); + break; + case dynaml: + if (print_single_xml) + single_file = leafStr(p.i.xml_outfile); + else + { + stn_file = leafStr(p.i.xml_stnfile); + msr_file = leafStr(p.i.xml_msrfile); + } + break; + default: + break; + } + + out << "+ Exporting " << dataExported << " to:" << endl; + if (file_type == dynaml && print_single_xml) + out << " - " << single_file << "... "; + else + { + if (stnCount > 0) + { + out << " - " << stn_file; + if (msrCount > 0) + out << endl; + } + if (msrCount > 0) + out << " - " << msr_file; + out << "... "; + } + out.flush(); +} void ExportStationsandMeasurements(dna_import* parserDynaML, const project_settings& p, std::ofstream* imp_file, vifm_t* vinput_file_meta, @@ -555,16 +629,14 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti // DynaML file format if (p.i.export_dynaml && (stnCount > 0 || msrCount > 0)) - { + { + if (!p.g.quiet) + ReportExportedData(p, cout, dynaml, stnCount, msrCount); + ReportExportedData(p, *imp_file, dynaml, stnCount, msrCount); + if (p.i.export_single_xml_file) { // Single output file - if (!p.g.quiet) - { - cout << "+ Exporting stations and measurements to " << leafStr(p.i.xml_outfile) << "... "; - cout.flush(); - } - *imp_file << "+ Exporting stations and measurements to " << leafStr(p.i.xml_outfile) << "... "; parserDynaML->SerialiseDynaMLfromMemory( vstationsTotal, vmeasurementsTotal, p.i.xml_outfile, p, vinput_file_meta, (p.i.flag_unused_stn ? true : false)); @@ -572,16 +644,6 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti else { // Separate output files (default) - if (!p.g.quiet) - { - cout << "+ Exporting stations and measurements to:" << endl << - " - " << leafStr(p.i.xml_stnfile) << endl << - " - " << leafStr(p.i.xml_msrfile) << "... "; - cout.flush(); - } - *imp_file << "+ Exporting stations and measurements to:" << endl << - " - " << leafStr(p.i.xml_stnfile) << endl << - " - " << leafStr(p.i.xml_msrfile) << "... "; parserDynaML->SerialiseDynaMLSepfromMemory( vstationsTotal, vmeasurementsTotal, p.i.xml_stnfile, p.i.xml_msrfile, p, vinput_file_meta, (p.i.flag_unused_stn ? true : false)); @@ -599,22 +661,16 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti { // Separate output files (default) if (!p.g.quiet) - { - cout << "+ Exporting stations and measurements to:" << endl << - " - " << leafStr(p.i.dna_stnfile) << endl << - " - " << leafStr(p.i.dna_msrfile) << "... "; - cout.flush(); - } - *imp_file << "+ Exporting stations and measurements to:" << endl << - " - " << leafStr(p.i.dna_stnfile) << endl << - " - " << leafStr(p.i.dna_msrfile) << "... "; + ReportExportedData(p, cout, dna, stnCount, msrCount); + ReportExportedData(p, *imp_file, dna, stnCount, msrCount); + parserDynaML->SerialiseDNA( vstationsTotal, vmeasurementsTotal, p.i.dna_stnfile, p.i.dna_msrfile, p, vinput_file_meta, (p.i.flag_unused_stn ? true : false)); + if (!p.g.quiet) cout << "Done." << endl; *imp_file << "Done." << endl; - } if (displayEpsgWarning) @@ -811,7 +867,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* strlen_arg += (6 + PROGRESS_PERCENT_04); size_t i, nfiles(p.i.input_files.size()); // for each file... - string epsgCode, input_file, ss, status_msg; + string input_file, ss, status_msg; ostringstream ss_time, ss_msg; input_file_meta_t input_file_meta; milliseconds elapsed_time(milliseconds(0)); @@ -823,11 +879,11 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* bool firstFile; + // obtain the project reference frame epsg code + string projctEpsgCode(epsgStringFromName(p.i.reference_frame)); + for (i=0; i(p.i.reference_frame); - stnCount = msrCount = 0; input_file = p.i.input_files.at(i); if (!exists(input_file)) @@ -925,35 +981,40 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* } *imp_file << time_message << endl; - // Produce a info or warning if the input file's default reference frame - // is different to the project reference frame - string inputFileEpsg, inputFileDatum, inputFileEpoch; + // Capture the input file's default reference frame and set the + // project reference frame (if not specified on the command-line) + string inputFileEpsg(""), inputFileDatum(""), inputFileEpoch(""); try { inputFileDatum = datumFromEpsgString(input_file_meta.epsgCode); inputFileEpsg = input_file_meta.epsgCode; inputFileEpoch = input_file_meta.epoch; } - catch (...) { - inputFileDatum = epsgCode; - inputFileEpsg = epsgCode; + catch (...) + { + // Do nothing, revert to defaults + // p.i.reference_frame + // p.i.epoch } // Is this the first file? If so, attempt to set the default datum from // the input file (if applicable). - UINT32 epsgCodei; + UINT32 inputFileEpsgi; bool referenceframeChanged(false); + if (firstFile) - { + { + // Determine if the project reference frame needs to be changed + // If the user has not provided a reference frame, then inspect the file reference frame - // If the file does not contain a reference frame (eg SNX), fileEpsg will be empty. Thus, - // no change will occur. + // If the file does not contain a reference frame (e.g. SNX) or the user has left it blank, + // fileEpsg will be empty. Thus, no change will occur (retain the default GDA2020). if (!inputFileEpsg.empty() && !p.i.user_supplied_frame) { // Set the project defaults referenceframeChanged = true; - epsgCodei = LongFromString(inputFileEpsg); - p.i.reference_frame = datumFromEpsgCode(epsgCodei); - p.r.reference_frame = p.i.reference_frame; + inputFileEpsgi = LongFromString(inputFileEpsg); + p.i.reference_frame = inputFileDatum; + p.r.reference_frame = inputFileDatum; try { // Initialise the 'default' datum (frame and epoch) for the project, from the first file. @@ -968,31 +1029,42 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* } if (inputFileEpoch.empty()) - p.r.epoch = referenceepochFromEpsgCode(epsgCodei); + { + // Has an epoch been provided but no frame? + if (inputFileEpsg.empty()) + // revert to epoch of + p.i.epoch = referenceepochFromEpsgCode(inputFileEpsgi); + else + p.i.epoch = referenceepochFromEpsgString(projctEpsgCode); + p.r.epoch = p.i.epoch; + } else - p.r.epoch = inputFileEpoch; + { + p.i.epoch = inputFileEpoch; + p.r.epoch = p.i.epoch; + } } if (!parserDynaML.filespecifiedReferenceFrame()) { stringstream ssEpsgWarning; - ssEpsgWarning << "- Warning: Input file reference frame empty. Assuming the default reference frame (" << inputFileDatum << ")."; + ssEpsgWarning << " - Warning: Input file reference frame empty. Assuming the default reference frame (" << inputFileDatum << ")."; if (!p.g.quiet) cout << ssEpsgWarning.str() << endl; *imp_file << ssEpsgWarning.str() << endl; } - else if (!iequals(epsgCode, input_file_meta.epsgCode)) + else if (!iequals(projctEpsgCode, input_file_meta.epsgCode)) { stringstream ssEpsgWarning; if (referenceframeChanged) { - ssEpsgWarning << "- Warning: The project reference frame has been set to the default" << endl << - " file datum of " << leafStr(p.i.input_files.at(i)) << " (" << inputFileDatum << ")."; + ssEpsgWarning << " - Warning: The project reference frame has been set to the default" << endl << + " file datum of " << leafStr(p.i.input_files.at(i)) << " (" << inputFileDatum << ")."; } else { - ssEpsgWarning << "- Warning: Input file reference frame (" << inputFileDatum << - ") does not match the " << endl << " project reference frame (" << p.i.reference_frame << ")."; + ssEpsgWarning << " - Warning: Input file reference frame (" << inputFileDatum << ") does not match the " << endl << + " project reference frame (" << p.i.reference_frame << ")."; } if (!p.g.quiet) @@ -1081,8 +1153,11 @@ int main(int argc, char* argv[]) ref_frame_options.add_options() (REFERENCE_FRAME_R, value(&p.i.reference_frame), - (string("Default reference frame for all stations and measurements, and for preliminary reductions on the ellipsoid when input files do not specify a reference frame. Default is ") + + (string("Project reference frame for all stations, measurements, and preliminary reductions on the ellipsoid when input files do not specify a reference frame. Default is ") + p.i.reference_frame + ".").c_str()) + (EPOCH_E, value(&p.i.epoch), + (string("Project epoch for all stations and measurements when input files do not specify an epoch. Default is ") + + p.i.epoch + ".").c_str()) (OVERRIDE_INPUT_FRAME, "Override the reference frame specified for each measurement in input files.") ; @@ -1321,7 +1396,7 @@ int main(int argc, char* argv[]) if (vm.count(QUIET)) p.g.quiet = 1; - + if (!p.g.quiet) { cout << endl << cmd_line_banner; @@ -1335,8 +1410,8 @@ int main(int argc, char* argv[]) cout << setw(PRINT_VAR_PAD) << left << " Binary station output file: " << p.i.bst_file << endl; cout << setw(PRINT_VAR_PAD) << left << " Binary measurement output file: " << p.i.bms_file << endl; - // If a reference frame has been supplied, report it. - // If not, the assumption is, the project frame will be assumed from the first file and + // If a reference frame and epoch have been supplied, report them. + // If not, the assumption is, the project frame and epoch will be assumed from the first file and // in this case, it will be reported later if (p.i.user_supplied_frame) cout << setw(PRINT_VAR_PAD) << left << " Project reference frame:" << p.i.reference_frame << " (user supplied)" << endl; @@ -1346,6 +1421,10 @@ int main(int argc, char* argv[]) if (p.i.override_input_rfame) cout << setw(PRINT_VAR_PAD) << left << " Override input file ref frame:" << yesno_string(p.i.override_input_rfame) << endl; + if (p.i.user_supplied_epoch) + cout << setw(PRINT_VAR_PAD) << left << " Project epoch:" << p.i.epoch << " (user supplied)" << endl; + else + cout << setw(PRINT_VAR_PAD) << left << " Project epoch:" << "To be assumed from the first input file" << endl; if (p.i.export_dynaml) { diff --git a/dynadjust/include/config/dnaoptions.hpp b/dynadjust/include/config/dnaoptions.hpp index e9f83ffa..41046081 100644 --- a/dynadjust/include/config/dnaoptions.hpp +++ b/dynadjust/include/config/dnaoptions.hpp @@ -183,7 +183,7 @@ struct general_settings : private boost::equality_comparable { struct import_settings : private boost::equality_comparable { public: import_settings() - : reference_frame(DEFAULT_DATUM), user_supplied_frame(0), override_input_rfame(0) + : reference_frame(DEFAULT_DATUM), epoch(DEFAULT_EPOCH), user_supplied_frame(0), user_supplied_epoch(0), override_input_rfame(0) , test_integrity(0), verify_coordinates(0), export_dynaml(0), export_from_bfiles(0) , export_single_xml_file(0), prefer_single_x_as_g(0), export_asl_file(0), export_aml_file(0), export_map_file(0) , export_dna_files(0), export_discont_file(0), import_geo_file(0), simulate_measurements(0), split_clusters(0), include_transcending_msrs(0) @@ -229,8 +229,10 @@ struct import_settings : private boost::equality_comparable { //} public: - string reference_frame; // Default reference frame - used primarily for reductions on the ellipsoid. + string reference_frame; // Project reference frame - used primarily for reductions on the ellipsoid. + string epoch; // Project epoch UINT16 user_supplied_frame; // User has supplied a frame - use this to change the default frame + UINT16 user_supplied_epoch; // User has supplied a epoch - use this to change the default epoch UINT16 override_input_rfame; // Override reference frame specified in input files using the default or user supplied frame. UINT16 test_integrity; // Test integrity of network UINT16 verify_coordinates; // Test integrity of coordinates From 77e057d7bd3573048b85b0d646bd464c44173f73 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Thu, 23 Jan 2025 16:41:55 +1100 Subject: [PATCH 043/102] Update comments and XML datum parsing --- .../dynadjust/dnaimport/dnaparser_pimpl.cxx | 98 +++++++------------ .../dynadjust/dnaimport/dnaparser_pskel.cxx | 2 +- 2 files changed, 35 insertions(+), 65 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index 1b4b77ee..b45918dc 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -1347,42 +1347,32 @@ void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, b { // 1. Get the DnaXmlFormat referenceframe attribute value from the file _referenceframe = trimstr(post_string()); + + // But, is this attribute value an empty string? As long as a default value + // is specified in DynaML.xsd, this value will never be empty, unless the user + // has inadvertently set in the xml file, e.g.: + // + // Check anyway ... if (_referenceframe.empty()) - // Set to the default reference frame passed from import + // If the file doesn't contain reference frame, set + // to the default reference frame passed from import _referenceframe = referenceframe; + + // Capture epsg code for the file fileEpsg = epsgStringFromName(_referenceframe); if (firstFile) { - // 2. Does the user want to override the datum contained in the files with - // the default? - if (overridereferenceframe) - { - // Has a reference frame been supplied? - if (userspecifiedreferenceframe) - // If so, do nothing, just return as referenceframe will become - // the default for all stations and measurements loaded - // from the file. - return; - - if (!_referenceframe.empty()) - referenceframe = _referenceframe; - } - - // 3. Does the user want the referenceframe attribute in the file to become the default? + // If the user didn't specify a frame, take it from the file if (!userspecifiedreferenceframe) - { - // Here, the assumption is, if the user did not specify a reference frame, - // then the user wants to adopt the DnaXmlFormat referenceframe attribute - - // But, is this attribute value an empty string? As long as a default value - // is specified in DynaML.xsd, this value will never be empty, unless the user - // has inadvertently set in the xml file, e.g.: - // - if (!_referenceframe.empty()) - // Set the DynaML parser reference frame to the file's DnaXmlFormat referenceframe attribute - referenceframe = _referenceframe; - } + referenceframe = _referenceframe; + } + else + { + // If the user doesn't want to override the datum for all stations and measurements, + // take it from the file + if (!overridereferenceframe) + referenceframe = _referenceframe; } } @@ -1402,51 +1392,31 @@ void epoch_pimpl::post_type(string& epoch, string& fileEpoch, bool userspecified { // 1. Get the DnaXmlFormat epoch attribute value from the file _epoch = trimstr(post_string()); + + // But, is this attribute value an empty string? As long as a default value + // is specified in DynaML.xsd, this value will never be empty, unless the user + // has inadvertently set in the xml file, e.g.: + // + // Check anyway ... if (_epoch.empty()) - // Set to the default reference frame passed from import + // Set to the default epoch passed from import _epoch = epoch; + + // Capture epoch for the file fileEpoch = _epoch; + // Set the epoch, provided the user does not want to + // override all epoch information if (firstFile) { - // 2. Does the user want to override the default datum? - if (overridereferenceframe) - { - // Has a reference frame been supplied? - if (userspecifiedreferenceframe) - // Do nothing, just return as epoch will become - // the default for all stations and measurements loaded - // from the file. - return; - - if (!_epoch.empty()) - // Set the DynaML parser epoch to the file's DnaXmlFormat epoch attribute - epoch = _epoch; - } - - // 3. Does the user want the epoch attribute in the file to become the default? + // If the user didn't specify a frame, take it from the file if (!userspecifiedreferenceframe) - { - // Here, the assumption is, if the user did not specify a reference frame, - // then the user wants to adopt the DnaXmlFormat epoch attribute - - // But, is this attribute value an empty string? As long as a default value - // is specified in DynaML.xsd, this value will never be empty, unless the user - // has inadvertently set in the xml file, e.g.: - // - if (!_epoch.empty()) - // Set the DynaML parser epoch to the file's DnaXmlFormat epoch attribute - epoch = _epoch; - } + epoch = _epoch; } else { - // Since import doesn't offer an option to capture epoch on the command line, - // take the epoch from the DnaXmlFormat referenceframe attribute - if (_epoch.empty()) - // Set to the default reference frame passed from import - _epoch = epoch; - fileEpoch = trimstr(post_string()); + if (!overridereferenceframe) + epoch = _epoch; } } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx index a3c16ba2..cf7aa9e3 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx @@ -2045,7 +2045,7 @@ bool DnaXmlFormat_pskel::_start_element_impl (const ::xml_schema::ro_string& ns, { this->DnaStation_parser_->InitparentStnVector(_pStns); - // Set default reference frame and epoch for this measurement + // Set the default reference frame and epoch for this station this->DnaStation_parser_->SetDefaultReferenceFrame(_referenceframe); this->DnaStation_parser_->SetDefaultEpoch(_epoch); From c6da4da0c2ff9ec7a503da02a2937916e6c2f1f6 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 24 Jan 2025 13:22:19 +1100 Subject: [PATCH 044/102] Park undefined method --- dynadjust/dynadjust/dnaadjust/dnaadjust.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp b/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp index 50000bbf..6b0210a6 100644 --- a/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp +++ b/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp @@ -440,7 +440,7 @@ class dna_adjust { void SetDefaultReferenceFrame(); void LoadNetworkFiles(); void CreateMsrToStnTally(); - void CreateStationAppearanceList(const vUINT32& parameterStations); + //void CreateStationAppearanceList(const vUINT32& parameterStations); // Simultaneous adjustment void AdjustSimultaneous(); From 025d73dd6c8f43ba3e5007c8e8b66fac94716df3 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 24 Jan 2025 13:43:02 +1100 Subject: [PATCH 045/102] Park undefined methods --- dynadjust/dynadjust/dnasegment/dnasegment.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dynadjust/dynadjust/dnasegment/dnasegment.hpp b/dynadjust/dynadjust/dnasegment/dnasegment.hpp index 35e2707c..9c60d2db 100644 --- a/dynadjust/dynadjust/dnasegment/dnasegment.hpp +++ b/dynadjust/dynadjust/dnasegment/dnasegment.hpp @@ -150,12 +150,12 @@ class dna_segment { void IdentifyLowestStationAssociation(pvUINT32 vStnList, vUINT32& totalStations,const int currentLevel, const int maxLevel, pvUINT32 vStnCount); void IdentifyInnerMsrsandAssociatedStns(const UINT32& innerStation, vUINT32& totalStations); void AddtoJunctionStnList(const vUINT32& msrStations); - void AddtoJunctionStnList_sortedbyMsrCount(measurement_t* msr, const UINT32& innerStation); - void AddtoJunctionStnList_sortedbyName(measurement_t* msr, const UINT32& innerStation); + //void AddtoJunctionStnList_sortedbyMsrCount(measurement_t* msr, const UINT32& innerStation); + //void AddtoJunctionStnList_sortedbyName(measurement_t* msr, const UINT32& innerStation); bool AddtoCurrentMsrList(const UINT32& amlindex, const vUINT32& msrStations); UINT32 GetAvailableMsrCount(const UINT32& stn_index); void FindCommonMeasurements(); - void MoveJuncttoInnerStnList(); + //void MoveJuncttoInnerStnList(); void MoveJunctiontoISL(); void SetAvailableMsrCount(); void RemoveDuplicateStations(pvstring vStations); @@ -163,8 +163,8 @@ class dna_segment { //void RemoveNonMeasurements(); //void RemoveIgnoredMeasurements(); void BuildFreeStationAvailabilityList(); - void BuildFreeStationAvailabilityList(vASL& assocStnList, v_freestn_pair& freeStnList); - void BuildStationAppearanceList(); + //void BuildFreeStationAvailabilityList(vASL& assocStnList, v_freestn_pair& freeStnList); + //void BuildStationAppearanceList(); void CalculateAverageBlockSize(); From 1e5f79b68884778248368aeff069efd79bf9e779 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 24 Jan 2025 13:52:10 +1100 Subject: [PATCH 046/102] Remove unnecessary include --- dynadjust/dynadjust/dnasegment/dnasegment.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/dynadjust/dynadjust/dnasegment/dnasegment.cpp b/dynadjust/dynadjust/dnasegment/dnasegment.cpp index 72330555..ac243b72 100644 --- a/dynadjust/dynadjust/dnasegment/dnasegment.cpp +++ b/dynadjust/dynadjust/dnasegment/dnasegment.cpp @@ -21,11 +21,9 @@ //============================================================================ #include -#ifdef _MSDEBUG -#include -#endif -namespace dynadjust { namespace networksegment { +namespace dynadjust { +namespace networksegment { dna_segment::dna_segment() : isProcessing_(false) From 740bbdde3878ccb2f22eb3cec2d2da402bada6c7 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 24 Jan 2025 14:08:08 +1100 Subject: [PATCH 047/102] Make vcxproj files consistent. Fix std byte C++17 --- dynadjust/dynadjust/dnasegment/dnasegment.vcxproj | 9 ++++++--- .../dnasegment/dnasegment.vcxproj.filters | 14 +++++++------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/dynadjust/dynadjust/dnasegment/dnasegment.vcxproj b/dynadjust/dynadjust/dnasegment/dnasegment.vcxproj index df3f7e84..675993bd 100644 --- a/dynadjust/dynadjust/dnasegment/dnasegment.vcxproj +++ b/dynadjust/dynadjust/dnasegment/dnasegment.vcxproj @@ -42,7 +42,7 @@ Parallel v143 Parallel - false + true DynamicLibrary @@ -63,7 +63,7 @@ Parallel v143 Parallel - false + true @@ -112,6 +112,7 @@ $(BoostLibDir);$(LibraryPath) $(SolutionDir)bin\$(Configuration)\$(Platform)\ $(SolutionDir)build\$(ProjectName)\$(Configuration)\$(Platform)\ + $(SolutionDir);$(VC_SourcePath); @@ -137,12 +138,13 @@ Use Level3 Disabled - WIN64;_DEBUG;_WINDOWS;_USRDLL;BUILD_DNASEGMENT_DLL;BUILD_EXPORTDNATYPES;%(PreprocessorDefinitions) + _HAS_STD_BYTE=0;WIN64;_DEBUG;_WINDOWS;_USRDLL;BUILD_DNASEGMENT_DLL;BUILD_EXPORTDNATYPES;%(PreprocessorDefinitions) 4996;4251;4290; true /Zm280 /permissive- precompile.h precompile.h + false stdcpp17 @@ -164,6 +166,7 @@ /Zm245 precompile.h precompile.h + Speed stdcpp17 diff --git a/dynadjust/dynadjust/dnasegment/dnasegment.vcxproj.filters b/dynadjust/dynadjust/dnasegment/dnasegment.vcxproj.filters index 5c0569dd..3c99a9d8 100644 --- a/dynadjust/dynadjust/dnasegment/dnasegment.vcxproj.filters +++ b/dynadjust/dynadjust/dnasegment/dnasegment.vcxproj.filters @@ -21,19 +21,19 @@ Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files @@ -45,7 +45,7 @@ Header Files - + Header Files @@ -101,4 +101,4 @@ Resource Files - \ No newline at end of file + From 3beeb203604a5358a24835a876bd93bc842028be Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 24 Jan 2025 14:16:58 +1100 Subject: [PATCH 048/102] Further changes to improve frame and epoch handling --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 138 +++++++++++-------- dynadjust/dynadjust/dnaimport/dnainterop.hpp | 5 +- dynadjust/include/io/dnaiodna.cpp | 40 +----- dynadjust/include/io/dnaiodna.hpp | 2 +- 4 files changed, 90 insertions(+), 95 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index 0c3a8799..f328af5d 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -499,8 +499,7 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 if (fileEpoch.empty()) { // Get the epoch of the nominated epsg (whether default or from the file) - UINT32 u = LongFromString(fileEpsg); - fileEpoch = referenceepochFromEpsgCode(u); + fileEpoch = referenceepochFromEpsgString(fileEpsg); } // Is this the first file? If so, set the project datum from the file's datum @@ -1060,10 +1059,10 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 // Read the dna file header, and set the // reference frame based on the header and user preferences dnaFile.read_dna_header(ifsInputFILE_, version, idt, - datum_, // default datum + datum_, // project datum firstFile, // is this the first file to be loaded? projectSettings_.i.user_supplied_frame==1, // Has a reference frame been supplied? - projectSettings_.i.override_input_rfame==1, // does the user want to override the datum in the input files? + projectSettings_.i.user_supplied_epoch==1, // Has an epoch been supplied? fileEpsg, fileEpoch, geoversion, count); // release file pointer mutex import_file_mutex.unlock(); @@ -1073,12 +1072,15 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 throw XMLInteropException(e.what(), 0); } - if (projectSettings_.i.override_input_rfame && !projectSettings_.i.user_supplied_frame) + // On reading the first file, set the project reference frame provided + // that the user has not supplied a frame on the command line + if (!projectSettings_.i.user_supplied_frame) { if (firstFile) { projectSettings_.i.reference_frame = datumFromEpsgString(fileEpsg); projectSettings_.r.reference_frame = projectSettings_.i.reference_frame; + projectSettings_.i.epoch = fileEpoch; projectSettings_.r.epoch = fileEpoch; m_strProjectDefaultEpoch = fileEpoch; m_strProjectDefaultEpsg = fileEpsg; @@ -1096,7 +1098,12 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 dsw_ = dnaFile.dna_stn_widths(); try { - ParseDNASTN(vStations, stnCount); + // Does the user want to override the datum provided in the file with the project + // datum? + if (projectSettings_.i.override_input_rfame) + ParseDNASTN(vStations, stnCount, datum_.GetEpsgCode_s(), datum_.GetEpoch_s()); + else + ParseDNASTN(vStations, stnCount, fileEpsg, fileEpoch); m_idt = stn_data; } catch (const ios_base::failure& f) { @@ -1179,7 +1186,7 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 } } -void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount) +void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const string& epsg, const string& epoch) { string sBuf, tmp; @@ -1233,7 +1240,7 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount) continue; // initialise new station - stn_ptr.reset(new CDnaStation(datum_.GetName(), datum_.GetEpoch_s())); + stn_ptr.reset(new CDnaStation(datumFromEpsgString(epsg), epoch)); stn_ptr->SetfileOrder(g_fileOrder++); @@ -1528,7 +1535,6 @@ void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT3 break; case 'G': // GPS Baseline (treat as single-baseline cluster) case 'X': // GPS Baseline cluster - //msr_ptr.reset(new CDnaGpsBaselineCluster(++(*clusterID), datum_.GetName(), datum_.GetEpoch_s())); // Default to the fileEpsg and fileEpoch (see read_dna_header(..) in ParseDNA) msr_ptr.reset(new CDnaGpsBaselineCluster(++(*clusterID), datumFromEpsgString(fileEpsg), fileEpoch)); ParseDNAMSRGPSBaselines(sBuf, msr_ptr, ignoreMsr); @@ -1601,7 +1607,6 @@ void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT3 (*msrCount) += 1; break; case 'Y': // GPS point cluster - //msr_ptr.reset(new CDnaGpsPointCluster(++(*clusterID), datum_.GetName(), datum_.GetEpoch_s())); // Default to the fileEpsg and fileEpoch (see read_dna_header(..) in ParseDNA) msr_ptr.reset(new CDnaGpsPointCluster(++(*clusterID), datumFromEpsgString(fileEpsg), fileEpoch)); ParseDNAMSRGPSPoints(sBuf, msr_ptr, ignoreMsr); @@ -4138,21 +4143,53 @@ void dna_import::SignalExceptionInterop(string msg, int i, const char *streamTyp throw XMLInteropException(msg, i); } - -void dna_import::SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, - const string& stnfilename, const string& msrfilename, +void dna_import::SerialiseMSR(vdnaMsrPtr* vMeasurements, const string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused) { - try - { - // Reset the default datum. - datum_.SetDatumFromEpsg(m_strProjectDefaultEpsg, m_strProjectDefaultEpoch); + // Measurements + std::ofstream dna_msr_file; + try { + // Create DynAdjust MSR file. + file_opener(dna_msr_file, msrfilename); } catch (const runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } + _it_vdnamsrptr _it_msr(vMeasurements->begin()); + + try { + // Write version line + dna_header(dna_msr_file, "3.01", "MSR", datum_.GetName(), datum_.GetEpoch_s(), vMeasurements->size()); + + // Capture source files + string source_files(formatStnMsrFileSourceString(vinput_file_meta, msr_data)); + + // Write header comment lines about this file + dna_comment(dna_msr_file, "File type: Measurement file"); + dna_comment(dna_msr_file, "Project name: " + p.g.network_name); + dna_comment(dna_msr_file, "Source files: " + source_files); + + // print measurements + for (_it_msr = vMeasurements->begin(); _it_msr != vMeasurements->end(); _it_msr++) + _it_msr->get()->WriteDNAMsr(&dna_msr_file, dmw_, dml_); + + dna_msr_file.close(); + + } + catch (const std::ifstream::failure& f) { + SignalExceptionInterop(static_cast(f.what()), 0, "o", &dna_msr_file); + } + catch (const XMLInteropException& e) { + SignalExceptionInterop(static_cast(e.what()), 0, "o", &dna_msr_file); + } +} + + +void dna_import::SerialiseSTN(vdnaStnPtr* vStations, const string& stnfilename, + const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused) +{ // Stations std::ofstream dna_stn_file; try { @@ -4174,13 +4211,13 @@ void dna_import::SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, // Has the user specified --flag-unused-stations, in which case, do not // print stations marked unused? UINT32 count(0); - if (flagUnused) + if (flagUnused) { for_each(vStations->begin(), vStations->end(), [&count](const dnaStnPtr& stn) { if (stn.get()->IsNotUnused()) count++; - }); + }); } else count = static_cast(vStations->size()); @@ -4199,21 +4236,21 @@ void dna_import::SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, // print stations // Has the user specified --flag-unused-stations, in wich case, do not // print stations marked unused? - if (flagUnused) + if (flagUnused) { - for (_it_stn=vStations->begin(); _it_stn!=vStations->end(); _it_stn++) + for (_it_stn = vStations->begin(); _it_stn != vStations->end(); _it_stn++) if (_it_stn->get()->IsNotUnused()) _it_stn->get()->WriteDNAXMLStnInitialEstimates(&dna_stn_file, - datum_.GetEllipsoidRef(), &projection, - dna, &dsw_); + datum_.GetEllipsoidRef(), &projection, + dna, &dsw_); } else { // print all stations regardless of whether they are unused or not - for (_it_stn=vStations->begin(); _it_stn!=vStations->end(); _it_stn++) + for (_it_stn = vStations->begin(); _it_stn != vStations->end(); _it_stn++) _it_stn->get()->WriteDNAXMLStnInitialEstimates(&dna_stn_file, - datum_.GetEllipsoidRef(), &projection, - dna, &dsw_); + datum_.GetEllipsoidRef(), &projection, + dna, &dsw_); } dna_stn_file.close(); @@ -4222,48 +4259,31 @@ void dna_import::SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, catch (const std::ifstream::failure& f) { SignalExceptionInterop(static_cast(f.what()), 0, "o", &dna_stn_file); } - catch (const XMLInteropException& e) { + catch (const XMLInteropException& e) { SignalExceptionInterop(static_cast(e.what()), 0, "o", &dna_stn_file); } +} - // Measurements - std::ofstream dna_msr_file; - try { - // Create DynAdjust MSR file. - file_opener(dna_msr_file, msrfilename); +void dna_import::SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, + const string& stnfilename, const string& msrfilename, + const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused) +{ + try + { + // Reset the default datum. + datum_.SetDatumFromEpsg(m_strProjectDefaultEpsg, m_strProjectDefaultEpoch); } catch (const runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } - _it_vdnamsrptr _it_msr(vMeasurements->begin()); - - try { - // Write version line - dna_header(dna_msr_file, "3.01", "MSR", datum_.GetName(), datum_.GetEpoch_s(), vMeasurements->size()); - - // Capture source files - string source_files(formatStnMsrFileSourceString(vinput_file_meta, msr_data)); - - // Write header comment lines about this file - dna_comment(dna_msr_file, "File type: Measurement file"); - dna_comment(dna_msr_file, "Project name: " + p.g.network_name); - dna_comment(dna_msr_file, "Source files: " + source_files); - - // print measurements - for (_it_msr=vMeasurements->begin(); _it_msr!=vMeasurements->end(); _it_msr++) - _it_msr->get()->WriteDNAMsr(&dna_msr_file, dmw_, dml_); - - dna_msr_file.close(); - - } - catch (const std::ifstream::failure& f) { - SignalExceptionInterop(static_cast(f.what()), 0, "o", &dna_msr_file); - } - catch (const XMLInteropException& e) { - SignalExceptionInterop(static_cast(e.what()), 0, "o", &dna_msr_file); - } + // Write stations (if present) + if (!vStations->empty()) + SerialiseSTN(vStations, stnfilename, p, vinput_file_meta, flagUnused); + // Write measurements (if present) + if (!vMeasurements->empty()) + SerialiseMSR(vMeasurements, msrfilename, p, vinput_file_meta, flagUnused); } diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.hpp b/dynadjust/dynadjust/dnaimport/dnainterop.hpp index 6ca581b3..cc68a34f 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.hpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.hpp @@ -158,6 +158,8 @@ class dna_import { // file handling void SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const string& stnfilename, const string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); + void SerialiseMSR(vdnaMsrPtr* vMeasurements, const string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused = false); + void SerialiseSTN(vdnaStnPtr* vStations, const string& stnfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused = false); //void SerialiseDynaMLfromBinary(const string& outfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); void SerialiseDynaMLfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const string& outfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); //void SerialiseDynaMLSepfromBinary(const string& stnfilename, const string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); @@ -212,7 +214,8 @@ class dna_import { void ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, string& fileEpsg, string& fileEpoch, bool firstFile); - void ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount); + void ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, + const string& fileEpsg, const string& fileEpoch); void ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT32 clusterID, const string& fileEpsg, const string& fileEpoch); diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index d3d6fb6b..e79d23a1 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -249,7 +249,7 @@ void dna_io_dna::read_ren_data(std::ifstream* ptr, pv_string_vstring_pair stnRen void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA_TYPE& idt, - CDnaDatum& referenceframe, bool firstFile, bool user_supplied_frame, bool override_input_frame, + CDnaDatum& referenceframe, bool firstFile, bool user_supplied_frame, bool user_supplied_epoch, string& fileEpsg, string& fileEpoch, string& geoidversion, UINT32& count) { string sBuf; @@ -370,50 +370,22 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA case stn_data: case msr_data: - // 1. Capture file epsg + // Capture file epsg if (file_referenceframe.empty()) - // Empty? Get the epsg code from the default datum + // Empty? Get the epsg code from the project datum fileEpsg = referenceframe.GetEpsgCode_s(); else fileEpsg = epsgStringFromName(file_referenceframe); // capture file epoch if (epoch_version.empty()) - { - // Empty? Get the epoch of the nominated epsg (whether default or from the file) - UINT32 u = LongFromString(fileEpsg); - fileEpoch = referenceepochFromEpsgCode(u); - } + // Empty? Get the epoch of the nominated epsg, set from either + // project or from the file + fileEpoch = referenceepochFromEpsgString(fileEpsg); else fileEpoch = epoch_version; - // Is this the first file? If so, set the project datum from the file's datum - if (firstFile) - { - // 2. Does the user want to override the datum contained in the files with - // the default? - if (override_input_frame) - // If so, do nothing, just return as referenceframe will become - // the default for all stations and measurements loaded - // from the file. - if (user_supplied_frame) - break; - - // 3. Does the user want the referenceframe attribute in the file to become the default? - if (!user_supplied_frame) - { - if (!file_referenceframe.empty()) - // adopt the reference frame supplied in the file - referenceframe.SetDatumFromEpsg(fileEpsg, fileEpoch); - } - else - // Since import doesn't offer an option to capture epoch on the command line, - // take the epoch from the file (if not empty). - referenceframe.SetEpoch(fileEpoch); - } - break; - case geo_data: geoidversion = epoch_version; break; diff --git a/dynadjust/include/io/dnaiodna.hpp b/dynadjust/include/io/dnaiodna.hpp index 44e5f52f..45ce4fdb 100644 --- a/dynadjust/include/io/dnaiodna.hpp +++ b/dynadjust/include/io/dnaiodna.hpp @@ -91,7 +91,7 @@ class dna_io_dna : public dna_io_base const CDnaDatum& datum, const string& comment); void read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA_TYPE& idt, - CDnaDatum& referenceframe, bool firstFile, bool user_supplied_frame, bool override_input_frame, + CDnaDatum& referenceframe, bool firstFile, bool user_supplied_frame, bool user_supplied_epoch, string& fileEpsg, string& fileEpoch, string& geoidversion, UINT32& count); inline const dna_stn_fields dna_stn_positions() { return dsl_; } From c6ff4cf45e15df1fedb2ec9c049b8d80d770341f Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 24 Jan 2025 17:08:12 +1100 Subject: [PATCH 049/102] Handle file epoch with cmd line supplied frame --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 29 ++++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index f328af5d..a149840d 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -1072,18 +1072,41 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 throw XMLInteropException(e.what(), 0); } - // On reading the first file, set the project reference frame provided - // that the user has not supplied a frame on the command line + // Has the user supplied a reference frame on the command line (--reference-frame)? if (!projectSettings_.i.user_supplied_frame) { + // No frame supplied. Set the datum from the first file. + // If the datum field is blank in the first file, the default will be used. See + // dnaFile.read_dna_header(..) for details. if (firstFile) { projectSettings_.i.reference_frame = datumFromEpsgString(fileEpsg); projectSettings_.r.reference_frame = projectSettings_.i.reference_frame; + m_strProjectDefaultEpsg = fileEpsg; + + // If the user has not provided a reference frame on the command line, then + // take the epoch from the first file. In this case, do not take the epoch + // from the command line (dnaimportwrapper will throw in this scenario anyway) projectSettings_.i.epoch = fileEpoch; projectSettings_.r.epoch = fileEpoch; m_strProjectDefaultEpoch = fileEpoch; - m_strProjectDefaultEpsg = fileEpsg; + } + } + else + { + // A frame has been supplied. Now check for epoch. + + // Has the user supplied an epoch on the command line (--epoch)? + if (!projectSettings_.i.user_supplied_epoch) + { + // No epoch supplied. Take the epoch from the first file. + if (firstFile) + { + projectSettings_.i.epoch = fileEpoch; + projectSettings_.r.epoch = fileEpoch; + m_strProjectDefaultEpoch = fileEpoch; + datum_.SetEpoch(fileEpoch); + } } } From 98fbddf7b3e9f600a1831ffe6e15f8286d305616 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 24 Jan 2025 17:26:13 +1100 Subject: [PATCH 050/102] Cater for blank file epoch --- dynadjust/include/io/dnaiodna.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index e79d23a1..86e5e2c3 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -379,9 +379,15 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA // capture file epoch if (epoch_version.empty()) + { // Empty? Get the epoch of the nominated epsg, set from either // project or from the file - fileEpoch = referenceepochFromEpsgString(fileEpsg); + if (user_supplied_frame) + fileEpoch = referenceframe.GetEpoch_s(); + else + // take from file + fileEpoch = referenceepochFromEpsgString(fileEpsg); + } else fileEpoch = epoch_version; From f8b042baa28367b2b62205e6d9f45e2791609ad8 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 24 Jan 2025 18:10:01 +1100 Subject: [PATCH 051/102] Set epoch from cmd line --- dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index cd4593b5..6e4f77e7 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -1500,7 +1500,7 @@ int main(int argc, char* argv[]) // See comments in InitialiseDatum() try { // Initialise the 'default' datum for the project. - parserDynaML.InitialiseDatum(p.i.reference_frame); + parserDynaML.InitialiseDatum(p.i.reference_frame, p.i.epoch); } catch (const XMLInteropException& e) { stringstream ss; From 491767f44c7aca753636434ac0397d6c1a138c96 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 24 Jan 2025 21:47:07 +1100 Subject: [PATCH 052/102] Set override datum for msr files --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 41 +++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index a149840d..ee0d6526 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -1073,7 +1073,24 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 } // Has the user supplied a reference frame on the command line (--reference-frame)? - if (!projectSettings_.i.user_supplied_frame) + if (projectSettings_.i.user_supplied_frame) + { + // A frame has been supplied. Now check for epoch. + + // Has the user supplied an epoch on the command line (--epoch)? + if (!projectSettings_.i.user_supplied_epoch) + { + // No epoch supplied. Take the epoch from the first file. + if (firstFile) + { + projectSettings_.i.epoch = fileEpoch; + projectSettings_.r.epoch = fileEpoch; + m_strProjectDefaultEpoch = fileEpoch; + datum_.SetEpoch(fileEpoch); + } + } + } + else { // No frame supplied. Set the datum from the first file. // If the datum field is blank in the first file, the default will be used. See @@ -1092,23 +1109,6 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 m_strProjectDefaultEpoch = fileEpoch; } } - else - { - // A frame has been supplied. Now check for epoch. - - // Has the user supplied an epoch on the command line (--epoch)? - if (!projectSettings_.i.user_supplied_epoch) - { - // No epoch supplied. Take the epoch from the first file. - if (firstFile) - { - projectSettings_.i.epoch = fileEpoch; - projectSettings_.r.epoch = fileEpoch; - m_strProjectDefaultEpoch = fileEpoch; - datum_.SetEpoch(fileEpoch); - } - } - } _filespecifiedreferenceframe = dnaFile.filespecifiedReferenceFrame(); @@ -1170,7 +1170,10 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 dmw_ = dnaFile.dna_msr_widths(); try { - ParseDNAMSR(vMeasurements, msrCount, clusterID, fileEpsg, fileEpoch); + if (projectSettings_.i.override_input_rfame) + ParseDNAMSR(vMeasurements, msrCount, clusterID, datum_.GetEpsgCode_s(), datum_.GetEpoch_s()); + else + ParseDNAMSR(vMeasurements, msrCount, clusterID, fileEpsg, fileEpoch); m_idt = msr_data; } catch (const ios_base::failure& f) { From 2b874b760e80543ef91cda08e035690beab99951 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 29 Jan 2025 16:22:26 +1100 Subject: [PATCH 053/102] Improve comments --- dynadjust/include/io/dnaiodna.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index 86e5e2c3..5f8b160e 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -385,7 +385,7 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA if (user_supplied_frame) fileEpoch = referenceframe.GetEpoch_s(); else - // take from file + // take from file's epsg's epoch fileEpoch = referenceepochFromEpsgString(fileEpsg); } else From a118590e658e5763b2ebb714d6f75b0f1952cf71 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 29 Jan 2025 16:24:09 +1100 Subject: [PATCH 054/102] Handle user supplied epoch in XML files --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 1 + .../dynadjust/dnaimport/dnaparser_pimpl.cxx | 49 ++++++++++++------- .../dynadjust/dnaimport/dnaparser_pimpl.hxx | 9 ++-- .../dynadjust/dnaimport/dnaparser_pskel.cxx | 12 +++-- .../dynadjust/dnaimport/dnaparser_pskel.hxx | 5 +- 5 files changed, 49 insertions(+), 27 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index ee0d6526..da9400f6 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -418,6 +418,7 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 datum_.GetEpoch_s(), // pass the default epoch firstFile, // is this the first file to be loaded? projectSettings_.i.user_supplied_frame==1, // Has a reference frame been supplied? + projectSettings_.i.user_supplied_epoch == 1, // Has an epoch been supplied? projectSettings_.i.override_input_rfame==1); // Should this reference frame override all others? ::DnaStation_pimpl DnaStation_p; diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index b45918dc..94027d0c 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -900,7 +900,9 @@ void DnaStation_pimpl::post_DnaStation() // DnaXmlFormat_pimpl::DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, const string& referenceframe, const string& epoch, - bool firstFile, bool userspecifiedreferenceframe, bool overridereferenceframe) + bool firstFile, + bool userspecifiedreferenceframe, bool userspecifiedepoch, + bool overridereferenceframe) { // capture pointer to file stream is_ = is; @@ -919,6 +921,7 @@ DnaXmlFormat_pimpl::DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, con _userspecifiedreferenceframe = userspecifiedreferenceframe; _filespecifiedreferenceframe = false; _overridereferenceframe = overridereferenceframe; + _userspecifiedepoch = userspecifiedepoch; } void DnaXmlFormat_pimpl::pre() @@ -1343,7 +1346,9 @@ void referenceframe_pimpl::pre() // For DynaML.xsd, the following is specified: // // In this case, post_string() will return "GDA2020" -void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, bool userspecifiedreferenceframe, bool overridereferenceframe, bool firstFile) +void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, + bool userspecifiedreferenceframe, bool userspecifiedepoch, + bool overridereferenceframe, bool firstFile) { // 1. Get the DnaXmlFormat referenceframe attribute value from the file _referenceframe = trimstr(post_string()); @@ -1361,17 +1366,11 @@ void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, b // Capture epsg code for the file fileEpsg = epsgStringFromName(_referenceframe); - if (firstFile) + if (!userspecifiedreferenceframe) { - // If the user didn't specify a frame, take it from the file - if (!userspecifiedreferenceframe) - referenceframe = _referenceframe; - } - else - { - // If the user doesn't want to override the datum for all stations and measurements, - // take it from the file - if (!overridereferenceframe) + // No frame supplied. Set the datum from the first file. + // If the datum field is blank in the first file, the default will be used. + if (firstFile) referenceframe = _referenceframe; } } @@ -1388,7 +1387,9 @@ void epoch_pimpl::pre() // For DynaML.xsd, the following is specified: // // In this case, post_string() will return "01.01.1994" -void epoch_pimpl::post_type(string& epoch, string& fileEpoch, bool userspecifiedreferenceframe, bool overridereferenceframe, bool firstFile) +void epoch_pimpl::post_type(string& epoch, string& fileEpoch, + bool userspecifiedreferenceframe, bool userspecifiedepoch, + bool overridereferenceframe, bool firstFile) { // 1. Get the DnaXmlFormat epoch attribute value from the file _epoch = trimstr(post_string()); @@ -1407,15 +1408,27 @@ void epoch_pimpl::post_type(string& epoch, string& fileEpoch, bool userspecified // Set the epoch, provided the user does not want to // override all epoch information - if (firstFile) + // Note, epoch is contingent upon how the frame has been + // supplied + if (userspecifiedreferenceframe) { - // If the user didn't specify a frame, take it from the file - if (!userspecifiedreferenceframe) - epoch = _epoch; + // A frame has been supplied. Now check for epoch. + + // Has the user supplied an epoch on the command line (--epoch)? + if (!userspecifiedepoch) + { + // No epoch supplied. Take the epoch from the first file. + if (firstFile) + // If the user didn't specify a frame, take it from the file + epoch = _epoch; + } + } else { - if (!overridereferenceframe) + // No frame supplied. Set the datum from the first file. + // If the datum field is blank in the first file, the default will be used. + if (firstFile) epoch = _epoch; } } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx index 46dec9a1..830d005a 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx @@ -118,7 +118,8 @@ public: DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, const string& referenceframe, const string& epoch, bool firstFile, - bool userspecifiedreferenceframe, bool overridereferenceframe); + bool userspecifiedreferenceframe, bool userspecifiedepoch, + bool overridereferenceframe); virtual void pre (); virtual void DnaStation (); virtual void DnaMeasurement (); @@ -238,7 +239,8 @@ class referenceframe_pimpl: public virtual referenceframe_pskel, { public: virtual void pre (); - virtual void post_type (string& referenceframe, string& fileEpsg, bool userspecifiedreferenceframe, bool override_referenceframe, bool firstFile); + virtual void post_type (string& referenceframe, string& fileEpsg, + bool userspecifiedreferenceframe, bool userspecifiedepoch, bool override_referenceframe, bool firstFile); inline const string str() { return _referenceframe; } protected: @@ -251,7 +253,8 @@ class epoch_pimpl: public virtual epoch_pskel, { public: virtual void pre (); - virtual void post_type (string& epoch, string& fileEpoch, bool userspecifiedreferenceframe, bool override_referenceframe, bool firstFile); + virtual void post_type (string& epoch, string& fileEpoch, + bool userspecifiedreferenceframe, bool userspecifiedepoch, bool override_referenceframe, bool firstFile); inline const string str() { return _epoch; } protected: diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx index cf7aa9e3..3088f505 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx @@ -2143,7 +2143,9 @@ bool DnaXmlFormat_pskel::_attribute_impl (const ::xml_schema::ro_string& ns, this->epoch_parser_->_pre_impl (); this->epoch_parser_->_characters (v); this->epoch_parser_->_post_impl (); - this->epoch_parser_->post_type (_epoch, _fileEpoch, _userspecifiedreferenceframe, _overridereferenceframe, _firstFile); + this->epoch_parser_->post_type (_epoch, _fileEpoch, + _userspecifiedreferenceframe, _userspecifiedepoch, + _overridereferenceframe, _firstFile); this->epoch(); } @@ -2163,7 +2165,9 @@ bool DnaXmlFormat_pskel::_attribute_impl (const ::xml_schema::ro_string& ns, this->referenceframe_parser_->_pre_impl (); this->referenceframe_parser_->_characters (v); this->referenceframe_parser_->_post_impl (); - this->referenceframe_parser_->post_type (_referenceframe, _fileEpsg, _userspecifiedreferenceframe, _overridereferenceframe, _firstFile); + this->referenceframe_parser_->post_type (_referenceframe, _fileEpsg, + _userspecifiedreferenceframe, _userspecifiedepoch, + _overridereferenceframe, _firstFile); this->referenceframe (); _filespecifiedreferenceframe = true; } @@ -3187,14 +3191,14 @@ void type_pskel::post_type () // referenceframe_pskel // string& referenceframe, bool user_specified, bool override_referenceframe -void referenceframe_pskel::post_type (string&, string&, bool, bool, bool) +void referenceframe_pskel::post_type (string&, string&, bool, bool, bool, bool) { } // epoch_pskel // string& epoch, bool override_referenceframe -void epoch_pskel::post_type (string&, string&, bool, bool, bool) +void epoch_pskel::post_type (string&, string&, bool, bool, bool, bool) { } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx index 5423e0d8..3263b17e 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx @@ -826,6 +826,7 @@ protected: bool _userspecifiedreferenceframe; bool _filespecifiedreferenceframe; bool _overridereferenceframe; + bool _userspecifiedepoch; }; class GPSBaseline_pskel: public ::xml_schema::complex_content @@ -1230,7 +1231,7 @@ public: // pre (); // string& referenceframe, bool user_specified, bool overridereferenceframe - virtual void post_type (string&, string&, bool, bool, bool); + virtual void post_type (string&, string&, bool, bool, bool, bool); }; class epoch_pskel: public virtual ::xml_schema::string_pskel @@ -1242,7 +1243,7 @@ public: // pre (); // string& referenceframe, bool overridereferenceframe - virtual void post_type (string&, string&, bool, bool, bool); + virtual void post_type (string&, string&, bool, bool, bool, bool); }; class system_pskel: public virtual ::xml_schema::string_pskel From dc4ab1d95f0d8eb0445db3cf59c7be6e86fda948 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 31 Jan 2025 12:41:34 +1100 Subject: [PATCH 055/102] Handle empty frame and epoch tags in xml msrs --- .../dynadjust/dnaimport/dnaparser_pimpl.cxx | 26 ++++++++++++++++--- .../dynadjust/dnaimport/dnaparser_pimpl.hxx | 4 +-- .../dynadjust/dnaimport/dnaparser_pskel.cxx | 6 +++-- .../dynadjust/dnaimport/dnaparser_pskel.hxx | 13 ++++++++++ 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index 94027d0c..81ac85c8 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -214,6 +214,10 @@ void Directions_pimpl::post_Directions(const UINT32& total) void DnaMeasurement_pimpl::pre() { _dnaCurrentMsr.reset(); + + // Initialise flags that will track whether Reference frame has been supplied + _frameSupplied = false; + _epochSupplied = false; } @@ -222,6 +226,18 @@ void DnaMeasurement_pimpl::Type(const ::std::string& Type) if (Type.empty()) throw XMLInteropException("\"Type\" element cannot be empty.", 0); + string frame, epoch; + + if (_frameSupplied) + frame = _referenceframe; + else + frame = datumFromEpsgString(_fileEpsg); + + if (_epochSupplied) + epoch = _epoch; + else + epoch = _fileEpoch; + char cType = (Type.c_str())[0]; switch (cType) { case 'A': // Horizontal angle @@ -250,7 +266,7 @@ void DnaMeasurement_pimpl::Type(const ::std::string& Type) break; case 'G': // GPS Baseline (treat as single-baseline cluster) case 'X': // GPS Baseline cluster - _dnaCurrentMsr.reset(new CDnaGpsBaselineCluster(++(*(_pclusterID)), _referenceframe, _epoch)); + _dnaCurrentMsr.reset(new CDnaGpsBaselineCluster(++(*(_pclusterID)), frame, epoch)); break; case 'H': // Orthometric height g_parsemsr_tally.H++; @@ -569,6 +585,7 @@ void DnaMeasurement_pimpl::Epoch(const ::std::string& Epoch) return; _dnaCurrentMsr->SetEpoch(Epoch); + _epochSupplied = true; } catch (const runtime_error& e) { stringstream ss(""); @@ -605,6 +622,7 @@ void DnaMeasurement_pimpl::ReferenceFrame(const ::std::string& ReferenceFrame) // Set the reference frame found for this measurement _dnaCurrentMsr->SetReferenceFrame(ReferenceFrame); + _frameSupplied = true; } catch (const runtime_error& e) { stringstream ss(""); @@ -620,6 +638,8 @@ void DnaMeasurement_pimpl::ReferenceFrame(const ::std::string& ReferenceFrame) void DnaMeasurement_pimpl::GPSBaseline() { + if (!_dnaCurrentMsr) + throw XMLInteropException("\"Type\" element must be the first element within \"DnaMeasurement\".", 0); } @@ -1346,7 +1366,7 @@ void referenceframe_pimpl::pre() // For DynaML.xsd, the following is specified: // // In this case, post_string() will return "GDA2020" -void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, +void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, bool userspecifiedreferenceframe, bool userspecifiedepoch, bool overridereferenceframe, bool firstFile) { @@ -1387,7 +1407,7 @@ void epoch_pimpl::pre() // For DynaML.xsd, the following is specified: // // In this case, post_string() will return "01.01.1994" -void epoch_pimpl::post_type(string& epoch, string& fileEpoch, +void epoch_pimpl::post_type(string& epoch, string& fileEpoch, bool userspecifiedreferenceframe, bool userspecifiedepoch, bool overridereferenceframe, bool firstFile) { diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx index 830d005a..7fb696f3 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx @@ -239,7 +239,7 @@ class referenceframe_pimpl: public virtual referenceframe_pskel, { public: virtual void pre (); - virtual void post_type (string& referenceframe, string& fileEpsg, + virtual void post_type (string& referenceframe, string& fileEpsg, bool userspecifiedreferenceframe, bool userspecifiedepoch, bool override_referenceframe, bool firstFile); inline const string str() { return _referenceframe; } @@ -253,7 +253,7 @@ class epoch_pimpl: public virtual epoch_pskel, { public: virtual void pre (); - virtual void post_type (string& epoch, string& fileEpoch, + virtual void post_type (string& epoch, string& fileEpoch, bool userspecifiedreferenceframe, bool userspecifiedepoch, bool override_referenceframe, bool firstFile); inline const string str() { return _epoch; } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx index 3088f505..297e8810 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx @@ -2065,6 +2065,8 @@ bool DnaXmlFormat_pskel::_start_element_impl (const ::xml_schema::ro_string& ns, this->DnaMeasurement_parser_->InitparentMsrVector(_pMsrs); this->DnaMeasurement_parser_->InitparentClusterID(&(_clusterID)); // Set default reference frame and epoch for this measurement + this->DnaMeasurement_parser_->InitfileEpsg(_fileEpsg); + this->DnaMeasurement_parser_->InitfileEpoch(_fileEpoch); this->DnaMeasurement_parser_->SetDefaultReferenceFrame(_referenceframe, _overridereferenceframe); this->DnaMeasurement_parser_->SetDefaultEpoch(_epoch); @@ -2143,7 +2145,7 @@ bool DnaXmlFormat_pskel::_attribute_impl (const ::xml_schema::ro_string& ns, this->epoch_parser_->_pre_impl (); this->epoch_parser_->_characters (v); this->epoch_parser_->_post_impl (); - this->epoch_parser_->post_type (_epoch, _fileEpoch, + this->epoch_parser_->post_type (_epoch, _fileEpoch, _userspecifiedreferenceframe, _userspecifiedepoch, _overridereferenceframe, _firstFile); this->epoch(); @@ -2165,7 +2167,7 @@ bool DnaXmlFormat_pskel::_attribute_impl (const ::xml_schema::ro_string& ns, this->referenceframe_parser_->_pre_impl (); this->referenceframe_parser_->_characters (v); this->referenceframe_parser_->_post_impl (); - this->referenceframe_parser_->post_type (_referenceframe, _fileEpsg, + this->referenceframe_parser_->post_type (_referenceframe, _fileEpsg, _userspecifiedreferenceframe, _userspecifiedepoch, _overridereferenceframe, _firstFile); this->referenceframe (); diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx index 3263b17e..d8e4331f 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx @@ -477,6 +477,15 @@ public: virtual void post_DnaMeasurement (); // Initialisation + + inline void InitfileEpsg(string& fileEpsg) { + _fileEpsg = fileEpsg; + } + + inline void InitfileEpoch(string& fileEpoch) { + _fileEpoch = fileEpoch; + } + inline void SetDefaultReferenceFrame(string& referenceframe, bool overridereferenceframe) { _referenceframe = referenceframe; _overridereferenceframe = overridereferenceframe; @@ -635,8 +644,12 @@ protected: PUINT32 _pMeasurementCount; PUINT32 _pclusterID; + string _fileEpoch; + string _fileEpsg; string _epoch; string _referenceframe; + bool _epochSupplied; + bool _frameSupplied; bool _overridereferenceframe; bool _preferSingleXasG; From 261b2ed16a1d0bd300e9e14de96007b551ed8ec3 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 31 Jan 2025 16:28:56 +1100 Subject: [PATCH 056/102] Improve handling of specified frame for xml files --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 45 +++++++++++++------ .../dynadjust/dnaimport/dnaparser_pimpl.cxx | 12 ++--- .../dynadjust/dnaimport/dnaparser_pskel.hxx | 4 +- .../dnaimportwrapper/dnaimportwrapper.cpp | 22 ++++----- 4 files changed, 50 insertions(+), 33 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index da9400f6..6d4e28dd 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -501,25 +501,42 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 { // Get the epoch of the nominated epsg (whether default or from the file) fileEpoch = referenceepochFromEpsgString(fileEpsg); - } + } - // Is this the first file? If so, set the project datum from the file's datum - if (firstFile) + // Has the user supplied a reference frame on the command line (--reference-frame)? + if (projectSettings_.i.override_input_rfame) { - // 2. Does the user want to override the datum contained in the files with - // the default? - if (!projectSettings_.i.override_input_rfame) + // A frame has been supplied. Now check for epoch. + + // Has the user supplied an epoch on the command line (--epoch)? + if (!projectSettings_.i.user_supplied_epoch) { - // 3. Does the user want the referenceframe attribute in the file to become the default? - if (!projectSettings_.i.user_supplied_frame) + // No epoch supplied. Take the epoch from the first file. + if (firstFile) { - // adopt the reference frame supplied in the file - datum_.SetDatumFromEpsg(fileEpsg, fileEpoch); - } - else - // Since import doesn't offer an option to capture epoch on the command line, - // take the epoch from the file (if not empty). + projectSettings_.i.epoch = fileEpoch; + projectSettings_.r.epoch = fileEpoch; + m_strProjectDefaultEpoch = fileEpoch; datum_.SetEpoch(fileEpoch); + } + } + } + else + { + // No frame supplied. Set the datum from the first file. + // If the datum field is blank in the first file, the default will be used. + if (firstFile) + { + projectSettings_.i.reference_frame = datumFromEpsgString(fileEpsg); + projectSettings_.r.reference_frame = projectSettings_.i.reference_frame; + m_strProjectDefaultEpsg = fileEpsg; + + // If the user has not provided a reference frame on the command line, then + // take the epoch from the first file. In this case, do not take the epoch + // from the command line (dnaimportwrapper will throw in this scenario anyway) + projectSettings_.i.epoch = fileEpoch; + projectSettings_.r.epoch = fileEpoch; + m_strProjectDefaultEpoch = fileEpoch; } } } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index 81ac85c8..fb3ff413 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -216,8 +216,8 @@ void DnaMeasurement_pimpl::pre() _dnaCurrentMsr.reset(); // Initialise flags that will track whether Reference frame has been supplied - _frameSupplied = false; - _epochSupplied = false; + _ReferenceframeTagSupplied = false; + _EpochTagSupplied = false; } @@ -228,12 +228,12 @@ void DnaMeasurement_pimpl::Type(const ::std::string& Type) string frame, epoch; - if (_frameSupplied) + if (_ReferenceframeTagSupplied || _overridereferenceframe) frame = _referenceframe; else frame = datumFromEpsgString(_fileEpsg); - if (_epochSupplied) + if (_EpochTagSupplied || _overridereferenceframe) epoch = _epoch; else epoch = _fileEpoch; @@ -585,7 +585,7 @@ void DnaMeasurement_pimpl::Epoch(const ::std::string& Epoch) return; _dnaCurrentMsr->SetEpoch(Epoch); - _epochSupplied = true; + _EpochTagSupplied = true; } catch (const runtime_error& e) { stringstream ss(""); @@ -622,7 +622,7 @@ void DnaMeasurement_pimpl::ReferenceFrame(const ::std::string& ReferenceFrame) // Set the reference frame found for this measurement _dnaCurrentMsr->SetReferenceFrame(ReferenceFrame); - _frameSupplied = true; + _ReferenceframeTagSupplied = true; } catch (const runtime_error& e) { stringstream ss(""); diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx index d8e4331f..085dea4d 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx @@ -648,8 +648,8 @@ protected: string _fileEpsg; string _epoch; string _referenceframe; - bool _epochSupplied; - bool _frameSupplied; + bool _EpochTagSupplied; + bool _ReferenceframeTagSupplied; bool _overridereferenceframe; bool _preferSingleXasG; diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index 6e4f77e7..f7f13ccc 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -1015,17 +1015,6 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* inputFileEpsgi = LongFromString(inputFileEpsg); p.i.reference_frame = inputFileDatum; p.r.reference_frame = inputFileDatum; - - try { - // Initialise the 'default' datum (frame and epoch) for the project, from the first file. - parserDynaML.InitialiseDatum(p.i.reference_frame, trimstr(inputFileEpoch)); - } - catch (const XMLInteropException& e) { - stringstream ss; - ss << "- Error: "; - cout << ss.str() << e.what() << endl; - return EXIT_FAILURE; - } } if (inputFileEpoch.empty()) @@ -1043,6 +1032,17 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* p.i.epoch = inputFileEpoch; p.r.epoch = p.i.epoch; } + + try { + // Initialise the 'default' datum (frame and epoch) for the project, from the first file. + parserDynaML.InitialiseDatum(p.i.reference_frame, p.i.epoch); + } + catch (const XMLInteropException& e) { + stringstream ss; + ss << "- Error: "; + cout << ss.str() << e.what() << endl; + return EXIT_FAILURE; + } } if (!parserDynaML.filespecifiedReferenceFrame()) From d79cd2aba9c6a86b4aec0d07f35c43c31d6ebdd0 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 31 Jan 2025 16:57:17 +1100 Subject: [PATCH 057/102] Remove unused variables --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 6 ++---- dynadjust/dynadjust/dnaimport/dnainterop.hpp | 2 +- dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx | 5 ++--- dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx | 4 ++-- dynadjust/include/config/dnaoptions.hpp | 3 +-- dynadjust/include/io/dnaiodna.cpp | 4 ++-- dynadjust/include/io/dnaiodna.hpp | 2 +- 7 files changed, 11 insertions(+), 15 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index 6d4e28dd..ce17e3e4 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -1078,9 +1078,7 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 // reference frame based on the header and user preferences dnaFile.read_dna_header(ifsInputFILE_, version, idt, datum_, // project datum - firstFile, // is this the first file to be loaded? projectSettings_.i.user_supplied_frame==1, // Has a reference frame been supplied? - projectSettings_.i.user_supplied_epoch==1, // Has an epoch been supplied? fileEpsg, fileEpoch, geoversion, count); // release file pointer mutex import_file_mutex.unlock(); @@ -4189,7 +4187,7 @@ void dna_import::SignalExceptionInterop(string msg, int i, const char *streamTyp } void dna_import::SerialiseMSR(vdnaMsrPtr* vMeasurements, const string& msrfilename, - const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused) + const project_settings& p, vifm_t* vinput_file_meta) { // Measurements std::ofstream dna_msr_file; @@ -4327,7 +4325,7 @@ void dna_import::SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, // Write measurements (if present) if (!vMeasurements->empty()) - SerialiseMSR(vMeasurements, msrfilename, p, vinput_file_meta, flagUnused); + SerialiseMSR(vMeasurements, msrfilename, p, vinput_file_meta); } diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.hpp b/dynadjust/dynadjust/dnaimport/dnainterop.hpp index cc68a34f..4dea0358 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.hpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.hpp @@ -158,7 +158,7 @@ class dna_import { // file handling void SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const string& stnfilename, const string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); - void SerialiseMSR(vdnaMsrPtr* vMeasurements, const string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused = false); + void SerialiseMSR(vdnaMsrPtr* vMeasurements, const string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta); void SerialiseSTN(vdnaStnPtr* vStations, const string& stnfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused = false); //void SerialiseDynaMLfromBinary(const string& outfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); void SerialiseDynaMLfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const string& outfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index fb3ff413..ffb8e269 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -1367,8 +1367,7 @@ void referenceframe_pimpl::pre() // // In this case, post_string() will return "GDA2020" void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, - bool userspecifiedreferenceframe, bool userspecifiedepoch, - bool overridereferenceframe, bool firstFile) + bool userspecifiedreferenceframe, bool firstFile) { // 1. Get the DnaXmlFormat referenceframe attribute value from the file _referenceframe = trimstr(post_string()); @@ -1409,7 +1408,7 @@ void epoch_pimpl::pre() // In this case, post_string() will return "01.01.1994" void epoch_pimpl::post_type(string& epoch, string& fileEpoch, bool userspecifiedreferenceframe, bool userspecifiedepoch, - bool overridereferenceframe, bool firstFile) + bool firstFile) { // 1. Get the DnaXmlFormat epoch attribute value from the file _epoch = trimstr(post_string()); diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx index 7fb696f3..c462545d 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx @@ -240,7 +240,7 @@ class referenceframe_pimpl: public virtual referenceframe_pskel, public: virtual void pre (); virtual void post_type (string& referenceframe, string& fileEpsg, - bool userspecifiedreferenceframe, bool userspecifiedepoch, bool override_referenceframe, bool firstFile); + bool userspecifiedreferenceframe, bool firstFile); inline const string str() { return _referenceframe; } protected: @@ -254,7 +254,7 @@ class epoch_pimpl: public virtual epoch_pskel, public: virtual void pre (); virtual void post_type (string& epoch, string& fileEpoch, - bool userspecifiedreferenceframe, bool userspecifiedepoch, bool override_referenceframe, bool firstFile); + bool userspecifiedreferenceframe, bool userspecifiedepoch, bool firstFile); inline const string str() { return _epoch; } protected: diff --git a/dynadjust/include/config/dnaoptions.hpp b/dynadjust/include/config/dnaoptions.hpp index 41046081..1bcfdf3f 100644 --- a/dynadjust/include/config/dnaoptions.hpp +++ b/dynadjust/include/config/dnaoptions.hpp @@ -486,7 +486,7 @@ struct adjust_settings : private boost::equality_comparable { struct output_settings : private boost::equality_comparable { public: output_settings() - : _datum(DEFAULT_DATUM), _m2s_file(""), _adj_file(""), _xyz_file("") + : _m2s_file(""), _adj_file(""), _xyz_file("") , _snx_file(""), _xml_file(""), _cor_file(""), _apu_file("") , _adj_stn_iteration(0), _adj_msr_iteration(0), _cmp_msr_iteration(0), _adj_stat_iteration(0) , _adj_msr_final(0), _adj_msr_tstat(0), _database_ids(0), _print_ignored_msrs(0), _adj_gnss_units(0) @@ -537,7 +537,6 @@ struct output_settings : private boost::equality_comparable { //} public: - string _datum; // Datum switch. Requires datum.conf and ellipsoid.conf. string _m2s_file; // Measurement to stations file string _adj_file; // Adjustment output string _xyz_file; // Adjusted coordinate output diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index 5f8b160e..e5bc8ed4 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -165,7 +165,7 @@ void dna_io_dna::read_ren_file(const string& filename, pv_string_vstring_pair st UINT32 count(0); // read header information - read_dna_header(&renaming_file, version, idt, datum, false, false, false, fileEpsg, fileEpoch, geoidVersion, count); + read_dna_header(&renaming_file, version, idt, datum, false, fileEpsg, fileEpoch, geoidVersion, count); read_ren_data(&renaming_file, stnRenaming); @@ -249,7 +249,7 @@ void dna_io_dna::read_ren_data(std::ifstream* ptr, pv_string_vstring_pair stnRen void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA_TYPE& idt, - CDnaDatum& referenceframe, bool firstFile, bool user_supplied_frame, bool user_supplied_epoch, + CDnaDatum& referenceframe, bool user_supplied_frame, string& fileEpsg, string& fileEpoch, string& geoidversion, UINT32& count) { string sBuf; diff --git a/dynadjust/include/io/dnaiodna.hpp b/dynadjust/include/io/dnaiodna.hpp index 45ce4fdb..3b11301e 100644 --- a/dynadjust/include/io/dnaiodna.hpp +++ b/dynadjust/include/io/dnaiodna.hpp @@ -91,7 +91,7 @@ class dna_io_dna : public dna_io_base const CDnaDatum& datum, const string& comment); void read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA_TYPE& idt, - CDnaDatum& referenceframe, bool firstFile, bool user_supplied_frame, bool user_supplied_epoch, + CDnaDatum& referenceframe, bool user_supplied_frame, string& fileEpsg, string& fileEpoch, string& geoidversion, UINT32& count); inline const dna_stn_fields dna_stn_positions() { return dsl_; } From 6db3a5ddff286551c83188c209be0e9795f65b5c Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 31 Jan 2025 17:17:09 +1100 Subject: [PATCH 058/102] Replace deprecated basename with stem --- dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp | 3 ++- dynadjust/dynadjust/dynadjust/dynadjust.cpp | 2 +- dynadjust/include/io/dnaiopdf.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp index b6197d76..aa07da31 100644 --- a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp +++ b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp @@ -1188,7 +1188,8 @@ int main(int argc, char* argv[]) cout << " " << leafStr(p.a.bms_file) << " last modified on " << ctime(&t_bms) << endl; cout << " " << leafStr(p.a.seg_file) << " created on " << ctime(&t_seg) << endl; cout << " Run 'segment " << p.g.network_name << " [options]' to re-create the segmentation file, or re-run" << endl << - " adjust using the --" << SEG_FILE << " option if the file " << basename(p.a.seg_file) << " must\n be used." << endl << endl; + " adjust using the --" << SEG_FILE << " option if the file " << + path(p.a.seg_file).stem() << " must\n be used." << endl << endl; cout_mutex.unlock(); return EXIT_FAILURE; } diff --git a/dynadjust/dynadjust/dynadjust/dynadjust.cpp b/dynadjust/dynadjust/dynadjust/dynadjust.cpp index 906c8f38..7e10f1c2 100644 --- a/dynadjust/dynadjust/dynadjust/dynadjust.cpp +++ b/dynadjust/dynadjust/dynadjust/dynadjust.cpp @@ -208,7 +208,7 @@ int main(int argc, char* argv[]) if (vm.count(PROJECT_FILE) && vm.count(NETWORK_NAME)) { - if (equals(basename(p.g.project_file), p.g.network_name)) + if (equals(path(p.g.project_file).stem().string(), p.g.network_name)) { cout << endl << "- Error: project file name doesn't match network name. Provide" << endl; cout << endl << " either a project file path or the network name. " << endl << endl; diff --git a/dynadjust/include/io/dnaiopdf.cpp b/dynadjust/include/io/dnaiopdf.cpp index c484f5ae..91671965 100644 --- a/dynadjust/include/io/dnaiopdf.cpp +++ b/dynadjust/include/io/dnaiopdf.cpp @@ -41,7 +41,7 @@ string dna_io_pdf::form_pdf_action_command_string(const string& pdf_filename, co char viewer_filepath[256]; FindExecutable(pdf_filename.c_str(), 0, viewer_filepath); - string viewer(basename(viewer_filepath)); + string viewer(path(viewer_filepath).stem()); if (iequals(viewer, "AcroRd32") || iequals(viewer, "Acrobat")) { From 184ba222e1ae901df37814905af1ad92e1ba6eff Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 31 Jan 2025 17:28:15 +1100 Subject: [PATCH 059/102] Fix overrides --- dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx | 9 ++++----- dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx index 297e8810..62f4145f 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx @@ -2147,7 +2147,7 @@ bool DnaXmlFormat_pskel::_attribute_impl (const ::xml_schema::ro_string& ns, this->epoch_parser_->_post_impl (); this->epoch_parser_->post_type (_epoch, _fileEpoch, _userspecifiedreferenceframe, _userspecifiedepoch, - _overridereferenceframe, _firstFile); + _firstFile); this->epoch(); } @@ -2168,8 +2168,7 @@ bool DnaXmlFormat_pskel::_attribute_impl (const ::xml_schema::ro_string& ns, this->referenceframe_parser_->_characters (v); this->referenceframe_parser_->_post_impl (); this->referenceframe_parser_->post_type (_referenceframe, _fileEpsg, - _userspecifiedreferenceframe, _userspecifiedepoch, - _overridereferenceframe, _firstFile); + _userspecifiedreferenceframe, _firstFile); this->referenceframe (); _filespecifiedreferenceframe = true; } @@ -3193,14 +3192,14 @@ void type_pskel::post_type () // referenceframe_pskel // string& referenceframe, bool user_specified, bool override_referenceframe -void referenceframe_pskel::post_type (string&, string&, bool, bool, bool, bool) +void referenceframe_pskel::post_type (string&, string&, bool, bool) { } // epoch_pskel // string& epoch, bool override_referenceframe -void epoch_pskel::post_type (string&, string&, bool, bool, bool, bool) +void epoch_pskel::post_type (string&, string&, bool, bool, bool) { } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx index 085dea4d..9e5e9892 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx @@ -1244,7 +1244,7 @@ public: // pre (); // string& referenceframe, bool user_specified, bool overridereferenceframe - virtual void post_type (string&, string&, bool, bool, bool, bool); + virtual void post_type (string&, string&, bool, bool); }; class epoch_pskel: public virtual ::xml_schema::string_pskel @@ -1256,7 +1256,7 @@ public: // pre (); // string& referenceframe, bool overridereferenceframe - virtual void post_type (string&, string&, bool, bool, bool, bool); + virtual void post_type (string&, string&, bool, bool, bool); }; class system_pskel: public virtual ::xml_schema::string_pskel From ae2b105c4795809ea14ed2f4ce3e27444247cf68 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 4 Feb 2025 17:41:46 +1100 Subject: [PATCH 060/102] Handle import epoch in project files --- dynadjust/include/config/dnaprojectfile.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/dynadjust/include/config/dnaprojectfile.cpp b/dynadjust/include/config/dnaprojectfile.cpp index 10e2b9a8..26fb176d 100644 --- a/dynadjust/include/config/dnaprojectfile.cpp +++ b/dynadjust/include/config/dnaprojectfile.cpp @@ -700,6 +700,12 @@ void CDnaProjectFile::LoadSettingImport(const settingMode mSetting, const string return; settings_.i.reference_frame = val; } + else if (iequals(var, EPOCH)) + { + if (val.empty()) + return; + settings_.i.epoch = val; + } else if (iequals(var, OVERRIDE_INPUT_FRAME)) { if (val.empty()) @@ -950,6 +956,12 @@ void CDnaProjectFile::LoadSettingImport(const settingMode mSetting, const string return; settings_.i.search_similar_msr_gx = yesno_uint(val); } + else if (iequals(var, IGNORE_INSUFFICIENT_MSRS)) + { + if (val.empty()) + return; + settings_.i.ignore_insufficient_msrs = yesno_uint(val); + } else if (iequals(var, IGNORE_SIMILAR_MSRS)) { if (val.empty()) @@ -1591,6 +1603,8 @@ void CDnaProjectFile::LoadSettingOutput(const string& var, string& val) return; settings_.o._export_snx_file = yesno_uint(val); } + // ??? + // EXPORT_DISCONT_FILE = "export-discont-file"; } @@ -1741,6 +1755,7 @@ void CDnaProjectFile::PrintProjectFile() // reference frame settings PrintRecord(dnaproj_file, REFERENCE_FRAME, settings_.i.reference_frame); + PrintRecord(dnaproj_file, EPOCH, settings_.i.epoch); PrintRecord(dnaproj_file, OVERRIDE_INPUT_FRAME, yesno_string(settings_.i.override_input_rfame)); @@ -1771,10 +1786,12 @@ void CDnaProjectFile::PrintProjectFile() PrintRecord(dnaproj_file, TEST_NEARBY_STNS, yesno_string(settings_.i.search_nearby_stn)); PrintRecord(dnaproj_file, TEST_NEARBY_STN_DIST, settings_.i.search_stn_radius); - PrintRecord(dnaproj_file, TEST_SIMILAR_MSRS, - yesno_string(settings_.i.search_similar_msr)); PrintRecord(dnaproj_file, TEST_SIMILAR_GNSS_MSRS, yesno_string(settings_.i.search_similar_msr_gx)); + PrintRecord(dnaproj_file, TEST_SIMILAR_MSRS, + yesno_string(settings_.i.search_similar_msr)); + PrintRecord(dnaproj_file, IGNORE_INSUFFICIENT_MSRS, + yesno_string(settings_.i.ignore_insufficient_msrs)); PrintRecord(dnaproj_file, IGNORE_SIMILAR_MSRS, yesno_string(settings_.i.ignore_similar_msr)); PrintRecord(dnaproj_file, REMOVE_IGNORED_MSRS, From 6f528a8efe09e45be5adf728990ea6f8f6b34d98 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 4 Feb 2025 17:45:14 +1100 Subject: [PATCH 061/102] Improve handling multiple file datums on import --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 2 ++ dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx | 14 +++++++++++++- dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx | 4 +++- dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx | 14 +++++++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index ce17e3e4..e6625cb4 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -1123,6 +1123,8 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 projectSettings_.i.epoch = fileEpoch; projectSettings_.r.epoch = fileEpoch; m_strProjectDefaultEpoch = fileEpoch; + + InitialiseDatum(projectSettings_.i.reference_frame, projectSettings_.i.epoch); } } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index ffb8e269..57a4629a 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -874,7 +874,19 @@ void DnaMeasurement_pimpl::post_DnaMeasurement() void DnaStation_pimpl::pre() { - _dnaCurrentStn.reset(new CDnaStation(_referenceframe, _epoch)); + string frame, epoch; + + if (_overridereferenceframe) + frame = _referenceframe; + else + frame = datumFromEpsgString(_fileEpsg); + + if (_overridereferenceframe) + epoch = _epoch; + else + epoch = _fileEpoch; + + _dnaCurrentStn.reset(new CDnaStation(frame, epoch)); _dnaCurrentStn->SetfileOrder(g_fileOrder++); } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx index 62f4145f..acada195 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx @@ -2046,7 +2046,9 @@ bool DnaXmlFormat_pskel::_start_element_impl (const ::xml_schema::ro_string& ns, this->DnaStation_parser_->InitparentStnVector(_pStns); // Set the default reference frame and epoch for this station - this->DnaStation_parser_->SetDefaultReferenceFrame(_referenceframe); + this->DnaStation_parser_->InitfileEpsg(_fileEpsg); + this->DnaStation_parser_->InitfileEpoch(_fileEpoch); + this->DnaStation_parser_->SetDefaultReferenceFrame(_referenceframe, _overridereferenceframe); this->DnaStation_parser_->SetDefaultEpoch(_epoch); this->DnaStation_parser_->pre (); diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx index 9e5e9892..9fda286a 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx @@ -673,13 +673,22 @@ public: virtual void post_DnaStation (); // Initialisation + inline void InitfileEpsg(string& fileEpsg) { + _fileEpsg = fileEpsg; + } + + inline void InitfileEpoch(string& fileEpoch) { + _fileEpoch = fileEpoch; + } + inline void InitparentStnVector(vdnaStnPtr* pStns) { _vParentStns = pStns; } - inline void SetDefaultReferenceFrame(string& referenceframe) { + inline void SetDefaultReferenceFrame(string& referenceframe, bool overridereferenceframe) { _referenceframe = referenceframe; + _overridereferenceframe = overridereferenceframe; } inline void SetDefaultEpoch(string& epoch) { @@ -754,8 +763,11 @@ protected: vdnaStnPtr* _vParentStns; dnaStnPtr _dnaCurrentStn; + string _fileEpoch; + string _fileEpsg; string _epoch; string _referenceframe; + bool _overridereferenceframe; }; class DnaXmlFormat_pskel: public ::xml_schema::complex_content From f8cbd9230435337ec90923c4376c45263304efed Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:54:06 +1100 Subject: [PATCH 062/102] Add help relating to code changes (frame, epoch) --- resources/DynAdjust Users Guide.pdf | Bin 5383239 -> 5416740 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/DynAdjust Users Guide.pdf b/resources/DynAdjust Users Guide.pdf index 0f5535403e3300211462cbfa8a8a6c2dccc4bb3f..3a1c7c09f6e91b8e3fe2f4fa8a6347aff35a6ccd 100644 GIT binary patch delta 1379124 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 Fr$Xku9TA_I)*dq|F`9PCjN-j}NB;qV= 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∋1!Pn`kWq22Kt}OHeVNl)1)F4zzB9_+VUibW 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�x|FU=J*HsrCFu3hIcl5kSSj@N*>;(cKhWO~RK87DNh}mARFPn+U;}RV&s9gY(Y5m_-1seii zkQxShd41ek`;#>ySB5{neb?xi|9uqtSbFEy?c+@4Bsp#M^M{tDHDgO zI)djpiU^|S2i@Jdm4l%v9>Di7ghLKz4Vduq(1o80IcWUcQlE}|zgP$|0&4KAX2#|U z8g{RNt;b6SHB=;3H7EfA54H2Z+bjQ}fkERJNQ+jtD~ld9ECRjQpZ09eX9DF?X3lBo zD`>PTWe5aC37ic0>zCzhIM^}f`CiRHJsMoTr77mf^LaV$+vVYWI(R)877To6`Ly)w zL3tjnDjH&vlP{v~jH=h#)TW8q%-)!~CV2{q+=j!&7c)jb<5L0PAhCl5^`Yt6zIWAb z4;ts-btTR0+Y+~%xk6Y^Qz_w8I94q@XY9986N$f?(lN1fE1t!I+phIT9G>r~sN0wij&wjf6p+4nY_uzboeQE9BPn z{wb=OoA`?mUO+0?RhXQR@^8g8xbVjXai9=-Hi67i+^4~gEghX5{P$18(%${)ih>AM zG^`*RZQ{ZoM=Fvs5+(4D25n6^J+s827g1oU&ZVpCk&Jt(s}^o-!Khe?Dho#*FXx%onc_P!xKlydaX9 zl|dy*W`|)D=leay@9N!y6My7AtGlHHn^^51iA)`x&!2a)q2%~@^NC4CQm@bf>Ons@o+YDP#YTQ2oGTOI zRAh0oGA_SmL~3CoC~yJy@+h^h1^%nOB9G1o7X?-sXEb%{j2lI6aVgx8DNaxhIzR+U z)=(I}1Mypi{~XlOTcuY{|1fRbe0Qap1Zq@rlQ3~=9Yf#-uz%cnXfRc#+vZI_bLAEB z5;c`MabN&m({4@k#&uz&j6W5)Xx|(82PC)wqRnnf)Um&(L9S^L$Fz=kb?9<$Zs3El z%!vb34n1aplM5q;Q?pizW1p#KEr8e>f=>8iS5UDT275PA9p7DNdmpUYbdL6CHc=Z3 z&RuPo%uBPEeG^`yzh#LI?k%svLkqt%Wq{r!^ULb_)5GyV6dWN|zqPM8H0hB2c;i9*%Ts!1B8vt~-L@#;_ z3meKi1zIsopO4$m=Do@RY;e$G13GAx&3GXHu!vhe#o5V$?tT-5P{^Nla3hqu8H~^) zkg#9nLAmlw=#5&{O!)8AZMO}M&$?3p{R2q96;=*O5D~1El%G5jpVnV>qI2xY?4Kb% z-13Hy_BwM6f^Ivx_{z;0Cm^OZ{nk^3wZhx`%oX8fsuHfIBV^pj&+kel=jt@rAP18R zi6G`BP6L2GZJ6-fLLO8o^ z%xaJ9BTAF6TtT_Q{6SfUxk?0`p8|IE8?F0tK%X!!{ zj)`L!+6+(PFHY9?t9G?Z3Q_W&-A>-W@UT;Ei0v{N9Qrw+oc@RQZPmF4md7XZ^}U^E zpEA?YbBvyPQt6msGmAgqBFwcxBAy_0@h;%wehGq*Y(jjx0>2G$(h*tf=>Kb32#BUw?YbPao`G4Z7vA;lds)+=ub3K$>9~11M>RkJ19Q zn|{yuf+#Vp)6WEZ9vEWZ3#!LL4ZL@R;6lPB3+ez-tT*3tgUkBn7|_AugrMZg8T?&I z7lh4D2q;&0Z3D~}k~1M-ujcDhqK)SqUXE=sVxoS)^^91*$u}AXQyR00RMH^JHBKJqAHg$ zFJP5IWzBZRT#goq6y!_^*o!oLN-2;nT_`meV;&EZ#03N%w{kK2np8N3SNzFMH|Y>lz4GZ2!*^6UK#r3%ms-ApY7ZShjca0 z2yI^ykNBJDHq>B`sL5*@C6b=ou5^%qm73eGa0>7CwLIAHvDODhN$@r5piVXD4f~Lf zPR&HE(H$_qr9a+C<4XX^+V~F*w0IG%(kGi*7iB5^(xGU{#?cjUTJ%Rp>{s{Cphu># z*ktWNJa&xp5exl38$JCzL^LMg?ZWG6eN^|KG#hLo!d%HaI5$15ptVVySyAvu^al9bRtNZb)*mR_ zQ*`~;^A7L;%_ByYV0B6~mA*bcW^z4h>MQ_{PVnFmrD;Zizt(9pGLkd}b?b;S8ORpV zsOCd2mN(alEryieK{+_&)UC7~@=dn}IfwPonLjBV8@THRTFUgfvi+-*c10}4+wfe6 zd6GtK9ap&uIC2Ke^;xUxL$8S?EA+KSMgO|AodS~kE>lxF&~v5A#X3an70QRBUX%k{B8#UrSJ3SyvD9WQ##1crO-AE2-+2)w03QpS^gb7$O5~&Z^OV+ zEbw0|)}YYyzTZAC&3z14yCv%ov*eE4^9a|Ko@-!VYo~eZ>~}?LRX2>MIUy@{cx>&w zJkBSq-5O{CwA`o{d*w?rzck!70qtGL*VogBmw9wC${VqM0u;Y$jE}^WH`v7#bt3XE zRF+(%-B9_GT)qUTqBsMu=lqt`x9A4vHL8IlKfV5ehTF2XbC}LD1o^92uH>Cq*tsF1 zFYh$@gfb*%!hmLgc4|qG*87|x9Du}I4c(8szck>qN^;cA!>_vtN>A^+KtGopt@Z3w zh!v#N1;L{JIBx8H!J+{(rQ|sR{~%Mev|KL+(R^lV7;MLh(H$4ekDc!9BoTB>&{Vbh zVR7*Ts|G=|;FBFeKHhvhO-ZHhSL;xO&ZKaoj_YsOuM862p))={&ud!La=hr40vi^Y zCMa55Q7n|K>m_VVs4LSqrzv*G(%Qeio+2t-Th#dU>}icrc*khBPZBnF)c~twR?d%G z&sIz$9rWb1Nz2mNo0Di$$riWI zW5uNz9gj_;2~*{(su$}s8auB$Yi}OZ(*DroYm*i2tI5B*6eJX8J`+_mSYm#FW6K-E z216jfd0)9xP^uNn8VPfYGXW*>M<|sJm|UaE={g7CMq_3dZ$fPr+)!N4gyvb?+EU3@ z%Y4ZV*3Z$s{io|)mVNzeMqIUH%B3u3n*>iWzYUBM%JcMcom+nYb!ME$P}LbX zSbm@w$n+rCxQ9H(RzqCMR0%~KMwHMlprozSBC13mBZS454BOcmu=5QcB|i1i{#B&u zYb12A`P%WR+L_;cjfwdsPVJ}t@Nzr5VZ8COXL}x=s!97vA}q@lSI{>f$1I2qDhngG%fQ!_ zZ7NO14})mJL>LJ8@WpP}==ziE*|_;D=_~JJh(7ow*|A3p&Bb@TrXRUP=EYl$Wuv_N zc|3ozSAL8ed~-73gRWQ(qPQ}{Ug*ycEwuM;$j_QN+0uGLL=Q0349*S*CzL8UXkT9f zgorZiNb^A7qqAaii5gd=k=>-_<;gPzPKm)sbFd}MAPSx2<#Pp{l>h}z>ztVn2#&O{ z2_>Umqm%q@rv4hBYs zICVq|04X$SK=zN=W72xndEmhna>laSf&5+RaOce{)~6D=!Tm|dN$iz6S5hOHXGs`pkS13o;^!=?b{QdDO;vc8VbkXm9(Glu=-JDFS7;(`%O4PSUmvRxe~c?;KB+1kl%^_(F9DoFp`G@5u}Hk_Qiwc%5JxpteD=+(DPMEyr2~r*sT-;$<#*p%&PK?aI{>9VI zwgG%{g|_<)erGUrQmUyu_@3Mkhum*z^MJ}s?c=c(6&_fJ)&>*-S=Zs>J8@baxKu)w zJ4-XK#OSgI827wDJNJRb1+joLgZcbhL7U7qjkiA4K#Lcfl9ytFBe`M-10ELJ)9;PT zPa1+pV&5a6)30HQXV0_II7MG6F^8P!-MzYMA0N2yn!gwgyFDc$8Z8NNxHER^R)8)K z%JXq0p}t+i9fm)vG;11;O9)Z(%epWyM?qqto5RX^k+oDQbSF0GO92F784ex?4~&0# zQKE)vH*826s6M}K9$XZAm60m zStjL|gXeGqtucgsJb0S4@tHD^MdKbGCXbb&;=FLTWcZQVw|)}Ee}uM6oB*=qvSbfL zBV!}K+)Do9HkgI;)@eeF5gU$V*Zw#?xh6^8a7A*dw6n}Xt1aAHQt=fM;tmX^8z_t- zh~5z6e}inU>B9V4A4z^81R|q}CAi0iHM8uLBvKHKem)TR#DVxLacEGR%W(=ZO_}oN zD{&!vkO3|OuEwGF21YK zp$IaT#=NrNVt16ddVplZx<-fGwUB1)VYLmYWc{#4Z&DFBmvUIik0eDW$oo`O8E|l1 zPBe3;^bDhZ7N9B=a#-=hw*JH`SQOJj2z$q2!q40zMgvQs!hrro8$j_cW)M{5p1-@h zpa!_l39h>$Pc6bkf`@K)Wdg<4o$%n5PO-oAnJ&_cId)@0JJJyv@4tV(2_aEi@|yWa zeniULV zmuv2UID!slr>|7Wytr{Av|WK`K`%$8d4g~;>TlJej)U_dQ!GopCK-92Z4PKcRGDRJ zCuwgV`^8^iz{?6(*gv$zROO_NlMA{N^8xiy_hbZ0q)DWh8~_dFA@>AfS!>qb%Nw_G zFU@{wpWhp8732XST=_vY_ZMEK5aREWeEnly&p;Ip+~2U*7k74#ly~uIvRJ=EuJbcF zCuc(xeJLGN@ovZ_lI|zLAJ`o=-$cP7hGjBziB z0=ers(_SE2l>^LGq0PZC4!{tlnwCz2*NKx`=AMz1MMvi^)QYWBLG+?#sIE~CuSW|k zHelzssCY%%ZmvsfOGHb*|A-2|)q)*yfmpyqFV@D??1NdG#$Du^CR5{iHOgmWz?_`& zslebp2D}cD~A#pM_gW8xZucqojyT~j6$4{NDo@-J7A%eK58q^c z*50Ny3;=z7Z_(|!(6JO5z8}Ud9F@M<6e7ROxMoHNtaH-p^WZfPSW+A#KS zX>>b-+Pq|T>A6MmZwJnk7~tvPQK;Ogq!W3{JaJ z#~Ybvn(N>GZv1cttWaB;8?Ef2ye#4gu?7dt5Hy`FVH$;RanVY?%Pv$yZIcP+_@o6i z1wSq@>Fq1VL%DiTQczgr0Y0}_>?N+=CARwH>gEiSMOd1(3(6JCGEyzu*IhK;^!;4R z0#HV4#$JQ&i*9D(rzou<10p$l3m%JaS$xeCdgfanpZ)73X06q5t4^1)B-BuS{58iK zzKgL%wCv1gK*eQ<&u-wc2WXCv(NKII@9f8;ZvQ@9@3=L6YJHUtp0XQ)*~+RWQ|{Oh zXugti&~Zo=NQt$A|u5kAJJJQwmpwtqI!2yRYpyN0E7Fhm7OX#LxvPa76;EelOH8i9CoF;|@&!1P zsPwjN>4({#hiF#)ixHpJ0_!h|0mkJ0?D*t0*qAH-0>IqIW4*aE!HG{)hFb^xI8=9O zc1B-cmSOBZk@za;pzY=(3m_Vkh>X#&FwQpRH|HoNjewd>!EUeqKe`1Z4(o-w_$+nL zI>)z~yf0Na1f{BlLK5p%d9$n0uQ$dOR@!tC#Q#bkz91 zdj8@;@ieYjkM>Ttkb=NEU{pFYFAm&5NP8CeAGcR@eyNJID78KXq>xoxr*@YAy%?$R z*>PShYj6I0v{7w+`u(hC{Y;#xTlk>o2^uf-zZ+M!|FGMrDMZnHG=L>-8OOtBq^=7! zh8Be?NQl`N=_CXR%PeZOqgY|iDsN0FZ42ZpbCRj+^{+>FAWjm0upU!NcSqzQzuw`C zpW|<|o4wZUehmhoyZzaj;NrXi4VIrYN;r8)fdC9-(9A z=wRW=0K-SEBIJ1q@EMabUxiQbrK5XuF=OuhY1cNq74kAS<swu#C3sPF_S`&8OY@9)`jGavS2$d|&;79O45t5N2@{@xGsf0hqz6NirM` zTXd^BP;&1&Hmqti6CDFl9Tpo_(7PTVxsNe8Y}uh%$yDA2q@$w!g~n{H2>#B)mPm|j zl%@UMmljS)SqjP4Jj5wwosr(DK&;3WG^HR1*+5ng;CIF74AiPOG*orll z!n_eFF+G*B+x(+1M%!^{bic&>)7o-2ozyH7l*%Br7`tr8vchYCdaAW(u$*3l`&WY| zoAv9p!xeZHz{hhn35rglf_@`Is&0Kpr3YN8rNi#GT8_)cr;>9R<mD z5s9dN`|6!mKTzs5QXMY;(=;U@x>j+`jxcQx9FxCP3tr7D{4QBzZ(-`5=x-O~MHp6N z{n(UYnoGNdsSW;6A=m!D61W@=^2|z?YKvP5SA40ZVOFYWo#F?X+7gB>mIh-V`it9_ z69qXx!0*7ikiDwd<6Xf8_@Jjk186b*olKh^@k_ObOSP`2jq1;uLy(1*z)P6POf;wC zOzBzp%R`gD9pO}MG7Qn)-N}JL>k=HR#vzSttkh_SVKz1>oCFfaL>3*g^VA2V#>oEA zklQoCE|ksEbuObTkE2Wt$+0Eg!1s&YbrqVN0AUhe`6|qyrrSQ;{WKJ&DIzM$d8k7Y zB}`;-AhtE=Getbd(#=BS>C*#ADo8v!G(nrJd*=Dj@Z`V29F}2|rHA#lG5TOG1PM z0P?^7v`u6EeuI?{d7FAB)KLYYwg-4^($l+4`>UeomyPSYObe8X?JAUyDY+028p0bu z*O2Vb3nK>AwFXu?vhCd7lnZ^@M@AF*46?r0QMGow%Ag#3Zlwb4Q3kfU5ySrm#uB}LdN)Yi|W<+0Z0$58&iZUPj^Vk@@JM%mt63R1h&R$ z@&c)kU$q<&Xj}=j%|fKy3K*b!icr2A^w^1_pr@Nx9`*9$}7oNf|m0c zYQ3SbJLd9=b$Er73jFFjSqBL3ODRlJuNvvcEw?>{@!eSvo)`#~iaw*DO6hZ|t*Ubg z;m6X;sjsWda>}~ZP19Edo&tNW0MltcG}xz72=R#%Lu_s0xXjGU=63g!NL_%}2cUBm z;6+zq(BisK_?3jSb6I?qYV+ht&Pgd$M(`S>#w8`{5D{Y>g2A4@)RlSn^-osP;ZXZ* z4Fh|U@tPBOzNF)F zS=C;8eX_JGvHo|rfh%86?VTcY2f#4A(>>^FLt@kyk%V~Fy6MO8I}Lz<`knFQw>2dE zO=Z88n)$M!_w4MdDvA57(NFuY8`F|%orNUoDG3^falRH8qejt|iqwKVCYC2hj!R^u zT!<1ZL49ttLD)MJo75izokH^{97SJL3&5GdR68>r=0pBn0;vEglWjaM#S0vAc`^>apXjQrvHs(U z_w=~UEF?8}g;`3^+)#I9lR!TuEsp^VSv=qWX5vpRtRO*h9AfQHgd4?91sEJ-` zofa0CL@#~Rgs>@d_{{o3ynEG?YZ%_*234fsH(;GrYYed{tqLnHj}(_#yB29NNn;wc zKVzkUD2{-iEc%`%Wx%vlS1MCO9?V#of{PsaL^^_q8r~HE+$=^C4+Rt^P03};hb;B7 zlq8jHZiXRp0CVXJ0MOjqNM+fgvrXVkxy1xwh9*c~Tu5dYHALj`Hmr*D3dKb#G`x1uRP*jiF8(} z)}}a|cNh<`L^h_8>RZ{L$6K&79P_b&w$gxUYsEdx!yU0E0o*i|>RQcLue^FMb!fO9 zdKeVaM7r23HAd^1$BQ_t&1tGVjTo8pRZq+ljko~%wg6$u`YXI=|=L>JbmS-^?@&V^2>)IWW;tn z{`#i%x%unl2k2fjF;G9_R)5)7;I)egfa%GpJY@sVyJzL>LBdNQYtxh)EQOQL0GQZ@G2O!H_e43YVl!`+%akJN=AQND4 zS2KWnY49L_eroLTo((4!3@gIXZ^?wbdpeBJVsq1k+bJOuPI(2{zr5c;XRbU_jKP!< z|KP!PQ|3VF>Ea~3wl`ELkwG2WI3uBaG>zz_JL?AzZCq%m3mdiC|8KIOxLvV{e2-Jg zJgoJq2GHC;VKSa^zctUR5GvZnN2h+U@YJibVqlf`+#Ipi=ckZq=?R=LjY6TUWGvBO zeo|?n|LWhqp>_ReD%_T}{-JE=Y!G(leTKcMU^y_g>6RTxxzvskv%jTaPs?1M)Dgp2 zDb~0iQ_A+Y0;kL|!j5!QCki!glz$cZnij|3)nHk+ZDdUK#1X$+{}Iprv@8V+)7r_) z#XugPOH53HEX>-Z{%hcSfN7?#hb&)iLujv*Ez8F#yG%kMd9sR6&os;8p9tmI4I!Zi z)O4Xhq{Z14pvCgr$J_N*u%($D<-a$)oJq+0sG!W;97%O8|K;hQi2Vt--+ZTSOrA^I zeODsN#7F|t0;A&TAcHlsv50<4SjmxFuer{r`Yn~7csSO0GLG{edBA_%?QuQ3Co3G~ zo@8K0S+fnJ#Uz90TG^_H(T{AaW|T#=F}CNX??d+|$FJL0@Fx`4=SK~df>oyq+m<(? z6KJEo;z;^YO01Yi?5|;Ef*XcR=-Y1R1F23UU2oqHS~halir+uI41D<+o)*%P3X%nX zStys^xmlaF)ij44+KtP%ZL5wf+2NYHP2704WKOrz6B|x^`ZQI=Mg@I~r!2VFRw?@?kGv20-8NwQ06x{%US<_H9HgA3(VB$cD4=Nc zvG(BLoqCfn^-JesA&80hmar%#R*f;ny2dWYeG<} zq;LDmP=rFT7D`*>fX?ejn@AAKB^Z4QW<#Z-el2@)^20N62D4riN1#lt6S7$H>?OaY z&VIy;1CmgUHe4&a6m8gE4=6KfkgDT8i8@nX@`E3{w?8b$$@B16^`FjkslrrT3p!6#1C98jo{&EQTA&`V3b zXC*_YCK-pEMKaO)2i2>9Sa-G5n5xOCi-EH$r{&9&xs%=y;4xNh2orjMH^VeE%mgl} z2EdW)3v9JvR>2Nh6thfc9Ys*9f7+3<5fl61MIA*W5o+INxCVkjOi0~ z%sa3xGCDEEF!dV=NQ+6w4Fv@I=UTmFGRGX><*-a)+f$(s*O-`CkTC`SD>?Cu%*MRP zHCspxkwY^Qhd>%r3Rz+HClZim4-XRy20w)+u=SB|3k!_j$`&5*n5-V{0mFP& ze+nvKnBJAbnZ65Og-5>#wFOqg$SUe5>5Dyxx`j6JhW||7@M_f4&^36<;MhfuCptJM zQ}}E{KD^n$-EPEswUbsaD^8h36HLP4vlL37AMO*`I`Q?MJTFCPy)vVU4`6_JvBp#p z5-Jb48`-gQGt)T~c^}((Ds{~cHwEd$)8OHoL@Q<*R3YzX$PfLY2@g$y%U`wwZy?RHWPy zRu(3qG-!y7a&243I+2ig9T|sjh=HLDO;Gu2)2U}@c@ZZN(Fs?H0ls;P%b1yC^0SY; zfitA4!=ezj-CHoYR5&N#Ge=5&(>BHk*6*ErwfNjv_|8;2T(dGB?%ux{Xs z8*CDl;z%T8|3m#}0`UHeMoJ@zU4 zt}7D184pk78NS}XxsXVBgLo?D#Q9c;pb<-EGS|lhJI_i}0}drnL0LGs{-a%iu(13$ zsOFERtn)qx$`7dKMoLYK30NRuoh-dIQIw@)SsfuA&k{N@O|dYP=<=>-+Ybm$+S!c~ z6WXQ|=Z741>4dryfh}^W?b-OewLrtmyH6!TsbdJ#!13zat&>8< zU+i1h>{*UYrpN=-aVcjkR3|hH4*c@O8xLD6vQ!#b&&a=}Dr)VAmdqaX%MGU7o?JzA)n~ zd$zvRLglhnWSIA+yQw4XuI(~AU`Nt&WYFbE383m5*R>Qy?$?jNVNp)vV1^)yzA7G_*KI@6G z!9sM$@ZH?o*^&04>Rm9ieE+M>yVQLf0Vw$D%!`hTG(znqH#5kQ#3m)^dV|UdJ~GZy zN!{=4A{p_RsXWg+R0(Z^sr?LzS_PT*@N(j>#%G?GHkn`6Na%W@Z*#G?qmXa_F#FBK zV^Yknp~IKsc)~Zd)QV3YEeW?B~9DmD&d=#%V{ZnfWMV}p4fZI1yyv@#j56T zO!ALgG{QII^eH*szgWG4D3aVal7x^^|IDrh0ZAIyl7q`~c0{|+MnL)y0l?QQuq)C< zB9ScZY(F&FSEJ4eeApZ3atK*V{JaK>Q7h6gF&G;={{7lw;YJ3?qgEpp3i9FkVxYf4 z4){pogAfQB%>08$^TDqj|7@!ogionXD)HbO)aP81!D9e5c0Se*ooHyK8^k0HbVBlI zP@n(@kOI9#C5e_~27rLVb;)scSRKfxDOA$;U?1ziw+BN@B8}!k{wtU3s~i*yKZu)s4%e$$1uqs-dgw!+ZIovUqytiiA7R>oz3*< zi_ixz=jDn%aT|0G7U((NSu?`dlh#lLxvd7Y*VO*J0t(B)^6{(xwHHKk-Vtc$C>Ev1 zhkQ|nm@pI))JgO~EOBCVx5^$qnWrZCpK01CoNIm%WP@L(mOmV`EBwN@6lxl$iU7io zY7IYzShtgmvKfIfFJsi?k(b15)@Vd@5={)wGEE}WldrGMkN<7;lv5L=qJ5*^|MUE-k`6E(7Z2+>bD`G@~Y)3K?d5Z!yviExj zmB{qWe*em~K~`Z{QgiFmUo3%dSAE&UDy~3u6*0AD3xrgON-}POS34P1lM+s>Gtd~+ zOhoH`q`OOZtylshhKd?bQ{k)tRM+yLlz9PC9{|bHIyO7i2U3f9y^R9GZPj`)rvnQ|Idun#&xRtwhUs507N57;oDJcv$zG~Ta(q^n=@RtIKwD5f_!9Zz_N z6_zN{ij8nF%o(0O1&+MH(D_)c=_)}-tDMo4VB)j-C2;A1@A!!876Tdj#3!{ZYa1?o zDymTsnxZjm{ceWF(?k!rCxva+uM0h%H)8PF*L~Z};XcIW1dKF` zhIyxfq9Ap$U2xUV&+O5VFj)Az47W(+g&-p=XuzOMvK{K+=bfg@&;E5a;8e&gySA`T z7N;rD6x}VzGgSFLk5I-?CVNn4^ZXl}0UV`J%EL?pi;R9#sM^c-Efg^ad9zZN-xdnI z#2r~XBv!zmkOvhm#uyGZ6f1QD4Im_9x>Gg5&bTz%;-M&VWY``Id8X4 z`Q=g@Z)@JM@g;$wDl9z@!x!rAm=`dTqdB5nf6m3k=7e4iIS@#ZKCgwq?~N|2Lsis0 zhpoT8M4aynT7|~s;AD7E#A9yh4AtK!BLK&6`Af=W~m)jtml6SazKX*q&tf{H#*S(Z(+_ZuisQCnJ zY<^;97KwrU2kXa~v|EM-%EiH!gbYFr7)q0OUSL8By?#aK8D|}o()M+tZJg?bwlwEL zL$E7o%!$Bv(8c=V|4j=WfvfGAHb@CLY5Kf4Thc}$eGX0-JGpduc*7yvrE{HhWYI%% zC~J{g^uyAVmlTx1BQy<0J*?eCGWi*ZNk{*?ZXZ2acL{0)pyrbG zYZ@<55-l$zm33l$bGgV|Bk;T46n*M?Qe%MtqS+=hp+?W9P@kuv{THQ10#_ATIjvzf zTZysDr9*CFL=8h%b>x}8C#B1^vfayz&OX@?cn^6!OM7R!_j>P;GuSVi`WPT*D2a!-Ui>J3&aDPwkkdR@i}SJ`ZN)M)fIs7Jaa6)L z)6g#c!-n{eiAp~@giq%=u5(8{4Q#h9mKl+2$755=?{TzDv#O3+El>45_}I^x#=NA7 zqc3n7oea>sTL_Cu^jNUEAA&l0&vV5)&HGpU3q7b`|lrkIgn57#yBiz$~aX0ysU-Yyl)2 z9QYLPY-d=>km781!SP!%p8yiuG$}$}%Y7u3B?p?zv4!1Vz~OXhD*q?>YL#p1eJ|2c zH3X)MYg(I(*S)viyKz`!3qcwb0>h*%y$VaGy%Q<{FGI9T%ba!&K`t(R!Hs+WidDt( z9^A{?DAz|76G3jaDR3?=MpzHJ#6GRJm(OoQ(VCp1?X!aHnupU}_*$x$Dh4l4JZ6hm zgO}!Nj&~1Fd}F4R+fOV*)S!*=!)`tnH2A&7&z*@T#x-9dlUAPTo`sL!I&i@ zr05{iFDFd0vCguoGh4YfYKrHYOwF(AQlm4Pr$?T5+AJ^0nLBn(tryVTrUPOt*l+17 zR`GI>2g<4Lm)Rf47&QjlT|FCWHkbcg$_-9kqz?Vk5M-$K>q4oeBZ#00&N z$3BZRNd_Hr_jb&QD+yyo@e^+{)wFzDvZ_1it!UnYYq{N?=fG>lihg~U&gKZe?}S$C zS{3BB8NJL=FPFjsJC0+UhH}O|U}>A4fU^cVfrYMRu99A0RB5W7G3sCUhrMw3Jv|Uy zRY%hRhSvGFMu*dBX-D-vJzJ3+DpLr09>wees!ia!9I}BTp}6~5lpJ6LAS!b;#(k#$ zD_EqYc25rL-a3RBEr*7#*O7wiV;A4+5ORz>cZwDG>ZSGNwM)KcOtjks0)LE~&^_t5 zt}9ugAz#CsE|hsvav@}j4V%b`l13umCjHP^!aJ#v3PoFlgwyxKDWggCjQ$>G&JC#- z9BX){2?zzUJD6Dv(9g}mA(h(VYM)Uj>&YpN-2#eeI-od1_ZlVmn2hhW z9J%1*G+Gjh&mRe1hSmQ`gz^EW91HUIS{dPKbD!vy50i=P>jkh|bKDUin6LLs9Gc+} zP9h{fsk?V&=x)>|FUCiYPwM5@qZx<@S#;235a`G$eJ!IMGL|KiYZcgGj%u zfPzQGh@}?+kk5JS(Q(_$JM}Go>n`+PUXS3vX&FK-N2}=uL5`H53<3OokryPusaR87 z8vB#EQ!!J6Y(xP3Ku4HB1&K9hp~bMvnQLMP=DlC}>7Mnu@*_Q%F5v*b)zL6egOqOD z14;{tuPEv}vO9yxKMD`4)CF-*0GT-Gj-E8SnboT%?gFCjAv1(dXbASyzj)FR+)gkN zVUWxANTEsJ12@+&%(mbYlV%8kYbzx!Ip645M=GTsaBzSU%;4RJ7BN3J^8*76+Bmw` z+#a^B@#X@g9Wd+^xenJkNC5 zuJKvuClc;FINf4YeuP-rL!mbVh~U(}V3flWzrsF*ZIM5}Oo?=M6`cBeJR~2-l;^!gyN+VQ=fG?N=qR~40MJ(R!Nf5Ldlnp}BIE`y_cOXm@~{ z?er~BSd?Cg76G&TE_*29COkZuKcU#5phLBokP4gaYQV1wbYJ7Av{Afr5(C88QA{>n zjHzgs;*#SfkpvVeY|;6TH^Mc2@&$?Ipn7 znZ^Ff44F;~xfNU3S6fR)u+&IeMfk^v)DayLOv8O~(;-uKJ1kfPOu-}7P`oHe@A%ZF z3M>03MycFk{K&tSRMtr-pkjN$(%0IU^r}k?r9{SlSseEwEkl@%NJSKYQ2_yzjybW< zt}JQ6az!ER2_jyAU{ofqscx>%+P8V~V7=Io9V z^nY2}SL{xPiT*3o}{B(z%{RSVX<>a41WLa_uOaK zUIzPvhadlC|MK^fho6J~w9;U-$A=g7xNjW07K#7cK0qsj)5l-Gli3JTRf ze*f|2UL)Q}z#HNK%`Uj(j>81`A+}zxyFj`bu_$9~W@-iE5OH`rC<}*4$@01{lg1sl z&Tx9?qSaQj`?dkADnCbza5BNs8Ek|xYPJ{cN^&plb|lZu_lE=}0t>pOD}*MOm6;kQ zZLfZ`w!U%F)&?d281GX<$dnL&G|nG{ClW9v=udc3s*pY;J77x3HV(H1`K#KXFK!Go zQgr&Jhzraikq3GfBwz-74JVX%du%$t`ryo^_Wt@E&b=+=%Jz`=)D#qQs=9T+V$6a7 zA*>#gW!eLIz}N@Q)M;+UkZKXvhUyfbF#2E5s7-LE-ygZ?CV7rkarQ`RI@CtTP~GKg zE}XlZC7D_hU4V3eeYt_T=3H5bx2`V~fmzv?QF3L=XngHc%sW|I9%Nq&3_@J_pQVVr zu)QVdq}%F#bB{Y!{J)OzYY4v1a~4G|H@@O%VjuN6 z0y?|FhlyU^FqkuX6?){S!FJEm4ACF6I-z;QEK?25@ByX4lumONDohvUf-Yld=cua= z4m=nhmexUC5Mn$_BEf-XhUpHKk5${dHRdE^hij zq9{ibp!J0X_Hj?#Cp)_`ELnejS(N$KD3K^oilFJ3`n+pY(u{`Q=y7YQOHnl^mtZpw z#NHW=69FaG;z=Uq>MYV{4@S!>m81rd(%ejM4%3ANNhx?-GWptDrn%+la^~e2nRLqZ z%-n9j#FCt!#Xx#GDC?;g`GJ?c<^)F5QO;1sio=~K1J1<5Ak>-2!>sG5$<<_qTnelM zPt$s>1H&0y5CirUeC8ZyJD5-X17yPyvo8d0e3sxUuvj9&~9p|AH|C05r$;Y zOJXC12Z0f>)JX_DM2d&$8l=8xDS%P&_s74U7%|)>Gih}ux2Ot4 zLj7NUFS}pE%vwx)U(Ety6F5?0%cOx4+TOMyeK&o>3C&|VfhcGeWj3T73%MzTDHRKG z4Stu(+QubAq@F&X0l*$?Xr_T2vy|$(QF)V73G1T zEPt%FJB5noME~(h7`?q)d%E!$WNLUk<^pmvPbXfFo3J774|55Rc_^-rQKOfP`3))= z)$o4*N;-{tJ-oAa<>sqF{4miqGA8<@y#AH>RYb($MAf7uXefBmGi~(X$yE; zpe@IYe1W?jr{f^$C##*(Y{!CgMFNt_ME_;^T&Zwdmi|@m)5b=$_RUzLP+ld{n-%shQe!!Ab_Z-Ctls!ULQA|+9ceaJ0w?SrOe~wiEkT%wSqW^ zfZ_wRFmQx#srsD9=YT^b!tB!H)pWvaR-Nk$U)}l(Z!aU=-GJdLUSB(2ZJInpL!Kib z7j|o(v2F@28?K-UqDzL`3jr};O4flMEim@%SM_7TSDRHJO{-}>{bvETP^|}b!JFId zzmOl{2dH9~)9@ao5sH85jMryl+R;ul6WN|eU-_@L={QgQwr(Q#&(ta~&v6YpC#2M< z+eofRBcRt%@^Xy4b=+&5@>6BD+2sG-9iT)K9(-lQt~Po1FefF2BnEhX<0nX_w&^AK z*!7^PGx>_lvTR^BiUk?XsMR$oBlvyU1wWdF#dWWibJZvx6m}$?Hy9=}t|Iu=HSm>k6qww5?+=EKh#S9u0Vi(9 z)Lmy%@@Ub(Osu!N4h;Zs!Prl{b_I8rRMtwLK&o(U7i_lclkk}d64ppe<`1DY&k7%pz*djd2i_HciC#z0!&&Ow_%{0Nj2XShhpiG z1RBGuB1)q#QO5~nQA#~&?hI_=p~06xgke@F@;1J_Jd)l>7Az{q85HV}jk3;l1oBw&k>} z3i8x=7jT$g$xo!$$&1zTF-Q8()z?tf$LEhw2ad1pIVZaR-WSoWyS1-5A=v9Ky1(q$ zC8#IPxaCCD<_|yESZkS&5DBE(wCMlUkC8o$@-Je?~mdM#V;C)J2Ef({- zv3)*Yh_#l)5kovG74j%a5P&nUhusC9Q#Cu~l#> zRVn#G0st0~N+bYQKHQr}zIXGRrrQBzh2X{d6xIamg3^N4pO@6>cY$KG{HwbweLrH< zbdV|)T<3-l)2WHH$;%mN3_@jb*0`1g(f3GS;9Q{DILw*_Jjf4Jhv+ z;8GF{IU!vo4kv#1>-iK*jqKVD%(r^O(ZzJY17!EFsx=Y%HVGzrH}UK60y_d-=|qws zuRw6$KN>fN+J(Gq7EO>ZUZQ08H4)lUmOs0{ViAsm^q*gqoe_pc#|T}0Qx6(R7scKFH9R%(>75^WnbtJ@X5Ol8#M;J|6#z0|5 z1Sl#_4%i2|ht_MfMc~YP_L2yzcnHQGQj6dUf;nx*g;sq*s595cjr0v_m#_C0_GBcI znpp3PZPrLaK#O5xxW<;iKT-t1%O>@j7+RsM)UrWupicnLXN8)@_x^kj*;L<*&jVNk zHPI>emt$fUg7k#ra6F%IWYBk@|H~001vLUved^y~&ixDdxNdD9=RP;aqmn~M!fntL zf$koHiEm(fq;To~QnWyRD1JYo1Zcp_seM(jGyvQ9F1rCDv=H~4y;!ESKww;+CrY)3 zqQ?|-Ar1u+^o}~c!^bFFyrM+RSeKdI{#Pu#fIeI=n%Myfshwz?AGw(wN|d#Vh%>NQ zLPV*Lz#hN;iVg#w-X5Pd0~?rnAt^K#Q>snDR;(38)f(PskhTGPg8Rq^PB2cjG*VYU_mbxyQmibedlm1wiH)ZJ zskb2tfH}YT)Rk{MDH~pRCy&9+SJ-*4BY=4a73Q^y$_5G z#=^!CueHkhX7j3Q3q@yDkc~E52?uB*c#@)h(vN`b`~y{ zMBH55|Iztf)qe&NdEhpWe+Cf)BogRXQ#v|ZvxPfO#4SKvm@oSslQsPbv1QW@zrK_U zvPRf8SJ0$y9X(EhllXTJ9B*g5>b#H=3$xTZWyZWDS;)1ZjkTat)DkOO4nkzq$z+Ma z^eAO!%Lp#)QBSyv-^ngjVvAF!$s~wuQ1yrOD8enD)V(%6jP4l3?xAmYP48YWiL-WPR|8Pzz2g zS>yr^@ti%Oy-Idei{t`iOvz0^MSG0jXN^W1lrqr zy?3$ZQvwCcdSUf7i2!*P7=DaGWssX!=6|7E-PHe@%mdm zoP>KUL?G7L%KsMG*~I?NApucg7Y(n{icoq|+}zF@gwTP+#?>GjlE++2OKiG;U-c7T z3SRhQRJmM#{2XG3`eZlR4&$SV3IUd@ksQ79F`_9NE?8>933;pH(CcE(cKqt+wfD10v zpfrC$;IqoIA2I-Gcx?fQr&q zBz`>?Q?e1e{&bP|*|rDctqU2 z(=<|<{?+#0642#!ld$%{O+rTU9j1mSge75%dah&j!?lP9)Bf$^y>h<&>Iuqy1kU4k zxh9Z&YRSF+1~%9gjQrmX7YndI^_nRacoA0R|6f7e7h#bRQ-SG)&_P&P zQu}m7XaP8SKW@Ft%^s1swK9znd*y#6vPrF}>ALF;yq;2bMAz0`)=vWojmIzBm_$;( z7uK5%`0m5|U$GZy!;ppgxd=E=tK zBzY&_+ZyVe;h5J?TfL1IGyY6jYL!Pn4h@+SPS%q7_7(PuPq~%GEezYHZRBY`@t&wp z8wOn%D2A%krE1Fw2uW4#iRQo4y0R2J4#FQmB}qI1zF8$lpS& zmM;(=3w#J40@ii5Lwvt{z}L<0cipH{xB*v&i!%l-m!I$M*O5ac6;~NH2HRah+uTg- zMqR7zn|2cI0vtd&ziUbGrTY_Kpa7DZJSh~ zU>Ro3IfhxbY?AGJYQq9a`xDJ~ib=uNl;+yWN}r@<1?h7T9~bT8vGW&HDJPrN8ns1WS8xTsgDXF3CJS4P9Mdq!kJI;88;)yAMGQ|@`;!e`7L^>n zlG&D+IUhLIH5ayTe*`V_9-9Lfi3JFw4Ju4UARW0R37aw4`}*nX>>q}zDlQzhIwn2$~U=E$6^hBAcNUwJO&Pl;I?dilap-JLQn_Y_f=N zCZ$4O%*Gq}77u$CTms_pTpWOw9q!Od5JeT-ccZMeykqz*hykDr zlSQKH2rxZH@cy$td18_Ec;SOovb!~ERsfeJLII}s-CeQ*B|?#ZLA2#S9gN9mi_^JX zj?Z=tb$GV$$lkQ`M#GSA<+4^S8=P)r8A!D&GH8yj$yZr1l#yYSA`h^SD&Fugjkr!^ZnouVz&b2d@)yP za_o%Ta&Qq2z#W?h&k6Ui94Bv*qAxxsc&tz&zzymVUu9dmVi<4$F4%Hinr$q{u7=Yh zI5S6^3qe|1NaYqA5C@=YFGc!wwjl^L!LZVhX~ZQNsw2`Xm>yDH6~ z;TqQ4hMAw&zi^|qJ@Ud{+syFyGm$?0=?^7hy)Q;+uXsD_GtT*1qRS7 zo|-2uaUFNmJFe2sTbQRkC z5GOoD^A+I2O5{Mg@zJiUV(4_zx>%%MpfHt^hDN1zu7KyI}hzil|6`T$zF2 z1GIbZS|w(^!T%IrCF{DjlP&d9rpbU)&4q)6KY=uX)Pduy&OG0#aYT47Qp`3ndOR~> zpx$pPPLD@GFrTIHBir~eeIks4mI=0Yp|A)p)*cHu77gc-f#=n9h)Ao^Fs|3 zOQZ5_oB&Khz&isWGV6=FXN=RXIzgoPf^l)E_MGdjOzuGQP^A(3X>dL6_vKw8Zl(D? zW4P;KaWD5CXl_?w%kHki)ne75^W3`ZK}HEzyKwlIg<`@l*~KJcH+5!O3S;9sZf8fe z-tr?BLGzK43F!l4|Aq2^7weA;tybV2Z|)R)r~vdmMGY4qLddHVL&w`n}y$-dOPl;u7;JKF#-^9|9DR(iS}I5iZ%`ITq

Ac_*u|r|+ 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

  • J_t3{|*SL*^P5& zgCQ0tFblF#!@|E5U`d5lF{<6*cf#~FM2#Aj=1LYwdczK@{ur^AsY^^?j246e*`dnU z!j2=x@3SUc%hKj$<#xh-r0(Hx=K(=;1Nw1gk(%^|a50P_4D8xm)Fez8x7G%@Y&#dr zyl5*YZBEbmvTFRf*WokKYx>WGTXs0~I-vwBdBn8M}_7EVN*wc$afo_V6LE1X3yRh`(3$Z;nsXcXeyMohm)xAei*G9-3 zP82Pmjyd7)z`7I|Qj%TM>-^;+~Q~mtwcj<}kTsz{%0C%MO_p#JUAIV4K#%QUC~e zv8?RzDGA0qJH=qles+U?XzkCdfqK6_)W;m!2S60plv4qSURI$`6p+ZTn^=%kKZD($ zDu*V?PYe+t7x~C7q2H#*>za66&oUH=N5sdB=-Pie=vX{|21X?mEUf{kFxT%M*wHw{ z)@x}BD<*#~jX$9K4#a-}j?A|vXqXRTpKZzwskpdt7BA9~_Cddw)bk}Jq5s@q&AS9d zXTlVAm$LLBcocgL`IYt8BQpyQl$>~?kxl3SY69r|IO1_zff5Z?v@&q%H)TQOPrFm zPU`V7PJf|5c+2^g*cy9tc$P{;2ekLR2u*dsG5?naN!|R5jh@N{FF_AvYmFsrjG}Zs zY5XyFkwpWu?qfwHGL1c$6^ixS+fSZoayM%wQrwA7ZZ|`(~~DE zjPdaUxt~Y242Z6_I~OP=|CWYDl6!1Iw};JdLTUXbQ%n2fh~)zl`TW^3l6&>}>GAZY z2L``K3~K{=rxkZ_ttJlC3T*j4Ga$M#KRF}+Xdex-$mb_%im9XtgXuqEbk_EteyK}dhQ-_w@N=|Dw-WkMg$YfJv zP_)4+CrW79DB38}L@>;}K_N}x;&|MB7P?%kz|+37)<3f2&3FK8d!6}K`394pP;>Qez7Z;$gg?Xj-jJxW@wADcB9G^_iL zNh7qY{z#ftnypW@q0+9a2J$5dgC1=&uFw9J^|Q$vWHW3}_^r-8r!U^L?ua^+otsp< z>6sV$VHr@d>CZreX#FWo^S-nFcEFbTqY7`VOG;oT`6gB|=+1aPY2;dZzUpp(SQ+M< zx~%KoQT%kkgBYX^W&Tpm#ZP_M3 zW}gI3k^uA^H~xEdMMQ=q&cPCYRVi%a@cNgE!gZ}|-yGo64GlPKc4WQ4M~vMU_Ni3b zTtP9%MmN;jxXIp}%-gKN*KuX%jdeQ)(vV}Deg1*<3q*Tn!&WcZrP7L@jy57q)SS6v zs^GWH@eH&M35mGX^$sLT;83BIDoivUvY4elru@MP5gKm7mv`0p=TPSsA?q_t0x-&* zg%g!CI|tCz<-IR?@N63#EN?Pz=l=K)e&eL7Fu5W-cf)BFh!Dwcw=Z%%s~UZ2!;RtJ z>Zj~~brng;R8Mm2bAzA3lqe6gX!{-83&o2_q=c4?MN%u-3!ZrGa9hRFv^!rf*l1aU z2*H0dTh`T{lZjfIM5eVxppf^}c1+wc<%CA$(+z|nUlabkh<4tTP%?*C2++!>Hh*zR zu7Kj2Ymt4(8kCTZ6?_3Nt+8#r^uXNY>scdok(o~tO8=VG{Uius5R>7x+hh*c6SE>5 zvYxD0aKx_}GY}K!wQi+tEyCv*mt(ZI!Cw<&%0Act`(7t|AKl3X1EzV9*qOGgifK}M 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°`v)f@ELF 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

    bQ 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

    j;F&rMIJPkkF(iut1Xy`gYR*LmTF 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į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%0D7UoVqu*U==^PUTd}p}&_ha>KC8gKwhGKxk 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

    Klg%{e;cBl5?0;8Xk6|8 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

  • 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%0D$G~!z2m}x0#3g!ta?aK;f}Y@L#DUFs+yA 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 kw4^R{=|yN_-MZ|$hN{yr3Qo4Pi?x=c`U^P4y| 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,n2~Va7eO^Dv1Z64Cahre1_!Z;!Xsh3y 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 L64|Ezl@*pE@g4wJdO87A}oTNa3}531G1a5YrB& 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�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�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 L^z;vu9%B6;=DK%s From 83e0c06a3e01129ada307d98b41703839eaf2262 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 10 Feb 2025 15:43:33 +1100 Subject: [PATCH 063/102] Remove using namespace std and boost --- .../dynadjust/dnaadjust/dnaadjust-multi.cpp | 106 +- .../dynadjust/dnaadjust/dnaadjust-stage.cpp | 54 +- dynadjust/dynadjust/dnaadjust/dnaadjust.cpp | 1770 +++++++++-------- dynadjust/dynadjust/dnaadjust/dnaadjust.hpp | 86 +- .../dnaadjustwrapper/dnaadjustprogress.cpp | 102 +- .../dnaadjustwrapper/dnaadjustprogress.hpp | 16 +- .../dnaadjustwrapper/dnaadjustwrapper.cpp | 590 +++--- .../dnaadjustwrapper/dnaadjustwrapper.hpp | 7 - .../dnageoid/bicubic_interpolation.hpp | 2 - dynadjust/dynadjust/dnageoid/dnageoid.cpp | 477 +++-- dynadjust/dynadjust/dnageoid/dnageoid.hpp | 26 +- dynadjust/dynadjust/dnageoidint/FileProc.cpp | 2 +- dynadjust/dynadjust/dnageoidint/FileProc.h | 2 - .../dynadjust/dnageoidint/dnageoidintDlg.cpp | 28 +- dynadjust/dynadjust/dnageoidint/precompile.h | 6 - dynadjust/dynadjust/dnageoidint/stdafx.h | 6 - .../dnageoidwrapper/dnageoidwrapper.cpp | 598 +++--- .../dnageoidwrapper/dnageoidwrapper.hpp | 17 +- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 1036 +++++----- dynadjust/dynadjust/dnaimport/dnainterop.hpp | 188 +- .../dynadjust/dnaimport/dnaparser_pimpl.cxx | 75 +- .../dynadjust/dnaimport/dnaparser_pimpl.hxx | 50 +- .../dynadjust/dnaimport/dnaparser_pskel.cxx | 9 +- .../dynadjust/dnaimport/dnaparser_pskel.hxx | 50 +- .../dnaimportwrapper/dnaimportwrapper.cpp | 1324 ++++++------ .../dnaimportwrapper/dnaimportwrapper.hpp | 46 +- dynadjust/dynadjust/dnaplot/dnaplot.cpp | 1140 +++++------ dynadjust/dynadjust/dnaplot/dnaplot.hpp | 89 +- .../dnaplotwrapper/dnaplotwrapper.cpp | 446 ++--- .../dnaplotwrapper/dnaplotwrapper.hpp | 7 - dynadjust/dynadjust/dnareftran/dnareftran.cpp | 571 +++--- dynadjust/dynadjust/dnareftran/dnareftran.hpp | 39 +- .../dnareftranwrapper/dnareftranwrapper.cpp | 438 ++-- .../dnareftranwrapper/dnareftranwrapper.hpp | 10 - dynadjust/dynadjust/dnasegment/dnasegment.cpp | 224 +-- dynadjust/dynadjust/dnasegment/dnasegment.hpp | 25 +- .../dnasegmentwrapper/dnasegmentwrapper.cpp | 258 +-- .../dnasegmentwrapper/dnasegmentwrapper.hpp | 49 +- dynadjust/dynadjust/driver/driver.cpp | 110 +- dynadjust/dynadjust/dynadjust/dynadjust.cpp | 152 +- dynadjust/dynadjust/metadata/metadata.cpp | 282 ++- dynadjust/include/config/dnaconsts.hpp | 6 +- dynadjust/include/config/dnaoptions.hpp | 172 +- dynadjust/include/config/dnaprojectfile.cpp | 832 ++++---- dynadjust/include/config/dnaprojectfile.hpp | 41 +- dynadjust/include/config/dnatypes.hpp | 140 +- .../include/config/dnaversion-stream.hpp | 6 +- dynadjust/include/config/dnaversion.hpp | 2 +- dynadjust/include/exception/dnaexception.hpp | 33 +- .../include/functions/dnafilepathfuncs.hpp | 8 +- .../functions/dnaintegermanipfuncs.hpp | 11 +- .../include/functions/dnaiostreamfuncs.hpp | 80 +- .../include/functions/dnaparallelfuncs.hpp | 3 - .../include/functions/dnaprocessfuncs.cpp | 4 +- .../include/functions/dnaprocessfuncs.hpp | 13 +- .../include/functions/dnastringfuncs.cpp | 78 +- .../include/functions/dnastringfuncs.hpp | 22 +- .../include/functions/dnastrmanipfuncs.hpp | 117 +- .../functions/dnatemplatecalcfuncs.hpp | 3 - .../functions/dnatemplatedatetimefuncs.hpp | 223 +-- .../include/functions/dnatemplatefuncs.hpp | 213 +- .../functions/dnatemplategeodesyfuncs.hpp | 13 +- .../functions/dnatemplatematrixfuncs.hpp | 9 +- .../include/functions/dnatemplatematrixio.hpp | 3 - .../functions/dnatemplatestnmsrfuncs.hpp | 72 +- .../include/functions/dnatransparamfuncs.hpp | 83 +- dynadjust/include/ide/trace.cpp | 4 + dynadjust/include/io/dnaioadj.cpp | 40 +- dynadjust/include/io/dnaioadj.hpp | 6 +- dynadjust/include/io/dnaioaml.cpp | 156 +- dynadjust/include/io/dnaioaml.hpp | 8 +- dynadjust/include/io/dnaioasl.cpp | 98 +- dynadjust/include/io/dnaioasl.hpp | 6 +- dynadjust/include/io/dnaiobase.cpp | 10 +- dynadjust/include/io/dnaiobase.hpp | 12 +- dynadjust/include/io/dnaiobms.cpp | 112 +- dynadjust/include/io/dnaiobms.hpp | 8 +- dynadjust/include/io/dnaiobst.cpp | 114 +- dynadjust/include/io/dnaiobst.hpp | 8 +- dynadjust/include/io/dnaiodna.cpp | 174 +- dynadjust/include/io/dnaiodna.hpp | 66 +- dynadjust/include/io/dnaiodnatypes.hpp | 25 +- dynadjust/include/io/dnaiomap.cpp | 132 +- dynadjust/include/io/dnaiomap.hpp | 8 +- dynadjust/include/io/dnaiopdf.cpp | 17 +- dynadjust/include/io/dnaiopdf.hpp | 11 +- dynadjust/include/io/dnaioscalar.cpp | 52 +- dynadjust/include/io/dnaioscalar.hpp | 2 +- dynadjust/include/io/dnaioseg.cpp | 258 +-- dynadjust/include/io/dnaioseg.hpp | 18 +- dynadjust/include/io/dnaiosnx.hpp | 42 +- dynadjust/include/io/dnaiosnxread.cpp | 274 +-- dynadjust/include/io/dnaiosnxwrite.cpp | 192 +- dynadjust/include/io/dnaiotbu.cpp | 108 +- dynadjust/include/io/dnaiotbu.hpp | 19 +- dynadjust/include/io/dnaiotpb.cpp | 66 +- dynadjust/include/io/dnaiotpb.hpp | 18 +- dynadjust/include/io/pdfdde.cpp | 4 + .../include/math/dnamatrix_contiguous.cpp | 358 ++-- .../include/math/dnamatrix_contiguous.hpp | 20 +- .../include/measurement_types/dnaangle.cpp | 68 +- .../include/measurement_types/dnaangle.hpp | 22 +- .../measurement_types/dnacoordinate.cpp | 64 +- .../measurement_types/dnacoordinate.hpp | 10 +- .../measurement_types/dnadirection.cpp | 142 +- .../measurement_types/dnadirection.hpp | 24 +- .../measurement_types/dnadirectionset.cpp | 90 +- .../measurement_types/dnadirectionset.hpp | 25 +- .../include/measurement_types/dnadistance.cpp | 76 +- .../include/measurement_types/dnadistance.hpp | 20 +- .../measurement_types/dnageometries.hpp | 3 - .../measurement_types/dnagpsbaseline.cpp | 230 +-- .../measurement_types/dnagpsbaseline.hpp | 98 +- .../include/measurement_types/dnagpspoint.cpp | 228 +-- .../include/measurement_types/dnagpspoint.hpp | 98 +- .../include/measurement_types/dnaheight.cpp | 62 +- .../include/measurement_types/dnaheight.hpp | 10 +- .../measurement_types/dnaheightdifference.cpp | 64 +- .../measurement_types/dnaheightdifference.hpp | 16 +- .../measurement_types/dnameasurement.cpp | 88 +- .../measurement_types/dnameasurement.hpp | 205 +- .../include/measurement_types/dnamsrtally.cpp | 162 +- .../include/measurement_types/dnastation.cpp | 209 +- .../include/measurement_types/dnastation.hpp | 110 +- .../include/measurement_types/dnastntally.cpp | 60 +- .../include/measurement_types/dnastntally.hpp | 8 +- dynadjust/include/memory/dnafile_mapping.cpp | 16 +- dynadjust/include/memory/dnafile_mapping.hpp | 20 +- .../include/memory/dnamemory_handler.hpp | 20 +- .../memory/managed_mapped_file_test.cpp | 2 - dynadjust/include/parameters/dnadatum.cpp | 42 +- dynadjust/include/parameters/dnadatum.hpp | 35 +- .../parameters/dnadatumprojectionparam.hpp | 2 - dynadjust/include/parameters/dnaellipsoid.cpp | 2 +- dynadjust/include/parameters/dnaellipsoid.hpp | 4 +- dynadjust/include/parameters/dnaepsg.hpp | 163 +- .../parameters/dnaframesubstitutions.hpp | 94 +- .../parameters/dnaplatemotionmodels.hpp | 3 - .../include/parameters/dnaprojection.hpp | 2 - .../dnatransformationparameters.hpp | 7 +- dynadjust/include/thread/dnathreading.hpp | 35 +- 141 files changed, 8759 insertions(+), 9026 deletions(-) diff --git a/dynadjust/dynadjust/dnaadjust/dnaadjust-multi.cpp b/dynadjust/dynadjust/dnaadjust/dnaadjust-multi.cpp index b0aaec4a..aad0b4dd 100644 --- a/dynadjust/dynadjust/dnaadjust/dnaadjust-multi.cpp +++ b/dynadjust/dynadjust/dnaadjust/dnaadjust-multi.cpp @@ -34,7 +34,7 @@ extern boost::exception_ptr rev_error; extern boost::exception_ptr cmb_error; extern boost::exception_ptr prep_error; -bool combineAdjustmentExceptionThrown(const vector& cmb_errors_) +bool combineAdjustmentExceptionThrown(const std::vector& cmb_errors_) { // got a forward or reverse exception, or // have any of the other combination adjustments failed? @@ -58,7 +58,7 @@ bool combineAdjustmentExceptionThrown(const vector& cmb_er return false; } -bool prepareAdjustmentExceptionThrown(const vector& prep_errors_) +bool prepareAdjustmentExceptionThrown(const std::vector& prep_errors_) { // have any of the other combination adjustments failed? UINT32 err_size(static_cast(prep_errors_.size())); @@ -94,19 +94,19 @@ void dna_adjust::AdjustPhasedMultiThread() { initialiseIteration(); - string corr_msg; - ostringstream ss; + std::string corr_msg; + std::ostringstream ss; UINT32 i; bool iterate(true); - milliseconds iteration_time(milliseconds(0)); - cpu_timer it_time, tot_time; + boost::posix_time::milliseconds iteration_time(boost::posix_time::milliseconds(0)); + boost::timer::cpu_timer it_time, tot_time; #if defined(__ICC) || defined(__INTEL_COMPILER) // Intel compiler boost::shared_ptr f, r, c; - vector< boost::shared_ptr > mt_adjust_threads_sp; + std::vector< boost::shared_ptr > mt_adjust_threads_sp; #else - vector mt_adjust_threads; + std::vector mt_adjust_threads; #endif concurrentAdjustments.resize_runs(blockCount_); @@ -170,7 +170,7 @@ void dna_adjust::AdjustPhasedMultiThread() for_each(mt_adjust_threads.begin(), mt_adjust_threads.end(), boost::mem_fn(&boost::thread::join)); #endif // This point is reached when the threads have finished - iteration_time = milliseconds(it_time.elapsed().wall/MILLI_TO_NANO); + iteration_time = boost::posix_time::milliseconds(it_time.elapsed().wall/MILLI_TO_NANO); //delete mt_adjust_threads; #if defined(__ICC) || defined(__INTEL_COMPILER) // Intel compiler @@ -197,15 +197,15 @@ void dna_adjust::AdjustPhasedMultiThread() break; ss.str(""); - if (iteration_time > seconds(1)) - ss << seconds(static_cast(iteration_time.total_seconds())); + if (iteration_time > boost::posix_time::seconds(1)) + ss << boost::posix_time::seconds(static_cast(iteration_time.total_seconds())); else ss << iteration_time; /////////////////////////////////// // protected write to adj file (not needed here since write to // adj file at this stage is via single thread - adj_file << setw(PRINT_VAR_PAD) << left << "Elapsed time" << ss.str() << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Elapsed time" << ss.str() << std::endl; OutputLargestCorrection(corr_msg); /////////////////////////////////// @@ -277,7 +277,7 @@ void dna_adjust::SolveMTTry(bool COMPUTE_INVERSE, const UINT32& block) try { SolveMT(COMPUTE_INVERSE, block); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { // could not invert matrix. throw error @@ -286,12 +286,12 @@ void dna_adjust::SolveMTTry(bool COMPUTE_INVERSE, const UINT32& block) #endif if (projectSettings_.g.verbose) { - debug_file << "Block " << block + 1 << " (reverse, multi-thread)" << endl; - debug_file << "Pre-adjustment Estimates" << fixed << setprecision(16) << v_estimatedStationsR_.at(block); - debug_file << "Design" << fixed << setprecision(16) << v_designR_.at(block); - debug_file << "Measurements" << fixed << setprecision(16) << v_measMinusCompR_.at(block); - debug_file << "At * V-inv" << fixed << setprecision(16) << v_AtVinvR_.at(block); - debug_file << "Normals " << fixed << setprecision(16) << v_normalsR_.at(block) << endl; + debug_file << "Block " << block + 1 << " (reverse, multi-thread)" << std::endl; + debug_file << "Pre-adjustment Estimates" << std::fixed << std::setprecision(16) << v_estimatedStationsR_.at(block); + debug_file << "Design" << std::fixed << std::setprecision(16) << v_designR_.at(block); + debug_file << "Measurements" << std::fixed << std::setprecision(16) << v_measMinusCompR_.at(block); + debug_file << "At * V-inv" << std::fixed << std::setprecision(16) << v_AtVinvR_.at(block); + debug_file << "Normals " << std::fixed << std::setprecision(16) << v_normalsR_.at(block) << std::endl; debug_file.flush(); } #ifdef _MS_COMPILER_ @@ -344,29 +344,29 @@ void dna_adjust::SolveMT(bool COMPUTE_INVERSE, const UINT32& block) break; } - debug_file << endl; + debug_file << std::endl; debug_file << "Block " << block + 1 << " (Reverse)"; - debug_file << endl; - debug_file << "Pre-adjustment Estimates" << fixed << setprecision(16) << v_estimatedStationsR_.at(block); + debug_file << std::endl; + debug_file << "Pre-adjustment Estimates" << std::fixed << std::setprecision(16) << v_estimatedStationsR_.at(block); debug_file << "Block " << block + 1 << " (Reverse)"; - debug_file << endl; - debug_file << "Design" << fixed << setprecision(16) << v_designR_.at(block); + debug_file << std::endl; + debug_file << "Design" << std::fixed << std::setprecision(16) << v_designR_.at(block); debug_file << "Block " << block + 1 << " (Reverse)"; - debug_file << endl; - debug_file << "Measurements" << fixed << setprecision(16) << v_measMinusCompR_.at(block); + debug_file << std::endl; + debug_file << "Measurements" << std::fixed << std::setprecision(16) << v_measMinusCompR_.at(block); debug_file << "Block " << block + 1 << " (Reverse)"; - debug_file << endl; - debug_file << "At * V-inv" << fixed << setprecision(16) << v_AtVinvR_.at(block) << endl; + debug_file << std::endl; + debug_file << "At * V-inv" << std::fixed << std::setprecision(16) << v_AtVinvR_.at(block) << std::endl; debug_file << "Block " << block + 1 << " (Reverse)"; - debug_file << endl; - debug_file << "Normals " << fixed << setprecision(16) << v_normalsR_.at(block) << endl; + debug_file << std::endl; + debug_file << "Normals " << std::fixed << std::setprecision(16) << v_normalsR_.at(block) << std::endl; debug_file << "Block " << block + 1 << " (Reverse)"; - debug_file << endl; - debug_file << "Precisions" << fixed << setprecision(16) << v_normalsR_.at(block) << endl; + debug_file << std::endl; + debug_file << "Precisions" << std::fixed << std::setprecision(16) << v_normalsR_.at(block) << std::endl; debug_file << "Block " << block + 1 << " (Reverse)"; - debug_file << endl; - debug_file << "Corrections" << fixed << setprecision(16) << v_correctionsR_.at(block) << endl; + debug_file << std::endl; + debug_file << "Corrections" << std::fixed << std::setprecision(16) << v_correctionsR_.at(block) << std::endl; debug_file.flush(); dbg_file_mutex.unlock(); @@ -381,7 +381,7 @@ void dna_adjust::SolveMT(bool COMPUTE_INVERSE, const UINT32& block) void adjust_forward_thread::operator()() { - stringstream ss; + std::stringstream ss; UINT32 currentBlock; concurrentAdjustments.forward_run_started(); @@ -396,7 +396,7 @@ void adjust_forward_thread::operator()() return; //ss.str(""); - //ss << "1> Adjusted block " << currentBlock + 1 << " (forward, in isolation)... " << endl; + //ss << "1> Adjusted block " << currentBlock + 1 << " (forward, in isolation)... " << std::endl; //main_adj_->ThreadSafeWritetoAdjFile(ss.str()); // Check if an exception was thrown in the reverse or combine threads @@ -422,7 +422,7 @@ void adjust_forward_thread::operator()() ///////////////////////////////////// //// protected write to adj file //ss.str(""); - //ss << "1> Forward adjustment (in isolation) of block " << currentBlock + 1 << " complete." << endl; + //ss << "1> Forward adjustment (in isolation) of block " << currentBlock + 1 << " complete." << std::endl; //adj_file_mutex.lock(); //main_adj_->ThreadSafeWritetoAdjFile(ss.str()); @@ -453,7 +453,7 @@ void adjust_forward_thread::operator()() /////////////////////////////////// // protected write to adj file //ss.str(""); - //ss << "1> Forward adjustment of block " << currentBlock << " complete." << endl; + //ss << "1> Forward adjustment of block " << currentBlock << " complete." << std::endl; //main_adj_->ThreadSafeWritetoAdjFile(ss.str()); /////////////////////////////////// @@ -482,7 +482,7 @@ void adjust_forward_thread::operator()() // notify all threads waiting on combineAdjustmentQueue //combineAdjustmentQueue.notify_all(); - //this_thread::sleep(milliseconds(10)); + //this_thread::sleep(boost::posix_time::milliseconds(10)); // notify all threads waiting on combineAdjustmentQueue //combineAdjustmentQueue.notify_all(); @@ -491,7 +491,7 @@ void adjust_forward_thread::operator()() void adjust_reverse_thread::operator()() { - stringstream ss; + std::stringstream ss; UINT32 currentBlock(main_adj_->blockCount_-1), block; concurrentAdjustments.reverse_run_started(); @@ -516,7 +516,7 @@ void adjust_reverse_thread::operator()() ///////////////////////////////////// //// protected write to adj file //ss.str(""); - //ss << "2> Adjusted block " << currentBlock + 1 << " (reverse, in isolation)... " << endl; + //ss << "2> Adjusted block " << currentBlock + 1 << " (reverse, in isolation)... " << std::endl; //main_adj_->ThreadSafeWritetoAdjFile(ss.str()); ///////////////////////////////////// @@ -543,7 +543,7 @@ void adjust_reverse_thread::operator()() ///////////////////////////////////// //// protected write to adj file //ss.str(""); - //ss << "2> Reverse adjustment (in isolation) of block " << currentBlock + 1 << " complete." << endl; + //ss << "2> Reverse adjustment (in isolation) of block " << currentBlock + 1 << " complete." << std::endl; //adj_file_mutex.lock(); //main_adj_->ThreadSafeWritetoAdjFile(ss.str()); @@ -583,7 +583,7 @@ void adjust_reverse_thread::operator()() /////////////////////////////////// // protected write to adj file //ss.str(""); - //ss << "2> Reverse adjustment of block " << currentBlock << " complete." << endl; + //ss << "2> Reverse adjustment of block " << currentBlock << " complete." << std::endl; //main_adj_->ThreadSafeWritetoAdjFile(ss.str()); /////////////////////////////////// @@ -609,7 +609,7 @@ void adjust_reverse_thread::operator()() void adjust_process_combine_thread::operator()() { - stringstream ss; + std::stringstream ss; UINT32 pseudomsrJSLCount; UINT32 currentBlock; @@ -629,7 +629,7 @@ void adjust_process_combine_thread::operator()() // Wait here until blocks have been placed on the queue if (!combineAdjustmentQueue.front_and_pop(currentBlock)) { - boost::this_thread::sleep(milliseconds(2)); + boost::this_thread::sleep(boost::posix_time::milliseconds(2)); continue; } @@ -675,15 +675,15 @@ void adjust_combine_thread::operator()() UINT32 thread_id, cores(boost::thread::hardware_concurrency()); // Set up exception pointers - vector cmb_errors; + std::vector cmb_errors; cmb_errors.resize(cores); // Create the thread pool #if defined(__ICC) || defined(__INTEL_COMPILER) // Intel compiler boost::shared_ptr c; - vector< boost::shared_ptr > mt_combine_threads_sp; + std::vector< boost::shared_ptr > mt_combine_threads_sp; #else - vector mt_combine_threads; + std::vector mt_combine_threads; #endif for (thread_id=0; thread_id prep_errors; + std::vector prep_errors; prep_errors.resize(cores); // Create the thread pool #if defined(__ICC) || defined(__INTEL_COMPILER) // Intel compiler boost::shared_ptr p; - vector< boost::shared_ptr > mt_prepare_threads_sp; + std::vector< boost::shared_ptr > mt_prepare_threads_sp; #else - vector mt_prepare_threads; + std::vector mt_prepare_threads; #endif diff --git a/dynadjust/dynadjust/dnaadjust/dnaadjust-stage.cpp b/dynadjust/dynadjust/dnaadjust/dnaadjust-stage.cpp index d950f4f2..f0cf79d7 100644 --- a/dynadjust/dynadjust/dnaadjust/dnaadjust-stage.cpp +++ b/dynadjust/dynadjust/dnaadjust/dnaadjust-stage.cpp @@ -46,15 +46,15 @@ void dna_adjust::PrepareMappedRegions(const UINT32& block) try { PrepareMemoryMapRegions(block); } - catch (interprocess_exception& e){ - stringstream ss; - ss << "PrepareMappedRegions() terminated while creating memory map" << endl; - ss << " regions from .mtx stage files. Details:\n " << e.what() << endl << endl; - ss << " Please ensure the .mtx stage files from a previous staged" << endl; - ss << " adjustment exist, or re-run the adjustment using the" << endl; - ss << " --" << RECREATE_STAGE_FILES << " option." << endl; - adj_file << endl << "- Error: " << ss.str() << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + catch (boost::interprocess::interprocess_exception& e){ + std::stringstream ss; + ss << "PrepareMappedRegions() terminated while creating memory map" << std::endl; + ss << " regions from .mtx stage files. Details:\n " << e.what() << std::endl << std::endl; + ss << " Please ensure the .mtx stage files from a previous staged" << std::endl; + ss << " adjustment exist, or re-run the adjustment using the" << std::endl; + ss << " --" << RECREATE_STAGE_FILES << " option." << std::endl; + adj_file << std::endl << "- Error: " << ss.str() << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } @@ -397,12 +397,12 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) return; } - stringstream ss; + std::stringstream ss; ss << projectSettings_.g.output_folder << FOLDER_SLASH << projectSettings_.g.network_name << "-"; - string filePath(ss.str()); + std::string filePath(ss.str()); v_stageFileStreams_.clear(); - string fullfilePath; + std::string fullfilePath; va_list vlist; va_start(vlist, file_count); @@ -419,7 +419,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) fullfilePath = filePath + "neqr.mtx"; v_stageFileStreams_.push_back(fullfilePath); if (projectSettings_.a.recreate_stage_files) - file_opener(f_normalsR_, fullfilePath, ios::out | ios::binary, binary); + file_opener(f_normalsR_, fullfilePath, std::ios::out | std::ios::binary, binary); normalsR_map_.setnewFilePath(fullfilePath, projectSettings_.a.purge_stage_files); break; @@ -429,7 +429,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) fullfilePath = filePath + "mmc.mtx"; v_stageFileStreams_.push_back(fullfilePath); if (projectSettings_.a.recreate_stage_files) - file_opener(f_measMinusComp_, fullfilePath, ios::out | ios::binary, binary); + file_opener(f_measMinusComp_, fullfilePath, std::ios::out | std::ios::binary, binary); measMinusComp_map_.setnewFilePath(fullfilePath, projectSettings_.a.purge_stage_files); break; @@ -439,7 +439,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) fullfilePath = filePath + "est.mtx"; v_stageFileStreams_.push_back(fullfilePath); if (projectSettings_.a.recreate_stage_files) - file_opener(f_estimatedStations_, fullfilePath, ios::out | ios::binary, binary); + file_opener(f_estimatedStations_, fullfilePath, std::ios::out | std::ios::binary, binary); estimatedStations_map_.setnewFilePath(fullfilePath, projectSettings_.a.purge_stage_files); break; @@ -449,7 +449,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) fullfilePath = filePath + "ost.mtx"; v_stageFileStreams_.push_back(fullfilePath); if (projectSettings_.a.recreate_stage_files) - file_opener(f_originalStations_, fullfilePath, ios::out | ios::binary, binary); + file_opener(f_originalStations_, fullfilePath, std::ios::out | std::ios::binary, binary); originalStations_map_.setnewFilePath(fullfilePath, projectSettings_.a.purge_stage_files); break; @@ -459,7 +459,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) fullfilePath = filePath + "rst.mtx"; v_stageFileStreams_.push_back(fullfilePath); if (projectSettings_.a.recreate_stage_files) - file_opener(f_rigorousStations_, fullfilePath, ios::out | ios::binary, binary); + file_opener(f_rigorousStations_, fullfilePath, std::ios::out | std::ios::binary, binary); rigorousStations_map_.setnewFilePath(fullfilePath, projectSettings_.a.purge_stage_files); break; @@ -469,7 +469,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) fullfilePath = filePath + "jva.mtx"; v_stageFileStreams_.push_back(fullfilePath); if (projectSettings_.a.recreate_stage_files) - file_opener(f_junctionVariances_, fullfilePath, ios::out | ios::binary, binary); + file_opener(f_junctionVariances_, fullfilePath, std::ios::out | std::ios::binary, binary); junctionVariances_map_.setnewFilePath(fullfilePath, projectSettings_.a.purge_stage_files); break; @@ -479,7 +479,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) fullfilePath = filePath + "jvf.mtx"; v_stageFileStreams_.push_back(fullfilePath); if (projectSettings_.a.recreate_stage_files) - file_opener(f_junctionVariancesFwd_, fullfilePath, ios::out | ios::binary, binary); + file_opener(f_junctionVariancesFwd_, fullfilePath, std::ios::out | std::ios::binary, binary); junctionVariancesFwd_map_.setnewFilePath(fullfilePath, projectSettings_.a.purge_stage_files); break; @@ -489,7 +489,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) fullfilePath = filePath + "jef.mtx"; v_stageFileStreams_.push_back(fullfilePath); if (projectSettings_.a.recreate_stage_files) - file_opener(f_junctionEstimatesFwd_, fullfilePath, ios::out | ios::binary, binary); + file_opener(f_junctionEstimatesFwd_, fullfilePath, std::ios::out | std::ios::binary, binary); junctionEstimatesFwd_map_.setnewFilePath(fullfilePath, projectSettings_.a.purge_stage_files); break; @@ -499,7 +499,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) fullfilePath = filePath + "jer.mtx"; v_stageFileStreams_.push_back(fullfilePath); if (projectSettings_.a.recreate_stage_files) - file_opener(f_junctionEstimatesRev_, fullfilePath, ios::out | ios::binary, binary); + file_opener(f_junctionEstimatesRev_, fullfilePath, std::ios::out | std::ios::binary, binary); junctionEstimatesRev_map_.setnewFilePath(fullfilePath, projectSettings_.a.purge_stage_files); break; @@ -509,7 +509,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) fullfilePath = filePath + "rva.mtx"; v_stageFileStreams_.push_back(fullfilePath); if (projectSettings_.a.recreate_stage_files) - file_opener(f_rigorousVariances_, fullfilePath, ios::out | ios::binary, binary); + file_opener(f_rigorousVariances_, fullfilePath, std::ios::out | std::ios::binary, binary); rigorousVariances_map_.setnewFilePath(fullfilePath, projectSettings_.a.purge_stage_files); break; @@ -519,7 +519,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) fullfilePath = filePath + "pam.mtx"; v_stageFileStreams_.push_back(fullfilePath); if (projectSettings_.a.recreate_stage_files) - file_opener(f_precAdjMsrs_, fullfilePath, ios::out | ios::binary, binary); + file_opener(f_precAdjMsrs_, fullfilePath, std::ios::out | std::ios::binary, binary); precAdjMsrs_map_.setnewFilePath(fullfilePath, projectSettings_.a.purge_stage_files); break; @@ -529,7 +529,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) fullfilePath = filePath + "cor.mtx"; v_stageFileStreams_.push_back(fullfilePath); if (projectSettings_.a.recreate_stage_files) - file_opener(f_corrections_, fullfilePath, ios::out | ios::binary, binary); + file_opener(f_corrections_, fullfilePath, std::ios::out | std::ios::binary, binary); corrections_map_.setnewFilePath(fullfilePath, projectSettings_.a.purge_stage_files); break; @@ -537,7 +537,7 @@ void dna_adjust::OpenStageFileStreams(const UINT16 file_count, ...) } va_end(vlist); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { va_end(vlist); SignalExceptionAdjustment(e.what(), 0); } @@ -887,8 +887,8 @@ void dna_adjust::SerialiseBlockToDisk(const UINT32& block) f_corrections_ << v_corrections_.at(block); // ...cor.mtx } catch (...) { - stringstream ss; - ss << "SerialiseBlockToDisk(): An error was encountered when writing matrix data to disk." << endl; + std::stringstream ss; + ss << "SerialiseBlockToDisk(): An error was encountered when writing matrix data to disk." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } } diff --git a/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp b/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp index a87c6f5c..9173d398 100644 --- a/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp +++ b/dynadjust/dynadjust/dnaadjust/dnaadjust.cpp @@ -204,13 +204,13 @@ void dna_adjust::initialiseIteration(const UINT32& iteration) void dna_adjust::InitialiseAdjustment() { - adj_file << endl << "+ Initialising adjustment" << endl; + adj_file << std::endl << "+ Initialising adjustment" << std::endl; // Confidence interval double conf(projectSettings_.a.confidence_interval * 0.01); - normal dist(0.0, 1.0); + boost::math::normal dist(0.0, 1.0); conf += (1.0 - conf) / 2.0; - criticalValue_ = quantile(dist, conf); + criticalValue_ = boost::math::quantile(dist, conf); potentialOutlierCount_ = 0; @@ -297,22 +297,22 @@ void dna_adjust::PrepareAdjustment(const project_settings& projectSettings) if (!projectSettings_.a.report_mode) { - string block_str(" block"); + std::string block_str(" block"); if (blockCount_ > 1) block_str.append("s"); block_str.append(")... "); - adj_file << endl << "+ Preparing for adjustment"; + adj_file << std::endl << "+ Preparing for adjustment"; switch (projectSettings_.a.adjust_mode) { case Phased_Block_1Mode: case PhasedMode: - adj_file << left << " (" << blockCount_<< block_str; + adj_file << std::left << " (" << blockCount_<< block_str; if (projectSettings_.a.multi_thread && projectSettings_.g.verbose > 2) - adj_file << endl; + adj_file << std::endl; break; case SimultaneousMode: - adj_file << left << "... "; + adj_file << std::left << "... "; } adj_file.flush(); } @@ -346,29 +346,29 @@ void dna_adjust::PrepareAdjustment(const project_settings& projectSettings) } } catch (const NetMemoryException& e) { - stringstream ss; + std::stringstream ss; double memory; try { GetMemoryFootprint(memory, GIGABYTE_SIZE); } catch (...) { /*do nothing*/ } - ss << "PrepareAdjustment(): Process terminated while allocating memory for the " << endl << " adjustment matrices. " << - "Details: " << endl << " " << e.what() << endl; + ss << "PrepareAdjustment(): Process terminated while allocating memory for the " << std::endl << " adjustment matrices. " << + "Details: " << std::endl << " " << e.what() << std::endl; ss << " The memory footprint consumed by " << __BINARY_NAME__ << " is " << - fixed << setprecision(2) << memory << " GB" << endl; - adj_file << "- Error" << endl << " " << ss.str(); + std::fixed << std::setprecision(2) << memory << " GB" << std::endl; + adj_file << "- Error" << std::endl << " " << ss.str(); SignalExceptionAdjustment(ss.str(), currentBlock_); } - catch (const runtime_error& e) { - stringstream ss; - ss << "PrepareAdjustment(): Process terminated while preparing the " << endl << " adjustment matrices. " << - "Details: " << endl << " " << e.what() << endl; - adj_file << "- Error" << endl << " " << ss.str(); + catch (const std::runtime_error& e) { + std::stringstream ss; + ss << "PrepareAdjustment(): Process terminated while preparing the " << std::endl << " adjustment matrices. " << + "Details: " << std::endl << " " << e.what() << std::endl; + adj_file << "- Error" << std::endl << " " << ss.str(); SignalExceptionAdjustment(ss.str(), currentBlock_); } catch (...) { - stringstream ss; - ss << "PrepareAdjustment(): Process terminated while preparing the " << endl << " adjustment matrices. " << endl; - adj_file << "- Error" << endl << " " << ss.str(); + std::stringstream ss; + ss << "PrepareAdjustment(): Process terminated while preparing the " << std::endl << " adjustment matrices. " << std::endl; + adj_file << "- Error" << std::endl << " " << ss.str(); SignalExceptionAdjustment(ss.str(), 0); } @@ -386,14 +386,14 @@ void dna_adjust::PrepareAdjustment(const project_settings& projectSettings) try { SetMapRegions(); } - catch (interprocess_exception& e){ - stringstream ss; - ss << "PrepareMappedRegions() terminated while creating memory map" << endl; - ss << " regions from .mtx stage files. Details:\n " << e.what() << endl << endl; - ss << " Please ensure the .mtx stage files from a previous staged" << endl; - ss << " adjustment exist, or re-run the adjustment using the" << endl; - ss << " --" << RECREATE_STAGE_FILES << " option." << endl; - adj_file << endl << "- Error: " << ss.str() << endl; + catch (boost::interprocess::interprocess_exception& e){ + std::stringstream ss; + ss << "PrepareMappedRegions() terminated while creating memory map" << std::endl; + ss << " regions from .mtx stage files. Details:\n " << e.what() << std::endl << std::endl; + ss << " Please ensure the .mtx stage files from a previous staged" << std::endl; + ss << " adjustment exist, or re-run the adjustment using the" << std::endl; + ss << " --" << RECREATE_STAGE_FILES << " option." << std::endl; + adj_file << std::endl << "- Error: " << ss.str() << std::endl; SignalExceptionAdjustment(ss.str(), 0); } } @@ -414,8 +414,8 @@ void dna_adjust::PrepareAdjustment(const project_settings& projectSettings) } catch (...) { - stringstream ss; - ss << "Failed to assign matrices for multi-thread adjustment." << endl; + std::stringstream ss; + ss << "Failed to assign matrices for multi-thread adjustment." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } } @@ -433,7 +433,7 @@ void dna_adjust::PrepareAdjustment(const project_settings& projectSettings) FormUniqueMsrList(); if (projectSettings_.g.verbose > 3) - debug_file << endl << endl; + debug_file << std::endl << std::endl; if (!projectSettings_.a.report_mode) { @@ -445,11 +445,11 @@ void dna_adjust::PrepareAdjustment(const project_settings& projectSettings) if (projectSettings_.g.verbose > 0) { double memory; - stringstream ss; + std::stringstream ss; try { GetMemoryFootprint(memory, GIGABYTE_SIZE); - ss << endl << "+ The memory footprint consumed by " << __BINARY_NAME__ << " is " << - fixed << setprecision(2) << memory << " GB" << endl; + ss << std::endl << "+ The memory footprint consumed by " << __BINARY_NAME__ << " is " << + std::fixed << std::setprecision(2) << memory << " GB" << std::endl; adj_file << ss.str(); } catch (...) { /*do nothing*/ } @@ -468,7 +468,7 @@ void dna_adjust::UpdateBinaryFiles() dna_io_bst bst; bst.write_bst_file(projectSettings_.a.bst_file, &bstBinaryRecords_, bst_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -480,7 +480,7 @@ void dna_adjust::UpdateBinaryFiles() dna_io_bms bms; bms.write_bms_file(projectSettings_.a.bms_file, &bmsBinaryRecords_, bms_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } } @@ -610,23 +610,23 @@ void dna_adjust::UpdateAdjustment(bool iterate) } } catch (const NetMemoryException& e) { - stringstream ss; + std::stringstream ss; double memory; try { GetMemoryFootprint(memory, GIGABYTE_SIZE); } catch (...) {} - ss << "UpdateAdjustment(): Process terminated while allocating memory for the " << endl << " adjustment matrices. " << - "Details: " << endl << " " << e.what() << endl; + ss << "UpdateAdjustment(): Process terminated while allocating memory for the " << std::endl << " adjustment matrices. " << + "Details: " << std::endl << " " << e.what() << std::endl; ss << " The memory footprint consumed by " << __BINARY_NAME__ << " is " << - fixed << setprecision(2) << memory << " GB" << endl; - adj_file << "- Error:" << endl << " " << ss.str(); + std::fixed << std::setprecision(2) << memory << " GB" << std::endl; + adj_file << "- Error:" << std::endl << " " << ss.str(); SignalExceptionAdjustment(ss.str(), block); } - catch (const runtime_error& e) { - stringstream ss; - ss << "UpdateAdjustment(): Process terminated while updating the " << endl << " adjustment matrices. " << - "Details: " << endl << " " << e.what() << endl; - adj_file << "- Error:" << endl << " " << ss.str(); + catch (const std::runtime_error& e) { + std::stringstream ss; + ss << "UpdateAdjustment(): Process terminated while updating the " << std::endl << " adjustment matrices. " << + "Details: " << std::endl << " " << e.what() << std::endl; + adj_file << "- Error:" << std::endl << " " << ss.str(); SignalExceptionAdjustment(ss.str(), block); } @@ -640,11 +640,11 @@ void dna_adjust::GetMemoryFootprint(double& memory, const _MEM_UNIT_ unit) UINT32 precision(2); size_t size(0); - stringstream ss, st; + std::stringstream ss, st; if (projectSettings_.g.verbose > 0) { // Print title - ss << endl << left << setw(PRINT_VAR_PAD) << "+ Memory footprint:"; + ss << std::endl << std::left << std::setw(PRINT_VAR_PAD) << "+ Memory footprint:"; st << "Size"; switch (unit) { @@ -663,13 +663,13 @@ void dna_adjust::GetMemoryFootprint(double& memory, const _MEM_UNIT_ unit) break; } - ss << right << setw(NUMERIC_WIDTH) << st.str() << endl; + ss << std::right << std::setw(NUMERIC_WIDTH) << st.str() << std::endl; // Print line ss << " "; for (i=0; i(bstBinaryRecords_.size()) / unit * sizeof(station_t)); if (projectSettings_.g.verbose > 0) - ss << left << setw(PRINT_VAR_PAD) << " Binary station file" << - right << setw(NUMERIC_WIDTH) << fixed << setprecision(precision) << tmp << endl; + ss << std::left << std::setw(PRINT_VAR_PAD) << " Binary station file" << + std::right << std::setw(NUMERIC_WIDTH) << std::fixed << std::setprecision(precision) << tmp << std::endl; ////////////// ////////////// // binary measurements memory += (tmp = static_cast(bmsBinaryRecords_.size()) / unit * sizeof(measurement_t)); if (projectSettings_.g.verbose > 0) - ss << left << setw(PRINT_VAR_PAD) << " Binary measurement file" << - right << setw(NUMERIC_WIDTH) << fixed << setprecision(precision) << tmp << endl; + ss << std::left << std::setw(PRINT_VAR_PAD) << " Binary measurement file" << + std::right << std::setw(NUMERIC_WIDTH) << std::fixed << std::setprecision(precision) << tmp << std::endl; ////////////// ////////////// // Associated Station List memory += (tmp = static_cast(vAssocStnList_.size()) / unit * sizeof(CAStationList)); if (projectSettings_.g.verbose > 0) - ss << left << setw(PRINT_VAR_PAD) << " Associated station list" << - right << setw(NUMERIC_WIDTH) << fixed << setprecision(precision) << tmp << endl; + ss << std::left << std::setw(PRINT_VAR_PAD) << " Associated station list" << + std::right << std::setw(NUMERIC_WIDTH) << std::fixed << std::setprecision(precision) << tmp << std::endl; ////////////// ////////////// // Associated Measurement List memory += (tmp = static_cast(vAssocMsrList_.size()) / unit * sizeof(UINT32)); if (projectSettings_.g.verbose > 0) - ss << left << setw(PRINT_VAR_PAD) << " Associated measurement list" << - right << setw(NUMERIC_WIDTH) << fixed << setprecision(precision) << tmp << endl; + ss << std::left << std::setw(PRINT_VAR_PAD) << " Associated measurement list" << + std::right << std::setw(NUMERIC_WIDTH) << std::fixed << std::setprecision(precision) << tmp << std::endl; ////////////// ////////////// @@ -715,8 +715,8 @@ void dna_adjust::GetMemoryFootprint(double& memory, const _MEM_UNIT_ unit) size += v_chiSquaredLowerLimit_.size(); memory += (tmp = static_cast(size) / unit * sizeof(double)); if (projectSettings_.g.verbose > 0) - ss << left << setw(PRINT_VAR_PAD) << " Statistical variables" << - right << setw(NUMERIC_WIDTH) << fixed << setprecision(precision) << tmp << endl; + ss << std::left << std::setw(PRINT_VAR_PAD) << " Statistical variables" << + std::right << std::setw(NUMERIC_WIDTH) << std::fixed << std::setprecision(precision) << tmp << std::endl; ////////////// ////////////// @@ -749,8 +749,8 @@ void dna_adjust::GetMemoryFootprint(double& memory, const _MEM_UNIT_ unit) memory += tmp; if (projectSettings_.g.verbose > 0) - ss << left << setw(PRINT_VAR_PAD) << " Matrix variables" << - right << setw(NUMERIC_WIDTH) << fixed << setprecision(precision) << tmp << endl; + ss << std::left << std::setw(PRINT_VAR_PAD) << " Matrix variables" << + std::right << std::setw(NUMERIC_WIDTH) << std::fixed << std::setprecision(precision) << tmp << std::endl; #ifdef MULTI_THREAD_ADJUST if (projectSettings_.a.multi_thread) @@ -781,8 +781,8 @@ void dna_adjust::GetMemoryFootprint(double& memory, const _MEM_UNIT_ unit) memory += tmp; if (projectSettings_.g.verbose > 0) - ss << left << setw(PRINT_VAR_PAD) << " MT matrix variables" << - right << setw(NUMERIC_WIDTH) << fixed << setprecision(precision) << tmp << endl; + ss << std::left << std::setw(PRINT_VAR_PAD) << " MT matrix variables" << + std::right << std::setw(NUMERIC_WIDTH) << std::fixed << std::setprecision(precision) << tmp << std::endl; } #endif @@ -816,8 +816,8 @@ void dna_adjust::GetMemoryFootprint(double& memory, const _MEM_UNIT_ unit) memory += tmp; if (projectSettings_.g.verbose > 0) - ss << left << setw(PRINT_VAR_PAD) << " Arrays, counters and indices" << - right << setw(NUMERIC_WIDTH) << fixed << setprecision(precision) << tmp << endl; + ss << std::left << std::setw(PRINT_VAR_PAD) << " Arrays, counters and indices" << + std::right << std::setw(NUMERIC_WIDTH) << std::fixed << std::setprecision(precision) << tmp << std::endl; ////////////// @@ -826,8 +826,8 @@ void dna_adjust::GetMemoryFootprint(double& memory, const _MEM_UNIT_ unit) ss << " "; for (i=0; i 5) debug_file << "V" << (*_it_msr)->measType << " " << - fixed << setprecision(16) << setw(26) << variance << endl; + std::fixed << std::setprecision(16) << std::setw(26) << variance << std::endl; // Build At * V-1 AtVinv->put(stn1, design_row, variance * design->get(design_row, stn1)); @@ -1623,9 +1623,9 @@ void dna_adjust::UpdateNormals(const UINT32& block, bool MT_ReverseOrCombine) break; default: - stringstream ss; - ss << "UpdateNormals(): Unknown measurement type - '" << static_cast(&(_it_msr->measType)) << - "'." << endl; + std::stringstream ss; + ss << "UpdateNormals(): Unknown measurement type - '" << static_cast(&(_it_msr->measType)) << + "'." << std::endl; SignalExceptionAdjustment(ss.str(), block); } } @@ -1720,7 +1720,7 @@ void dna_adjust::UpdateNormals_D(const UINT32& block, it_vmsr_t& _it_msr, UINT32 UINT32 row, col, a, angle_count(_it_msr->vectorCount2 - 1); UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); - vector stations; + std::vector stations; UINT32 stn1, stn2, stn3; vmsr_t angleRec; @@ -1754,17 +1754,17 @@ void dna_adjust::UpdateNormals_D(const UINT32& block, it_vmsr_t& _it_msr, UINT32 if (!binary_search(stations.begin(), stations.end(), it_angle->station1)) { stations.push_back(it_angle->station1); - sort(stations.begin(), stations.end()); + std::sort(stations.begin(), stations.end()); } if (!binary_search(stations.begin(), stations.end(), it_angle->station2)) { stations.push_back(it_angle->station2); - sort(stations.begin(), stations.end()); + std::sort(stations.begin(), stations.end()); } if (!binary_search(stations.begin(), stations.end(), it_angle->station3)) { stations.push_back(it_angle->station3); - sort(stations.begin(), stations.end()); + std::sort(stations.begin(), stations.end()); } // station 1 @@ -1803,7 +1803,7 @@ void dna_adjust::UpdateNormals_D(const UINT32& block, it_vmsr_t& _it_msr, UINT32 { // // covariance terms (station 1, station 2, station 3) - // requires vector stations which was built during formation of v_AtVinv_ + // requires std::vector stations which was built during formation of v_AtVinv_ for (it_stn=stations.begin(); it_stn!=stations.end(); ++it_stn) { stn1 = (v_blockStationsMap_.at(block)[*it_stn] * 3); @@ -1910,7 +1910,7 @@ void dna_adjust::UpdateNormals_X(const UINT32& block, it_vmsr_t& _it_msr, UINT32 baseline_stations.push_back(GetBlkMatrixElemStn1(block, &_it_msr)); baseline_stations.push_back(GetBlkMatrixElemStn2(block, &_it_msr)); - sort(baseline_stations.begin(), baseline_stations.end()); + std::sort(baseline_stations.begin(), baseline_stations.end()); matrix_2d tmp(3, 3); @@ -1924,13 +1924,13 @@ void dna_adjust::UpdateNormals_X(const UINT32& block, it_vmsr_t& _it_msr, UINT32 if (!binary_search(baseline_stations.begin(), baseline_stations.end(), stn1)) { baseline_stations.push_back(stn1); - sort(baseline_stations.begin(), baseline_stations.end()); + std::sort(baseline_stations.begin(), baseline_stations.end()); } if (!binary_search(baseline_stations.begin(), baseline_stations.end(), stn2)) { baseline_stations.push_back(stn2); - sort(baseline_stations.begin(), baseline_stations.end()); + std::sort(baseline_stations.begin(), baseline_stations.end()); } covr = cluster_bsl * 3; @@ -2020,7 +2020,7 @@ void dna_adjust::UpdateNormals_Y(const UINT32& block, it_vmsr_t& _it_msr, UINT32 if (projectSettings_.g.verbose > 4) debug_file << "- Adding variances for " << bstBinaryRecords_.at(_it_msr->station1).stationName << " to v_normals_ (block " << block+1 << "), (" << stn1 << ", " << stn1 << "): " << - fixed << setprecision(16) << AtVinv->submatrix(stn1, design_row, 3, 3); + std::fixed << std::setprecision(16) << AtVinv->submatrix(stn1, design_row, 3, 3); if (covariance_count < 1) { @@ -2122,7 +2122,7 @@ void dna_adjust::AddConstraintStationstoNormalsForward(const UINT32& block) #pragma region debug_output #endif if (projectSettings_.g.verbose > 6) - debug_file << "parameter station " << bstBinaryRecords_.at((*_it_const)).stationName << scientific << setprecision(16) << var_cart << endl; + debug_file << "parameter station " << bstBinaryRecords_.at((*_it_const)).stationName << std::scientific << std::setprecision(16) << var_cart << std::endl; #ifdef _MS_COMPILER_ #pragma endregion debug_output #endif @@ -2249,7 +2249,7 @@ void dna_adjust::AddConstraintStationstoNormalsSimultaneous(const UINT32& block) #pragma region debug_output #endif if (projectSettings_.g.verbose > 6) - debug_file << "parameter station " << bstBinaryRecords_.at((*_it_const)).stationName << scientific << setprecision(16) << var_cart << endl; + debug_file << "parameter station " << bstBinaryRecords_.at((*_it_const)).stationName << std::scientific << std::setprecision(16) << var_cart << std::endl; #ifdef _MS_COMPILER_ #pragma endregion debug_output #endif @@ -2371,22 +2371,22 @@ _ADJUST_STATUS_ dna_adjust::AdjustNetwork() { case SimultaneousMode: if (!projectSettings_.a.report_mode) - adj_file << endl << "+ Commencing simultaneous adjustment" << endl << endl; + adj_file << std::endl << "+ Commencing simultaneous adjustment" << std::endl << std::endl; AdjustSimultaneous(); return adjustStatus_; case PhasedMode: if (!projectSettings_.a.report_mode) - adj_file << endl << "+ Commencing sequential phased adjustment"; + adj_file << std::endl << "+ Commencing sequential phased adjustment"; #ifdef MULTI_THREAD_ADJUST if (projectSettings_.a.multi_thread) { if (!projectSettings_.a.report_mode) { - adj_file << endl << " Optimised for concurrent processing via multi-threading." << endl; - adj_file << " The active CPU supports the execution of " << boost::thread::hardware_concurrency() << " concurrent threads." << endl; - adj_file << endl; + adj_file << std::endl << " Optimised for concurrent processing via multi-threading." << std::endl; + adj_file << " The active CPU supports the execution of " << boost::thread::hardware_concurrency() << " concurrent threads." << std::endl; + adj_file << std::endl; } AdjustPhasedMultiThread(); return adjustStatus_; @@ -2394,7 +2394,7 @@ _ADJUST_STATUS_ dna_adjust::AdjustNetwork() #endif if (!projectSettings_.a.report_mode) - adj_file << endl << endl; + adj_file << std::endl << std::endl; AdjustPhased(); return adjustStatus_; @@ -2402,20 +2402,20 @@ _ADJUST_STATUS_ dna_adjust::AdjustNetwork() case Phased_Block_1Mode: if (!projectSettings_.a.report_mode) { - adj_file << endl << "+ Commencing sequential phased adjustment, producing rigorous estimates" << endl; - adj_file << " for block 1 only" << endl << endl; + adj_file << std::endl << "+ Commencing sequential phased adjustment, producing rigorous estimates" << std::endl; + adj_file << " for block 1 only" << std::endl << std::endl; adj_file << - "- Warning: Depending on the quality of the apriori station estimates, further" << endl << - " iterations may be needed. --block1-phased mode should only be used once" << endl << - " rigorous estimates have been produced for the entire network."<< endl << endl; + "- Warning: Depending on the quality of the apriori station estimates, further" << std::endl << + " iterations may be needed. --block1-phased mode should only be used once" << std::endl << + " rigorous estimates have been produced for the entire network."<< std::endl << std::endl; } AdjustPhasedBlock1(); return adjustStatus_; default: - stringstream ss; - ss << "AdjustNetwork(): Unknown adjustment type" << endl; + std::stringstream ss; + ss << "AdjustNetwork(): Unknown adjustment type" << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -2506,7 +2506,7 @@ void dna_adjust::LoadDatabaseId() if (databaseIDsLoaded_) return; - string dbid_filename = formPath(projectSettings_.g.output_folder, + std::string dbid_filename = formPath(projectSettings_.g.output_folder, projectSettings_.g.network_name, "dbid"); // When printing database ids, force printing adjusted measurements @@ -2524,9 +2524,9 @@ void dna_adjust::LoadDatabaseId() try { // Create geoid file. Throws runtime_error on failure. file_opener(dbid_file, dbid_filename, - ios::in | ios::binary, binary); + std::ios::in | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -2574,79 +2574,79 @@ void dna_adjust::PrintPositionalUncertainty() // Create apu file. Throws runtime_error on failure. file_opener(apu_file, projectSettings_.o._apu_file); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } // Print formatted header print_file_header(apu_file, "DYNADJUST POSITIONAL UNCERTAINTY OUTPUT FILE"); - apu_file << setw(PRINT_VAR_PAD) << left << "File name:" << system_complete(projectSettings_.o._apu_file).string() << endl << endl; + apu_file << std::setw(PRINT_VAR_PAD) << std::left << "File name:" << boost::filesystem::system_complete(projectSettings_.o._apu_file).string() << std::endl << std::endl; - apu_file << setw(PRINT_VAR_PAD) << left << "PU confidence interval:" << setprecision(1) << fixed << - // projectSettings_.a.confidence_interval << "%" << endl; + apu_file << std::setw(PRINT_VAR_PAD) << std::left << "PU confidence interval:" << std::setprecision(1) << std::fixed << + // projectSettings_.a.confidence_interval << "%" << std::endl; // the SP1 standard for PU is 95% and the formula is designed to achieve that end, // irrespective of the adjustment confidence interval - 95.0 << "%" << endl; + 95.0 << "%" << std::endl; - apu_file << setw(PRINT_VAR_PAD) << left << "Error ellipse axes:" << setprecision(1) << fixed << - 68.3 << "% (1 sigma)" << endl; + apu_file << std::setw(PRINT_VAR_PAD) << std::left << "Error ellipse axes:" << std::setprecision(1) << std::fixed << + 68.3 << "% (1 sigma)" << std::endl; - apu_file << setw(PRINT_VAR_PAD) << left << "Variances:" << setprecision(1) << fixed << - 68.3 << "% (1 sigma)" << endl; + apu_file << std::setw(PRINT_VAR_PAD) << std::left << "Variances:" << std::setprecision(1) << std::fixed << + 68.3 << "% (1 sigma)" << std::endl; - apu_file << setw(PRINT_VAR_PAD) << left << "Stations printed in blocks:"; + apu_file << std::setw(PRINT_VAR_PAD) << std::left << "Stations printed in blocks:"; if (projectSettings_.a.adjust_mode != SimultaneousMode) { if (projectSettings_.o._output_stn_blocks) - apu_file << "Yes" << endl; + apu_file << "Yes" << std::endl; else { if (projectSettings_.o._output_pu_covariances) - apu_file << left << "Yes (enforced with output-all-covariances)" << endl; + apu_file << std::left << "Yes (enforced with output-all-covariances)" << std::endl; else - apu_file << left << "No" << endl; + apu_file << std::left << "No" << std::endl; } } else - apu_file << left << "No" << endl; + apu_file << std::left << "No" << std::endl; - apu_file << setw(PRINT_VAR_PAD) << left << "Variance matrix units:"; + apu_file << std::setw(PRINT_VAR_PAD) << std::left << "Variance matrix units:"; switch (projectSettings_.o._apu_vcv_units) { case ENU_apu_ui: - apu_file << left << "ENU" << endl; + apu_file << std::left << "ENU" << std::endl; break; default: case XYZ_apu_ui: - apu_file << left << "XYZ" << endl; + apu_file << std::left << "XYZ" << std::endl; break; } apu_file << - setw(PRINT_VAR_PAD) << left << "Full covariance matrix:"; + std::setw(PRINT_VAR_PAD) << std::left << "Full covariance matrix:"; if (projectSettings_.o._output_pu_covariances) - apu_file << left << "Yes" << endl; + apu_file << std::left << "Yes" << std::endl; else - apu_file << left << "No" << endl; + apu_file << std::left << "No" << std::endl; if (projectSettings_.o._apply_type_b_file || projectSettings_.o._apply_type_b_global) { if (projectSettings_.o._apply_type_b_global) - apu_file << setw(PRINT_VAR_PAD) << left << "Type B uncertainties:" << - projectSettings_.a.type_b_global << endl; + apu_file << std::setw(PRINT_VAR_PAD) << std::left << "Type B uncertainties:" << + projectSettings_.a.type_b_global << std::endl; if (projectSettings_.o._apply_type_b_file) - apu_file << setw(PRINT_VAR_PAD) << left << "Type B uncertainty file:" << - system_complete(projectSettings_.a.type_b_file).string() << endl; + apu_file << std::setw(PRINT_VAR_PAD) << std::left << "Type B uncertainty file:" << + boost::filesystem::system_complete(projectSettings_.a.type_b_file).string() << std::endl; } - apu_file << OUTPUTLINE << endl << endl; + apu_file << OUTPUTLINE << std::endl << std::endl; - apu_file << "Positional uncertainty of adjusted station coordinates" << endl; - apu_file << "------------------------------------------------------" << endl; + apu_file << "Positional uncertainty of adjusted station coordinates" << std::endl; + apu_file << "------------------------------------------------------" << std::endl; - apu_file << endl; + apu_file << std::endl; switch (projectSettings_.a.adjust_mode) { @@ -2700,24 +2700,24 @@ void dna_adjust::PrintNetworkStationCorrections() // Create cor file. Throws runtime_error on failure. file_opener(cor_file, projectSettings_.o._cor_file); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } // Print formatted header print_file_header(cor_file, "DYNADJUST CORRECTIONS OUTPUT FILE"); - cor_file << setw(PRINT_VAR_PAD) << left << "File name:" << system_complete(projectSettings_.o._cor_file).string() << endl << endl; + cor_file << std::setw(PRINT_VAR_PAD) << std::left << "File name:" << boost::filesystem::system_complete(projectSettings_.o._cor_file).string() << std::endl << std::endl; - cor_file << setw(PRINT_VAR_PAD) << left << "Stations printed in blocks:"; + cor_file << std::setw(PRINT_VAR_PAD) << std::left << "Stations printed in blocks:"; if (projectSettings_.a.adjust_mode != SimultaneousMode && projectSettings_.o._output_stn_blocks) - cor_file << "Yes" << endl << endl; + cor_file << "Yes" << std::endl << std::endl; else - cor_file << "No" << endl; - cor_file << OUTPUTLINE << endl << endl; + cor_file << "No" << std::endl; + cor_file << OUTPUTLINE << std::endl << std::endl; - cor_file << "Corrections to stations" << endl; - cor_file << "------------------------------------------" << endl << endl; + cor_file << "Corrections to stations" << std::endl; + cor_file << "------------------------------------------" << std::endl << std::endl; switch (projectSettings_.a.adjust_mode) { @@ -2755,12 +2755,12 @@ void dna_adjust::PrintNetworkStationCorrections() cor_file.close(); } -bool dna_adjust::PrintEstimatedStationCoordinatestoSNX(string& sinex_filename) +bool dna_adjust::PrintEstimatedStationCoordinatestoSNX(std::string& sinex_filename) { std::ofstream sinex_file; - string sinexFilename; - string sinexBasename = projectSettings_.g.output_folder + FOLDER_SLASH + projectSettings_.g.network_name; - stringstream ssBlock; + std::string sinexFilename; + std::string sinexBasename = projectSettings_.g.output_folder + FOLDER_SLASH + projectSettings_.g.network_name; + std::stringstream ssBlock; matrix_2d *estimates = nullptr, *variances = nullptr; @@ -2812,7 +2812,7 @@ bool dna_adjust::PrintEstimatedStationCoordinatestoSNX(string& sinex_filename) // Open output file stream. Throws runtime_error on failure. file_opener(sinex_file, sinexFilename); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -2828,7 +2828,7 @@ bool dna_adjust::PrintEstimatedStationCoordinatestoSNX(string& sinex_filename) blockCount_, block, &datum_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -2850,7 +2850,7 @@ bool dna_adjust::PrintEstimatedStationCoordinatestoSNX(string& sinex_filename) // Open output file stream. Throws runtime_error on failure. file_opener(sinex_file, sinexFilename); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -2861,7 +2861,7 @@ bool dna_adjust::PrintEstimatedStationCoordinatestoSNX(string& sinex_filename) return success; } -void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML_Y(const string& msrFile, INPUT_FILE_TYPE t) +void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML_Y(const std::string& msrFile, INPUT_FILE_TYPE t) { // Measurements std::ofstream msr_file; @@ -2869,13 +2869,13 @@ void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML_Y(const string& msrFil // Create STN/XML file. file_opener(msr_file, msrFile); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } dna_msr_fields dml, dmw; - stringstream ss; + std::stringstream ss; try { @@ -2883,7 +2883,7 @@ void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML_Y(const string& msrFil ss << "Source data: Coordinates and uncertainties for " << count << " unique stations in " << blockCount_ << " blocks " << "estimated from least squares adjustment."; - string headerComment(ss.str()); + std::string headerComment(ss.str()); // print header switch (t) @@ -2920,7 +2920,7 @@ void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML_Y(const string& msrFil catch (const XMLInteropException& e) { SignalExceptionAdjustment(e.what(), 0); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -2928,7 +2928,7 @@ void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML_Y(const string& msrFil { matrix_2d *estimates = nullptr, *variances = nullptr; dnaMsrPtr msr_ptr; - string comment; + std::string comment; // Create a Y cluster for each block for (UINT32 block(0); block 1) ss << " for block " << (block + 1); - ss << endl << + ss << std::endl << " - Type (Y) GPS point cluster (set of " << v_blockStationsMap_.at(block).size() << " stations)"; if (blockCount_ > 1) { - ss << ":" << endl << + ss << ":" << std::endl << " - " << v_ISL_.at(block).size() << " inner station"; if (v_ISL_.at(block).size() != 1) ss << "s"; - ss << endl << + ss << std::endl << " - " << v_JSL_.at(block).size() << " junction station"; if (v_JSL_.at(block).size() != 1) ss << "s"; - ss << endl; + ss << std::endl; } else - ss << endl; + ss << std::endl; ss << " "; comment = ss.str(); @@ -3013,7 +3013,7 @@ void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML_Y(const string& msrFil switch (t) { case dynaml: - msr_file << "" << endl; + msr_file << "" << std::endl; break; case dna: default: @@ -3032,7 +3032,7 @@ void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML_Y(const string& msrFil // This should be put into a class separate to dnaadjust -void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML(const string& stnFile, INPUT_FILE_TYPE t, bool flagUnused) +void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML(const std::string& stnFile, INPUT_FILE_TYPE t, bool flagUnused) { // Stations std::ofstream stn_file; @@ -3040,7 +3040,7 @@ void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML(const string& stnFile, // Create STN/XML file. file_opener(stn_file, stnFile); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -3049,7 +3049,7 @@ void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML(const string& stnFile, UINT32 count(static_cast(bstBinaryRecords_.size())); dna_stn_fields dsl, dsw; - string headerComment("Source data: Coordinates estimated from least squares adjustment."); + std::string headerComment("Source data: Coordinates estimated from least squares adjustment."); // print header switch (t) @@ -3099,7 +3099,7 @@ void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML(const string& stnFile, // Sort on original file order CompareStnFileOrder stnorderCompareFunc(&bstBinaryRecords_); - sort(vStationList.begin(), vStationList.end(), stnorderCompareFunc); + std::sort(vStationList.begin(), vStationList.end(), stnorderCompareFunc); // print station coordinates switch (t) @@ -3124,7 +3124,7 @@ void dna_adjust::PrintEstimatedStationCoordinatestoDNAXML(const string& stnFile, datum_.GetEllipsoidRef(), &projection_, dynaml); }); - stn_file << "" << endl; + stn_file << "" << std::endl; break; case dna: @@ -3319,7 +3319,7 @@ void dna_adjust::CreateMsrToStnTally() dna_io_aml aml; aml.load_aml_file(projectSettings_.s.aml_file, &vAssocMsrList_, &bmsBinaryRecords_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -3354,7 +3354,7 @@ void dna_adjust::PrintMeasurementsToStation() CreateMsrToStnTally(); // Print measurement to station summary header - string header("Measurements to Station "); + std::string header("Measurements to Station "); MsrToStnSummaryHeader(adj_file, header); _it_vmsrtally it_vstnmsrs; @@ -3372,7 +3372,7 @@ void dna_adjust::PrintMeasurementsToStation() { // sort summary according to measurement to station count CompareMeasCount msrcountCompareFunc(&vAssocStnList_); - sort(vStationList.begin(), vStationList.end(), msrcountCompareFunc); + std::sort(vStationList.begin(), vStationList.end(), msrcountCompareFunc); } break; case orig_stn_sort_ui: @@ -3380,7 +3380,7 @@ void dna_adjust::PrintMeasurementsToStation() { // sort summary according to original station file order CompareStnFileOrder stnorderCompareFunc(&bstBinaryRecords_); - sort(vStationList.begin(), vStationList.end(), stnorderCompareFunc); + std::sort(vStationList.begin(), vStationList.end(), stnorderCompareFunc); } break; } @@ -3399,7 +3399,7 @@ void dna_adjust::PrintMeasurementsToStation() msrTally.coutSummaryMsrToStn(adj_file, "Totals"); - adj_file << endl << endl; + adj_file << std::endl << std::endl; } @@ -3418,10 +3418,10 @@ void dna_adjust::AdjustSimultaneous() adjustStatus_ = ADJUST_SUCCESS; initialiseIteration(); - ostringstream ss; - string corr_msg; - milliseconds elapsed_time(milliseconds(0)); - cpu_timer it_time, tot_time; + std::ostringstream ss; + std::string corr_msg; + boost::posix_time::milliseconds elapsed_time(boost::posix_time::milliseconds(0)); + boost::timer::cpu_timer it_time, tot_time; bool iterate; @@ -3503,7 +3503,7 @@ void dna_adjust::AdjustSimultaneous() ValidateandFinaliseAdjustment(tot_time); } -void dna_adjust::ValidateandFinaliseAdjustment(cpu_timer& tot_time) +void dna_adjust::ValidateandFinaliseAdjustment(boost::timer::cpu_timer& tot_time) { isAdjusting_ = false; @@ -3544,12 +3544,12 @@ void dna_adjust::ValidateandFinaliseAdjustment(cpu_timer& tot_time) void dna_adjust::PrintAdjustmentStatus() { // print adjustment status - adj_file << endl << OUTPUTLINE << endl; - adj_file << setw(PRINT_VAR_PAD) << left << "SOLUTION"; + adj_file << std::endl << OUTPUTLINE << std::endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "SOLUTION"; if (projectSettings_.a.report_mode) { - adj_file << "Printing results of last adjustment only" << endl; + adj_file << "Printing results of last adjustment only" << std::endl; return; } @@ -3557,49 +3557,49 @@ void dna_adjust::PrintAdjustmentStatus() { case Phased_Block_1Mode: if (adjustStatus_ == ADJUST_SUCCESS) - adj_file << "Estimates solved for Block 1 only" << endl; + adj_file << "Estimates solved for Block 1 only" << std::endl; else - adj_file << "Failed to solve Block 1 estimates" << endl; + adj_file << "Failed to solve Block 1 estimates" << std::endl; break; default: if (adjustStatus_ == ADJUST_SUCCESS && CurrentIteration() <= projectSettings_.a.max_iterations && fabs(maxCorr_) <= projectSettings_.a.iteration_threshold) - adj_file << "Converged" << endl; + adj_file << "Converged" << std::endl; else - adj_file << "Failed to converge" << endl; + adj_file << "Failed to converge" << std::endl; } } -void dna_adjust::PrintAdjustmentTime(cpu_timer& time, _TIMER_TYPE_ timerType) +void dna_adjust::PrintAdjustmentTime(boost::timer::cpu_timer& time, _TIMER_TYPE_ timerType) { // calculate and print total time - milliseconds ms(milliseconds(time.elapsed().wall/MILLI_TO_NANO)); - time_duration t(ms); + boost::posix_time::milliseconds ms(boost::posix_time::milliseconds(time.elapsed().wall/MILLI_TO_NANO)); + boost::posix_time::time_duration t(ms); - stringstream ss; - if (t > seconds(1)) - ss << seconds(static_cast(t.total_seconds())); + std::stringstream ss; + if (t > boost::posix_time::seconds(1)) + ss << boost::posix_time::seconds(static_cast(t.total_seconds())); else ss << t; if (timerType == iteration_time) - adj_file << setw(PRINT_VAR_PAD) << left << "Elapsed time" << ss.str() << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Elapsed time" << ss.str() << std::endl; else { total_time_ = ms; - adj_file << setw(PRINT_VAR_PAD) << left << "Total time" << ss.str() << endl << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Total time" << ss.str() << std::endl << std::endl; } } void dna_adjust::PrintIteration(const UINT32& iteration) { - stringstream iterationMessage; + std::stringstream iterationMessage; - iterationMessage << endl << OUTPUTLINE << endl << - setw(PRINT_VAR_PAD) << left << "ITERATION" << iteration << endl << endl; + iterationMessage << std::endl << OUTPUTLINE << std::endl << + std::setw(PRINT_VAR_PAD) << std::left << "ITERATION" << iteration << std::endl << std::endl; adj_file << iterationMessage.str(); @@ -3612,12 +3612,12 @@ void dna_adjust::AdjustPhased() { initialiseIteration(); - string corr_msg; - ostringstream ss; + std::string corr_msg; + std::ostringstream ss; UINT32 i; bool iterate(true); - cpu_timer it_time, tot_time; + boost::timer::cpu_timer it_time, tot_time; // do until convergence criteria is met for (i=0; i 2) { adj_file_mutex.lock(); - adj_file << thread_id << "> Preparing block " << block + 1 << "..." << endl; + adj_file << thread_id << "> Preparing block " << block + 1 << "..." << std::endl; adj_file_mutex.unlock(); } #endif @@ -3908,7 +3908,7 @@ void dna_adjust::PrepareAdjustmentBlock(const UINT32 block, const UINT32 thread_ if (projectSettings_.g.verbose > 3) { - debug_file << "BLOCK " << block + 1 << " Station summary -------------------------------------------------" << endl; + debug_file << "BLOCK " << block + 1 << " Station summary -------------------------------------------------" << std::endl; debug_file << "Stations: "; for (i=0; i 2) { adj_file_mutex.lock(); - adj_file << thread_id << "> Done." << endl; + adj_file << thread_id << "> Done." << std::endl; adj_file_mutex.unlock(); } #endif @@ -4026,10 +4028,10 @@ void dna_adjust::PrepareAdjustmentBlock(const UINT32 block, const UINT32 thread_ #endif if (projectSettings_.g.verbose > 3) { - debug_file << endl; - debug_file << "Design " << scientific << setprecision(16) << v_design_.at(block) << endl; - debug_file << "AtVinv " << scientific << setprecision(16) << v_AtVinv_.at(block) << endl; - debug_file << "Normals " << scientific << setprecision(16) << v_normals_.at(block) << endl; + debug_file << std::endl; + debug_file << "Design " << std::scientific << std::setprecision(16) << v_design_.at(block) << std::endl; + debug_file << "AtVinv " << std::scientific << std::setprecision(16) << v_AtVinv_.at(block) << std::endl; + debug_file << "Normals " << std::scientific << std::setprecision(16) << v_normals_.at(block) << std::endl; } #ifdef _MS_COMPILER_ #pragma endregion debug_output @@ -4105,11 +4107,11 @@ void dna_adjust::CarryForwardJunctions(const UINT32 thisBlock, const UINT32 next #ifdef MULTI_THREAD_ADJUST if (projectSettings_.a.multi_thread) { - adj_file << endl << "1> Adjusted block " << thisBlock + 1; + adj_file << std::endl << "1> Adjusted block " << thisBlock + 1; if (v_blockMeta_.at(thisBlock)._blockLast || v_blockMeta_.at(thisBlock)._blockIsolated) - adj_file << " (forward, rigorous) " << endl; + adj_file << " (forward, rigorous) " << std::endl; else - adj_file << " (forward, in isolation) " << endl; + adj_file << " (forward, in isolation) " << std::endl; } #endif @@ -4150,7 +4152,7 @@ bool dna_adjust::PrepareAdjustmentReverse(const UINT32 currentBlock, bool MT_Rev if (projectSettings_.o._adj_stn_iteration) { adj_file_mutex.lock(); - adj_file << "Skipping reverse adjustment of (isolated) block " << currentBlock+1 << ". Rigorous coordinates produced in forward pass. " << endl << endl; + adj_file << "Skipping reverse adjustment of (isolated) block " << currentBlock+1 << ". Rigorous coordinates produced in forward pass. " << std::endl << std::endl; adj_file_mutex.unlock(); } @@ -4355,15 +4357,15 @@ void dna_adjust::CarryStnEstimatesandVariancesCombine( if (projectSettings_.g.verbose > 0) { - adj_file << endl << "Reverse block " << thisBlock; + adj_file << std::endl << "Reverse block " << thisBlock; if (projectSettings_.a.stage) - adj_file << " phased " << endl; + adj_file << " phased " << std::endl; else - adj_file << " staged " << endl; - adj_file << scientific << setprecision(16) << - "Design " << v_design_.at(thisBlock) << endl << - "AtVinv " << v_AtVinv_.at(thisBlock) << endl << - "Normals " << v_normals_.at(thisBlock) << endl; + adj_file << " staged " << std::endl; + adj_file << std::scientific << std::setprecision(16) << + "Design " << v_design_.at(thisBlock) << std::endl << + "AtVinv " << v_AtVinv_.at(thisBlock) << std::endl << + "Normals " << v_normals_.at(thisBlock) << std::endl; } } @@ -4443,32 +4445,32 @@ void dna_adjust::debug_SolutionInformation(const UINT32& currentBlock) debug_file << "Block " << currentBlock + 1; if (projectSettings_.a.adjust_mode != SimultaneousMode) debug_file << (forward_ ? " (Forward)" : " (Reverse)"); - debug_file << endl; - debug_file << "Pre-adjustment Estimates " << fixed << setprecision(16) << v_estimatedStations_.at(currentBlock); + debug_file << std::endl; + debug_file << "Pre-adjustment Estimates " << std::fixed << std::setprecision(16) << v_estimatedStations_.at(currentBlock); debug_file << "Block " << currentBlock + 1; if (projectSettings_.a.adjust_mode != SimultaneousMode) debug_file << (forward_ ? " (Forward)" : " (Reverse)"); - debug_file << endl; - debug_file << "Design " << fixed << setprecision(16) << v_design_.at(currentBlock); + debug_file << std::endl; + debug_file << "Design " << std::fixed << std::setprecision(16) << v_design_.at(currentBlock); debug_file << "Block " << currentBlock + 1; if (projectSettings_.a.adjust_mode != SimultaneousMode) debug_file << (forward_ ? " (Forward)" : " (Reverse)"); - debug_file << endl; - debug_file << "Measurements " << fixed << setprecision(16) << v_measMinusComp_.at(currentBlock); + debug_file << std::endl; + debug_file << "Measurements " << std::fixed << std::setprecision(16) << v_measMinusComp_.at(currentBlock); debug_file << "Block " << currentBlock + 1; if (projectSettings_.a.adjust_mode != SimultaneousMode) debug_file << (forward_ ? " (Forward)" : " (Reverse)"); - debug_file << endl; - debug_file << "At * V-inv " << fixed << setprecision(16) << v_AtVinv_.at(currentBlock) << endl; + debug_file << std::endl; + debug_file << "At * V-inv " << std::fixed << std::setprecision(16) << v_AtVinv_.at(currentBlock) << std::endl; debug_file << "Block " << currentBlock + 1; if (projectSettings_.a.adjust_mode != SimultaneousMode) debug_file << (forward_ ? " (Forward)" : " (Reverse)"); - debug_file << endl; - debug_file << "Normals " << fixed << setprecision(16) << v_normals_.at(currentBlock) << endl; + debug_file << std::endl; + debug_file << "Normals " << std::fixed << std::setprecision(16) << v_normals_.at(currentBlock) << std::endl; debug_file.flush(); } #ifdef _MS_COMPILER_ @@ -4477,7 +4479,7 @@ void dna_adjust::debug_SolutionInformation(const UINT32& currentBlock) } -void dna_adjust::debug_BlockInformation(const UINT32& currentBlock, const string& adjustment_method) +void dna_adjust::debug_BlockInformation(const UINT32& currentBlock, const std::string& adjustment_method) { #ifdef _MS_COMPILER_ #pragma region debug_output @@ -4495,10 +4497,10 @@ void dna_adjust::debug_BlockInformation(const UINT32& currentBlock, const string else debug_file << " "; } - debug_file << endl; + debug_file << std::endl; - debug_file << "Block " << currentBlock + 1 << " " << adjustment_method << endl; - debug_file << "Adjustment Estimates " << fixed << setprecision(16) << v_estimatedStations_.at(currentBlock); + debug_file << "Block " << currentBlock + 1 << " " << adjustment_method << std::endl; + debug_file << "Adjustment Estimates " << std::fixed << std::setprecision(16) << v_estimatedStations_.at(currentBlock); } #ifdef _MS_COMPILER_ #pragma endregion debug_output @@ -4531,7 +4533,7 @@ void dna_adjust::AdjustPhasedReverseCombine() if (projectSettings_.o._adj_stn_iteration) { - adj_file << endl << left << "Adjusting block " << currentBlock+1; + adj_file << std::endl << std::left << "Adjusting block " << currentBlock+1; if (!v_blockMeta_.at(currentBlock)._blockFirst) adj_file << " (reverse, in isolation)... "; else @@ -4546,7 +4548,7 @@ void dna_adjust::AdjustPhasedReverseCombine() // variances are carried in the reverse direction below if (projectSettings_.g.verbose > 3) - debug_file << "In isolation" << endl; + debug_file << "In isolation" << std::endl; // Backup normals prior to inversion for re-use in combination // adjustment... only if a combination is required @@ -4556,7 +4558,7 @@ void dna_adjust::AdjustPhasedReverseCombine() SolveTry(true, currentBlock); if (projectSettings_.o._adj_stn_iteration) - adj_file << " done." << endl; + adj_file << " done." << std::endl; // Add corrections to estimates. // If --output-adj-iter-stat argument is supplied or currentBlock @@ -4590,17 +4592,17 @@ void dna_adjust::AdjustPhasedReverseCombine() { isCombining_ = true; if (projectSettings_.g.verbose > 3) - debug_file << "Rigorous" << endl; + debug_file << "Rigorous" << std::endl; if (projectSettings_.o._adj_stn_iteration) if (!v_blockMeta_.at(currentBlock)._blockFirst) - adj_file << endl << left << "Adjusting block " << currentBlock+1 << " (reverse, rigorous)... "; + adj_file << std::endl << std::left << "Adjusting block " << currentBlock+1 << " (reverse, rigorous)... "; // Least Squares Solution SolveTry(true, currentBlock); if (projectSettings_.o._adj_stn_iteration) - adj_file << " done." << endl; + adj_file << " done." << std::endl; // shrink msr-comp and AtVinv by pseudomsrJSLCount from forward pass UpdateEstimatesCombine(currentBlock, pseudomsrJSLCount); @@ -4662,7 +4664,7 @@ void dna_adjust::AdjustPhasedReverse() if (projectSettings_.o._adj_stn_iteration) { - adj_file << endl << left << "Adjusting block " << currentBlock+1; + adj_file << std::endl << std::left << "Adjusting block " << currentBlock+1; if (!v_blockMeta_.at(currentBlock)._blockFirst) adj_file << " (reverse, in isolation)... "; else @@ -4677,13 +4679,13 @@ void dna_adjust::AdjustPhasedReverse() // variances are carried in the reverse direction below if (projectSettings_.g.verbose > 3) - debug_file << "In isolation" << endl; + debug_file << "In isolation" << std::endl; // Least Squares Solution SolveTry(true, currentBlock); if (projectSettings_.o._adj_stn_iteration) - adj_file << " done." << endl; + adj_file << " done." << std::endl; // Add corrections to estimates. // If --output-adj-iter-stat argument is supplied or currentBlock @@ -4743,11 +4745,11 @@ void dna_adjust::UpdateEstimatesReverse(const UINT32 currentBlock, bool MT_Rever #ifdef MULTI_THREAD_ADJUST if (projectSettings_.a.multi_thread) { - adj_file << endl << "2> Adjusted block " << currentBlock + 1; + adj_file << std::endl << "2> Adjusted block " << currentBlock + 1; if (v_blockMeta_.at(currentBlock)._blockFirst) - adj_file << " (reverse, rigorous) " << endl; + adj_file << " (reverse, rigorous) " << std::endl; else - adj_file << " (reverse, in isolation) " << endl; + adj_file << " (reverse, in isolation) " << std::endl; } #endif @@ -4866,7 +4868,7 @@ void dna_adjust::UpdateEstimatesFinal(const UINT32 currentBlock) #ifdef MULTI_THREAD_ADJUST adj_file_mutex.lock(); if (projectSettings_.a.multi_thread) - adj_file << endl << "3> Adjusted block " << currentBlock + 1 << " (rigorous)" << endl; + adj_file << std::endl << "3> Adjusted block " << currentBlock + 1 << " (rigorous)" << std::endl; #endif PrintAdjStations(adj_file, currentBlock, @@ -4988,7 +4990,7 @@ bool dna_adjust::InitialiseMeasurement(pit_vmsr_t _it_msr, bool buildnewMatrices void dna_adjust::UpdateDesignNormalMeasMatrices(pit_vmsr_t _it_msr, UINT32& design_row, bool buildnewMatrices, const UINT32& block, bool MT_ReverseOrCombine) { - stringstream ss; + std::stringstream ss; matrix_2d* estimatedStations(&v_estimatedStations_.at(block)); matrix_2d* design(&v_design_.at(block)); @@ -5102,80 +5104,80 @@ void dna_adjust::UpdateDesignNormalMeasMatrices(pit_vmsr_t _it_msr, UINT32& desi break; default: ss << "UpdateDesignNormalMeasMatrices(): Unknown measurement type - '" << - (*_it_msr)->measType << "'." << endl; + (*_it_msr)->measType << "'." << std::endl; SignalExceptionAdjustment(ss.str(), block); } } -void dna_adjust::PrintMsrVarianceMatrixException(const it_vmsr_t& _it_msr, const runtime_error& e, stringstream& ss, - const string& calling_function, const UINT32 msr_count) +void dna_adjust::PrintMsrVarianceMatrixException(const it_vmsr_t& _it_msr, const std::runtime_error& e, std::stringstream& ss, + const std::string& calling_function, const UINT32 msr_count) { it_vmsr_t _it_msr_temp(_it_msr); switch (_it_msr->measType) { case 'D': - ss << calling_function << "(): Cannot compute the" << endl << - " variance matrix for a round of " << msr_count << " directions commencing" << endl << + ss << calling_function << "(): Cannot compute the" << std::endl << + " variance matrix for a round of " << msr_count << " directions commencing" << std::endl << " with stations " << bstBinaryRecords_.at(_it_msr->station1).stationName << " and " << - bstBinaryRecords_.at(_it_msr->station2).stationName << ":" << endl; + bstBinaryRecords_.at(_it_msr->station2).stationName << ":" << std::endl; - ss << " ..." << endl << - " " << FormatDmsString(RadtoDms(_it_msr->term1), PRECISION_SEC_MSR, true, false) << "" << endl << - " ..." << endl << endl; + ss << " ..." << std::endl << + " " << FormatDmsString(RadtoDms(_it_msr->term1), PRECISION_SEC_MSR, true, false) << "" << std::endl << + " ..." << std::endl << std::endl; break; case 'G': - ss << calling_function << "(): Cannot invert the" << endl << + ss << calling_function << "(): Cannot invert the" << std::endl << " variance matrix for a GPS baseline between stations " << bstBinaryRecords_.at(_it_msr->station1).stationName << " and " << - bstBinaryRecords_.at(_it_msr->station2).stationName << ":" << endl; + bstBinaryRecords_.at(_it_msr->station2).stationName << ":" << std::endl; - ss << " ..." << endl << - " " << fixed << setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << endl; + ss << " ..." << std::endl << + " " << std::fixed << std::setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << std::endl; _it_msr_temp++; - ss << " " << fixed << setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << endl; + ss << " " << std::fixed << std::setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << std::endl; _it_msr_temp++; - ss << " " << fixed << setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << endl << - " ..." << endl << endl; + ss << " " << std::fixed << std::setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << std::endl << + " ..." << std::endl << std::endl; break; case 'X': - ss << calling_function << "(): Cannot invert the" << endl << - " variance matrix for a " << msr_count << "-baseline GPS baseline cluster commencing" << endl << + ss << calling_function << "(): Cannot invert the" << std::endl << + " variance matrix for a " << msr_count << "-baseline GPS baseline cluster commencing" << std::endl << " with stations " << bstBinaryRecords_.at(_it_msr->station1).stationName << " and " << - bstBinaryRecords_.at(_it_msr->station2).stationName << ":" << endl; + bstBinaryRecords_.at(_it_msr->station2).stationName << ":" << std::endl; - ss << " ..." << endl << - " " << fixed << setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << endl; + ss << " ..." << std::endl << + " " << std::fixed << std::setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << std::endl; _it_msr_temp++; - ss << " " << fixed << setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << endl; + ss << " " << std::fixed << std::setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << std::endl; _it_msr_temp++; - ss << " " << fixed << setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << endl << - " ..." << endl << endl; + ss << " " << std::fixed << std::setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << std::endl << + " ..." << std::endl << std::endl; break; case 'Y': - ss << calling_function << "(): Cannot invert the" << endl << - " variance matrix for a " << msr_count << "-station GPS point cluster commencing" << endl << - " with station " << bstBinaryRecords_.at(_it_msr->station1).stationName << ":" << endl; + ss << calling_function << "(): Cannot invert the" << std::endl << + " variance matrix for a " << msr_count << "-station GPS point cluster commencing" << std::endl << + " with station " << bstBinaryRecords_.at(_it_msr->station1).stationName << ":" << std::endl; - ss << " ..." << endl << - " " << fixed << setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << endl; + ss << " ..." << std::endl << + " " << std::fixed << std::setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << std::endl; _it_msr_temp++; - ss << " " << fixed << setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << endl; + ss << " " << std::fixed << std::setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << std::endl; _it_msr_temp++; - ss << " " << fixed << setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << endl << - " ..." << endl << endl; + ss << " " << std::fixed << std::setprecision(PRECISION_MTR_MSR) << _it_msr_temp->term1 << "" << std::endl << + " ..." << std::endl << std::endl; break; } ss << - " Detailed description: " << e.what() << endl << - " Options: " << endl << - " - Check the validity of the variance matrix and any relevant " << endl << - " scalars and re-attempt the adjustment." << endl << - " - If this fails, set the ignore flag in the measurement file and re-import " << endl << - " the station and measurement files." << endl; - - adj_file << " " << ss.str() << endl; + " Detailed description: " << e.what() << std::endl << + " Options: " << std::endl << + " - Check the validity of the variance matrix and any relevant " << std::endl << + " scalars and re-attempt the adjustment." << std::endl << + " - If this fails, set the ignore flag in the measurement file and re-import " << std::endl << + " the station and measurement files." << std::endl; + + adj_file << " " << ss.str() << std::endl; adj_file.flush(); } @@ -5194,10 +5196,10 @@ void dna_adjust::LoadVarianceMatrix_D(it_vmsr_t _it_msr, matrix_2d* var_dirn, bo FormInverseVarianceMatrix(var_dirn, true); return; } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { // Print error message to adj file and throw exception - stringstream ss; + std::stringstream ss; PrintMsrVarianceMatrixException(_it_msr, e, ss, "LoadVarianceMatrix_D"); SignalExceptionAdjustment(ss.str(), 0); } @@ -5231,7 +5233,7 @@ void dna_adjust::LoadVarianceMatrix_D(it_vmsr_t _it_msr, matrix_2d* var_dirn, bo UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); if (projectSettings_.g.verbose > 5) - debug_file << endl << "Std dev " << scientific << setprecision(16) << _it_msr->term2 << " (" << fixed << setprecision(2) << Seconds(sqrt(_it_msr->term2)) << " seconds)" << endl; + debug_file << std::endl << "Std dev " << std::scientific << std::setprecision(16) << _it_msr->term2 << " (" << std::fixed << std::setprecision(2) << Seconds(sqrt(_it_msr->term2)) << " boost::posix_time::seconds)" << std::endl; _it_msr++; @@ -5258,7 +5260,7 @@ void dna_adjust::LoadVarianceMatrix_D(it_vmsr_t _it_msr, matrix_2d* var_dirn, bo AV.put(a, a+1, _it_msr->term2); if (projectSettings_.g.verbose > 5) - debug_file << "Std dev " << scientific << setprecision(16) << _it_msr->term2 << " (" << fixed << setprecision(2) << Seconds(sqrt(_it_msr->term2)) << " seconds)" << endl; + debug_file << "Std dev " << std::scientific << std::setprecision(16) << _it_msr->term2 << " (" << std::fixed << std::setprecision(2) << Seconds(sqrt(_it_msr->term2)) << " boost::posix_time::seconds)" << std::endl; if (a+1 == angle_count) break; @@ -5269,9 +5271,9 @@ void dna_adjust::LoadVarianceMatrix_D(it_vmsr_t _it_msr, matrix_2d* var_dirn, bo if (projectSettings_.g.verbose > 6) { - debug_file << endl << "Directions variance matrix:" << endl; - debug_file << "A" << A << endl; - debug_file << "AV" << scientific << setprecision(16) << AV << endl; + debug_file << std::endl << "Directions variance matrix:" << std::endl; + debug_file << "A" << A << std::endl; + debug_file << "AV" << std::scientific << std::setprecision(16) << AV << std::endl; } // AVAT for correlated angles will not be a fully populated matrix, but a @@ -5295,26 +5297,26 @@ void dna_adjust::LoadVarianceMatrix_D(it_vmsr_t _it_msr, matrix_2d* var_dirn, bo SetDirectionsVarianceMatrix(_it_msr_first, *var_dirn); if (projectSettings_.g.verbose > 5) - debug_file << "V.dxyz " << scientific << setprecision(16) << setw(26) << var_dirn; + debug_file << "V.dxyz " << std::scientific << std::setprecision(16) << std::setw(26) << var_dirn; // Form inverse FormInverseVarianceMatrix(var_dirn); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { // Print error message to adj file and throw exception - stringstream ss; + std::stringstream ss; PrintMsrVarianceMatrixException(_it_msr_first, e, ss, "LoadVarianceMatrix_D"); SignalExceptionAdjustment(ss.str(), 0); } if (projectSettings_.g.verbose > 5) - debug_file << "Inv V.dxyz " << scientific << setprecision(16) << setw(26) << var_dirn; + debug_file << "Inv V.dxyz " << std::scientific << std::setprecision(16) << std::setw(26) << var_dirn; } bool dna_adjust::FormInverseVarianceMatrixReduced(it_vmsr_t _it_msr, matrix_2d* var_cart, - const string& method_name) + const std::string& method_name) { // Has the variance matrix already been reduced (i.e. propagated and scaled) if (bms_meta_.reduced) @@ -5325,10 +5327,10 @@ bool dna_adjust::FormInverseVarianceMatrixReduced(it_vmsr_t _it_msr, matrix_2d* FormInverseGPSVarianceMatrix(_it_msr, var_cart); return true; } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { // Print error message to adj file and throw exception - stringstream ss; + std::stringstream ss; PrintMsrVarianceMatrixException(_it_msr, e, ss, method_name); SignalExceptionAdjustment(ss.str(), 0); } @@ -5415,22 +5417,22 @@ void dna_adjust::LoadVarianceMatrix_G(it_vmsr_t _it_msr, matrix_2d* var_cart) if (boost::math::isnan(var_cart->get(0, 0)) || boost::math::isinf(var_cart->get(0, 0))) { - stringstream ss; - ss << "Invalid variance matrix:" << endl; - ss << setprecision(6) << fixed << *var_cart; + std::stringstream ss; + ss << "Invalid variance matrix:" << std::endl; + ss << std::setprecision(6) << std::fixed << *var_cart; SignalExceptionAdjustment(ss.str(), 0); } } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { // Print error message to adj file and throw exception - stringstream ss; + std::stringstream ss; PrintMsrVarianceMatrixException(_it_msr_first, e, ss, "LoadVarianceMatrix_G"); SignalExceptionAdjustment(ss.str(), 0); } if (projectSettings_.g.verbose > 5) - debug_file << endl << "Inv V.dxyz " << fixed << setprecision(16) << setw(26) << var_cart; + debug_file << std::endl << "Inv V.dxyz " << std::fixed << std::setprecision(16) << std::setw(26) << var_cart; } @@ -5556,22 +5558,22 @@ void dna_adjust::LoadVarianceMatrix_X(it_vmsr_t _it_msr, matrix_2d* var_cart) if (boost::math::isnan(var_cart->get(0, 0)) || boost::math::isinf(var_cart->get(0, 0))) { - stringstream ss; - ss << "Invalid variance matrix:" << endl; - ss << setprecision(6) << fixed << *var_cart; + std::stringstream ss; + ss << "Invalid variance matrix:" << std::endl; + ss << std::setprecision(6) << std::fixed << *var_cart; SignalExceptionAdjustment(ss.str(), 0); } } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { // Print error message to adj file and throw exception - stringstream ss; + std::stringstream ss; PrintMsrVarianceMatrixException(_it_msr_first, e, ss, "LoadVarianceMatrix_X", baseline_count); SignalExceptionAdjustment(ss.str(), 0); } if (projectSettings_.g.verbose > 5) - debug_file << endl << "Inv V.dxyz " << fixed << setprecision(16) << setw(26) << var_cart; + debug_file << std::endl << "Inv V.dxyz " << std::fixed << std::setprecision(16) << std::setw(26) << var_cart; } @@ -5784,22 +5786,22 @@ void dna_adjust::LoadVarianceMatrix_Y(it_vmsr_t _it_msr, matrix_2d* var_cart, co if (boost::math::isnan(var_cart->get(0, 0)) || boost::math::isinf(var_cart->get(0, 0))) { - stringstream ss; - ss << "Invalid variance matrix:" << endl; - ss << setprecision(6) << fixed << *var_cart; + std::stringstream ss; + ss << "Invalid variance matrix:" << std::endl; + ss << std::setprecision(6) << std::fixed << *var_cart; SignalExceptionAdjustment(ss.str(), 0); } } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { // Print error message to adj file and throw exception - stringstream ss; + std::stringstream ss; PrintMsrVarianceMatrixException(_it_msr_first, e, ss, "LoadVarianceMatrix_Y", point_count); SignalExceptionAdjustment(ss.str(), 0); } if (projectSettings_.g.verbose > 5) - debug_file << endl << "Inv V.dxyz " << fixed << setprecision(16) << setw(26) << var_cart; + debug_file << std::endl << "Inv V.dxyz " << std::fixed << std::setprecision(16) << std::setw(26) << var_cart; } @@ -5867,11 +5869,11 @@ void dna_adjust::AddMsrtoMeasMinusComp(pit_vmsr_t _it_msr, const UINT32& design_ if (printBlock) debug_file << bstBinaryRecords_.at((*_it_msr)->station1).stationName << " - " << bstBinaryRecords_.at((*_it_msr)->station2).stationName; - debug_file << endl; - debug_file << "d" << (*_it_msr)->measType << " " << fixed << setprecision(16) << setw(26) << + debug_file << std::endl; + debug_file << "d" << (*_it_msr)->measType << " " << std::fixed << std::setprecision(16) << std::setw(26) << mmc << - " = " << setw(26) << (*_it_msr)->term1 << - " - " << setw(26) << comp_msr << " "; + " = " << std::setw(26) << (*_it_msr)->term1 << + " - " << std::setw(26) << comp_msr << " "; } } @@ -6273,10 +6275,10 @@ void dna_adjust::UpdateDesignNormalMeasMatrices_D(pit_vmsr_t _it_msr, UINT32& de if (projectSettings_.g.verbose > 6) { - debug_file << endl << "angle " << + debug_file << std::endl << "angle " << StringFromT(RadtoDms(it_angle->term1), 6) << " = " << StringFromT(RadtoDms((*_it_msr)->term1), 6) << " - " << - StringFromT(RadtoDms(previousDirection), 6) << endl; + StringFromT(RadtoDms(previousDirection), 6) << std::endl; } } } @@ -6320,9 +6322,9 @@ void dna_adjust::UpdateDesignNormalMeasMatrices_D(pit_vmsr_t _it_msr, UINT32& de catch (...) { // Print error message to adj file and throw exception - stringstream ss; - ss << "UpdateDesignNormalMeasMatrices_D(): An error was encountered whilst" << endl << - " updating the normal matrices" << endl; + std::stringstream ss; + ss << "UpdateDesignNormalMeasMatrices_D(): An error was encountered whilst" << std::endl << + " updating the normal matrices" << std::endl; SignalExceptionAdjustment(ss.str(), block); } @@ -6341,7 +6343,7 @@ void dna_adjust::UpdateDesignNormalMeasMatrices_D(pit_vmsr_t _it_msr, UINT32& de AtVinv->zero(0, design_row, AtVinv->rows(), angle_count); if (!buildnewMatrices) - debug_file << "block " << block + 1 << ", design_row " << design_row + 1 << ", directions var" << var_dirn << endl; + debug_file << "block " << block + 1 << ", design_row " << design_row + 1 << ", directions var" << var_dirn << std::endl; // Update AtVinv based on new design matrix elements for (a=0; a 5) - debug_file << endl; + debug_file << std::endl; } matrix_2d var_cart(baseline_count * 3, baseline_count * 3); @@ -7236,7 +7238,7 @@ void dna_adjust::UpdateDesignNormalMeasMatrices_X(pit_vmsr_t _it_msr, UINT32& de baseline_stations.push_back(GetBlkMatrixElemStn1(block, &_it_msr_temp)); baseline_stations.push_back(GetBlkMatrixElemStn2(block, &_it_msr_temp)); - sort(baseline_stations.begin(), baseline_stations.end()); + std::sort(baseline_stations.begin(), baseline_stations.end()); covc = baseline_count * 3; matrix_2d tmp(3, covc); @@ -7251,13 +7253,13 @@ void dna_adjust::UpdateDesignNormalMeasMatrices_X(pit_vmsr_t _it_msr, UINT32& de if (!binary_search(baseline_stations.begin(), baseline_stations.end(), stn1)) { baseline_stations.push_back(stn1); - sort(baseline_stations.begin(), baseline_stations.end()); + std::sort(baseline_stations.begin(), baseline_stations.end()); } if (!binary_search(baseline_stations.begin(), baseline_stations.end(), stn2)) { baseline_stations.push_back(stn2); - sort(baseline_stations.begin(), baseline_stations.end()); + std::sort(baseline_stations.begin(), baseline_stations.end()); } covr = cluster_bsl * 3; @@ -7766,7 +7768,7 @@ void dna_adjust::SolveTry(bool COMPUTE_INVERSE, const UINT32& block) try { Solve(COMPUTE_INVERSE, block); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { // debug matrices if required debug_SolutionInformation(block); @@ -7823,9 +7825,9 @@ void dna_adjust::Solve(bool COMPUTE_INVERSE, const UINT32& block) if (boost::math::isnan(v_normals_.at(block).get(0, 0)) || boost::math::isinf(v_normals_.at(block).get(0, 0))) { - stringstream ss; - ss << "Solve(): Invalid variance matrix:" << endl; - ss << setprecision(6) << fixed << v_normals_.at(block); + std::stringstream ss; + ss << "Solve(): Invalid variance matrix:" << std::endl; + ss << std::setprecision(6) << std::fixed << v_normals_.at(block); SignalExceptionAdjustment(ss.str(), 0); } @@ -7850,8 +7852,8 @@ void dna_adjust::Solve(bool COMPUTE_INVERSE, const UINT32& block) debug_file << "Block " << block + 1; if (projectSettings_.a.adjust_mode != SimultaneousMode) debug_file << (forward_ ? " (Forward)" : " (Reverse)"); - debug_file << endl; - debug_file << "Precisions" << fixed << setprecision(16) << v_normals_.at(block) << endl; + debug_file << std::endl; + debug_file << "Precisions" << std::fixed << std::setprecision(16) << v_normals_.at(block) << std::endl; } // compute weighted "measured minus computed" @@ -7897,18 +7899,18 @@ void dna_adjust::Solve(bool COMPUTE_INVERSE, const UINT32& block) break; } - debug_file << endl; + debug_file << std::endl; debug_file << "Block " << block + 1; if (projectSettings_.a.adjust_mode != SimultaneousMode) debug_file << (forward_ ? " (Forward)" : " (Reverse)"); - debug_file << endl; - debug_file << "Weighted measurements" << fixed << setprecision(16) << At_Vinv_m << endl; + debug_file << std::endl; + debug_file << "Weighted measurements" << std::fixed << std::setprecision(16) << At_Vinv_m << std::endl; debug_file << "Block " << block + 1; if (projectSettings_.a.adjust_mode != SimultaneousMode) debug_file << (forward_ ? " (Forward)" : " (Reverse)"); - debug_file << endl; - debug_file << "Corrections" << fixed << setprecision(16) << v_corrections_.at(block) << endl; + debug_file << std::endl; + debug_file << "Corrections" << std::fixed << std::setprecision(16) << v_corrections_.at(block) << std::endl; debug_file.flush(); #ifdef MULTI_THREAD_ADJUST @@ -7952,11 +7954,11 @@ void dna_adjust::DeSerialiseAdjustedVarianceMatrices() SetMapRegions(2, sf_rigorous_vars, sf_prec_adj_msrs); } - catch (interprocess_exception& e){ - stringstream ss; - ss << "DeSerialiseAdjustedVarianceMatrices() terminated while creating memory map" << endl; - ss << " regions from mtx file. Details:\n " << e.what() << endl; - adj_file << endl << "- Error: " << ss.str() << endl; + catch (boost::interprocess::interprocess_exception& e){ + std::stringstream ss; + ss << "DeSerialiseAdjustedVarianceMatrices() terminated while creating memory map" << std::endl; + ss << " regions from mtx file. Details:\n " << e.what() << std::endl; + adj_file << std::endl << "- Error: " << ss.str() << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -8069,10 +8071,10 @@ void dna_adjust::ComputeTestStat(const double& dof, double& chiUpper, double& ch try { // chi_squared throws when dof == 0 - chi_squared dist(dof); + boost::math::chi_squared dist(dof); - chiUpper = quantile(complement(dist, conf)) / degreesofFreedom_; - chiLower = quantile(dist, conf) / degreesofFreedom_; + chiUpper = boost::math::quantile(boost::math::complement(dist, conf)) / degreesofFreedom_; + chiLower = boost::math::quantile(dist, conf) / degreesofFreedom_; switch (projectSettings_.a.adjust_mode) { @@ -8097,11 +8099,11 @@ void dna_adjust::ComputeTestStat(const double& dof, double& chiUpper, double& ch // just print message to output files if (projectSettings_.g.verbose > 0) - debug_file << endl << "ComputeTestStat():\n " << e.what() << endl; + debug_file << std::endl << "ComputeTestStat():\n " << e.what() << std::endl; if (projectSettings_.g.verbose > 0) if (dof == 0) - adj_file << endl << "Cannot perform chi-square test with zero degrees of freedom." << endl << endl; + adj_file << std::endl << "Cannot perform chi-square test with zero degrees of freedom." << std::endl << std::endl; passFail = test_stat_fail; } @@ -8126,7 +8128,7 @@ void dna_adjust::ComputeBlockTestStat(const UINT32& block) v_sigmaZero_.at(block), passFail); - // vector is a specialisation, and as such the value + // std::vector is a specialisation, and as such the value // returned from at() is not a bool, but a wrapper around a value v_passFail_.at(block) = passFail; } @@ -8538,7 +8540,7 @@ void dna_adjust::ComputeChiSquarePhased(const UINT32& block) } -void dna_adjust::OutputLargestCorrection(string& formatted_msg) +void dna_adjust::OutputLargestCorrection(std::string& formatted_msg) { UINT32 stnIndex(0), x_coordElement(0); @@ -8548,7 +8550,7 @@ void dna_adjust::OutputLargestCorrection(string& formatted_msg) sf_corrections); // print maximum correction - adj_file << setw(PRINT_VAR_PAD) << left << "Maximum station correction"; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Maximum station correction"; // which station? stnIndex = (UINT32)floor(v_corrections_.at(blockLargeCorr_).maxvalueRow() / 3.); @@ -8568,7 +8570,7 @@ void dna_adjust::OutputLargestCorrection(string& formatted_msg) break; } - adj_file << endl << setw(PRINT_VAR_PAD) << " "; + adj_file << std::endl << std::setw(PRINT_VAR_PAD) << " "; // calculate error vector in local reference frame matrix_2d cart(3, 1), local(3, 1); @@ -8600,31 +8602,31 @@ void dna_adjust::OutputLargestCorrection(string& formatted_msg) double largestCorr = local.compute_maximum_value(); if (fabs(largestCorr) > 0.000999) - adj_file << fixed << setprecision(3) << + adj_file << std::fixed << std::setprecision(3) << local.get(0, 0) << ", " << local.get(1, 0) << ", " << local.get(2, 0); else if (fabs(largestCorr) > 0.00009) - adj_file << fixed << setprecision(4) << + adj_file << std::fixed << std::setprecision(4) << local.get(0, 0) << ", " << local.get(1, 0) << ", " << local.get(2, 0); else - adj_file << scientific << setprecision(1) << + adj_file << std::scientific << std::setprecision(1) << local.get(0, 0) << ", " << local.get(1, 0) << ", " << local.get(2, 0); - adj_file << " (e, n, up)" << endl << endl; + adj_file << " (e, n, up)" << std::endl << std::endl; - stringstream ss; - ss << fixed << setprecision(PRECISION_MTR_STN) << local.get(local.maxvalueRow(), 0) << " "; + std::stringstream ss; + ss << std::fixed << std::setprecision(PRECISION_MTR_STN) << local.get(local.maxvalueRow(), 0) << " "; switch (local.maxvalueRow()) { case 0: - ss << setw(2) << left << "e"; + ss << std::setw(2) << std::left << "e"; break; case 1: - ss << setw(2) << left << "n"; + ss << std::setw(2) << std::left << "n"; break; case 2: - ss << setw(2) << left << "up"; + ss << std::setw(2) << std::left << "up"; break; } @@ -8635,12 +8637,12 @@ void dna_adjust::OutputLargestCorrection(string& formatted_msg) void dna_adjust::PrintStatistics(bool printPelzer) { // print statistics - adj_file << setw(PRINT_VAR_PAD) << left << "Number of unknown parameters" << fixed << setprecision(0) << unknownParams_; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Number of unknown parameters" << std::fixed << std::setprecision(0) << unknownParams_; if (allStationsFixed_) adj_file << " (All stations held constrained)"; - adj_file << endl; + adj_file << std::endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Number of measurements" << fixed << setprecision(0) << measurementParams_; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Number of measurements" << std::fixed << std::setprecision(0) << measurementParams_; if (potentialOutlierCount_ > 0) { adj_file << " (" << potentialOutlierCount_ << " potential outlier"; @@ -8648,25 +8650,25 @@ void dna_adjust::PrintStatistics(bool printPelzer) adj_file << "s"; adj_file << ")"; } - adj_file << endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Degrees of freedom" << fixed << setprecision(0) << degreesofFreedom_ << endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Chi squared" << fixed << setprecision(2) << chiSquared_ << endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Rigorous Sigma Zero" << fixed << setprecision(3) << sigmaZero_ << endl; + adj_file << std::endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Degrees of freedom" << std::fixed << std::setprecision(0) << degreesofFreedom_ << std::endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Chi squared" << std::fixed << std::setprecision(2) << chiSquared_ << std::endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Rigorous Sigma Zero" << std::fixed << std::setprecision(3) << sigmaZero_ << std::endl; if (printPelzer) - adj_file << setw(PRINT_VAR_PAD) << left << "Global (Pelzer) Reliability" << fixed << setw(8) << setprecision(3) << globalPelzerReliability_ << - "(excludes non redundant measurements)" << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Global (Pelzer) Reliability" << std::fixed << std::setw(8) << std::setprecision(3) << globalPelzerReliability_ << + "(excludes non redundant measurements)" << std::endl; - adj_file << endl; + adj_file << std::endl; - stringstream ss(""); - ss << "Chi-Square test (" << setprecision (1) << fixed << projectSettings_.a.confidence_interval << "%)"; - adj_file << setw(PRINT_VAR_PAD) << left << ss.str(); + std::stringstream ss(""); + ss << "Chi-Square test (" << std::setprecision(1) << std::fixed << projectSettings_.a.confidence_interval << "%)"; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << ss.str(); ss.str(""); - ss << fixed << setprecision(3) << + ss << std::fixed << std::setprecision(3) << chiSquaredLowerLimit_ << " < " << sigmaZero_ << " < " << chiSquaredUpperLimit_; - adj_file << setw(CHISQRLIMITS) << left << ss.str(); + adj_file << std::setw(CHISQRLIMITS) << std::left << ss.str(); ss.str(""); if (degreesofFreedom_ < 1) @@ -8688,7 +8690,7 @@ void dna_adjust::PrintStatistics(bool printPelzer) } ss << " ***"; } - adj_file << setw(PASS_FAIL) << right << ss.str() << endl << endl; + adj_file << std::setw(PASS_FAIL) << std::right << ss.str() << std::endl << std::endl; } @@ -8775,9 +8777,9 @@ void dna_adjust::ComputePrecisionAdjMsrs(const UINT32& block /*= 0*/) aposterioriVariances, design_row, precadjmsr_row); break; default: - stringstream ss; - ss << "ComputePrecisionAdjMsrs(): Unknown measurement type - '" << static_cast(&(_it_msr->measType)) << - "'." << endl; + std::stringstream ss; + ss << "ComputePrecisionAdjMsrs(): Unknown measurement type - '" << static_cast(&(_it_msr->measType)) << + "'." << std::endl; SignalExceptionAdjustment(ss.str(), block); } } @@ -9494,7 +9496,7 @@ void dna_adjust::OpenOutputFileStreams() // Create adj file. Throws runtime_error on failure. file_opener(adj_file, projectSettings_.o._adj_file); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -9502,7 +9504,7 @@ void dna_adjust::OpenOutputFileStreams() // Create xyz file. Throws runtime_error on failure. file_opener(xyz_file, projectSettings_.o._xyz_file); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -9511,7 +9513,7 @@ void dna_adjust::OpenOutputFileStreams() #endif if (projectSettings_.g.verbose > 0) { - string debug_output_file = + std::string debug_output_file = projectSettings_.g.output_folder + FOLDER_SLASH + projectSettings_.g.network_name; switch (projectSettings_.a.adjust_mode) @@ -9541,7 +9543,7 @@ void dna_adjust::OpenOutputFileStreams() // Create debug file. Throws runtime_error on failure. file_opener(debug_file, debug_output_file); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } } @@ -9563,103 +9565,103 @@ void dna_adjust::PrintOutputFileHeaderInfo() // Print formatted header print_file_header(xyz_file, "DYNADJUST COORDINATE OUTPUT FILE"); - adj_file << setw(PRINT_VAR_PAD) << left << "File name:" << system_complete(projectSettings_.o._adj_file).string() << endl << endl; - xyz_file << setw(PRINT_VAR_PAD) << left << "File name:" << system_complete(projectSettings_.o._xyz_file).string() << endl << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "File name:" << boost::filesystem::system_complete(projectSettings_.o._adj_file).string() << std::endl << std::endl; + xyz_file << std::setw(PRINT_VAR_PAD) << std::left << "File name:" << boost::filesystem::system_complete(projectSettings_.o._xyz_file).string() << std::endl << std::endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Command line arguments: "; - adj_file << projectSettings_.a.command_line_arguments << endl << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Command line arguments: "; + adj_file << projectSettings_.a.command_line_arguments << std::endl << std::endl; if (projectSettings_.i.input_files.empty()) { - adj_file << setw(PRINT_VAR_PAD) << left << "Stations file:" << system_complete(projectSettings_.a.bst_file).string() << endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Measurements file:" << system_complete(projectSettings_.a.bms_file).string() << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Stations file:" << boost::filesystem::system_complete(projectSettings_.a.bst_file).string() << std::endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Measurements file:" << boost::filesystem::system_complete(projectSettings_.a.bms_file).string() << std::endl; } else { _it_vstr _it_files(projectSettings_.i.input_files.begin()); - string s("Input files:"); + std::string s("Input files:"); while (_it_files!=projectSettings_.i.input_files.end()) { - adj_file << setw(PRINT_VAR_PAD) << left << s << *_it_files++ << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << s << *_it_files++ << std::endl; s = " "; } } // Reference frame - adj_file << setw(PRINT_VAR_PAD) << left << "Reference frame: " << datum_.GetName() << endl; - xyz_file << setw(PRINT_VAR_PAD) << left << "Reference frame: " << datum_.GetName() << endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Epoch: " << datum_.GetEpoch_s() << endl; - xyz_file << setw(PRINT_VAR_PAD) << left << "Epoch: " << datum_.GetEpoch_s() << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Reference frame: " << datum_.GetName() << std::endl; + xyz_file << std::setw(PRINT_VAR_PAD) << std::left << "Reference frame: " << datum_.GetName() << std::endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Epoch: " << datum_.GetEpoch_s() << std::endl; + xyz_file << std::setw(PRINT_VAR_PAD) << std::left << "Epoch: " << datum_.GetEpoch_s() << std::endl; // Geoid model - adj_file << setw(PRINT_VAR_PAD) << left << "Geoid model: " << system_complete(projectSettings_.n.ntv2_geoid_file).string() << endl; - xyz_file << setw(PRINT_VAR_PAD) << left << "Geoid model: " << system_complete(projectSettings_.n.ntv2_geoid_file).string() << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Geoid model: " << boost::filesystem::system_complete(projectSettings_.n.ntv2_geoid_file).string() << std::endl; + xyz_file << std::setw(PRINT_VAR_PAD) << std::left << "Geoid model: " << boost::filesystem::system_complete(projectSettings_.n.ntv2_geoid_file).string() << std::endl; switch (projectSettings_.a.adjust_mode) { case PhasedMode: case Phased_Block_1Mode: - adj_file << setw(PRINT_VAR_PAD) << left << "Segmentation file:" << projectSettings_.a.seg_file << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Segmentation file:" << projectSettings_.a.seg_file << std::endl; } - adj_file << setw(PRINT_VAR_PAD) << left << "Constrained Station S.D. (m):" << projectSettings_.a.fixed_std_dev << endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Free Station S.D. (m):" << projectSettings_.a.free_std_dev << endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Iteration threshold:" << projectSettings_.a.iteration_threshold << endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Maximum iterations:" << setprecision(0) << fixed << projectSettings_.a.max_iterations << endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Test confidence interval:" << setprecision(1) << fixed << projectSettings_.a.confidence_interval << "%" << endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Uncertainties SD(e,n,up):" << setprecision(1) << "68.3% (1 sigma)" << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Constrained Station S.D. (m):" << projectSettings_.a.fixed_std_dev << std::endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Free Station S.D. (m):" << projectSettings_.a.free_std_dev << std::endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Iteration threshold:" << projectSettings_.a.iteration_threshold << std::endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Maximum iterations:" << std::setprecision(0) << std::fixed << projectSettings_.a.max_iterations << std::endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Test confidence interval:" << std::setprecision(1) << std::fixed << projectSettings_.a.confidence_interval << "%" << std::endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Uncertainties SD(e,n,up):" << std::setprecision(1) << "68.3% (1 sigma)" << std::endl; if (!projectSettings_.a.station_constraints.empty()) - adj_file << setw(PRINT_VAR_PAD) << left << "Station constraints:" << projectSettings_.a.station_constraints << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Station constraints:" << projectSettings_.a.station_constraints << std::endl; trimstr(projectSettings_.a.comments); - adj_file << setw(PRINT_VAR_PAD) << left << "Station coordinate types:"; - xyz_file << setw(PRINT_VAR_PAD) << left << "Station coordinate types:"; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Station coordinate types:"; + xyz_file << std::setw(PRINT_VAR_PAD) << std::left << "Station coordinate types:"; - adj_file << projectSettings_.o._stn_coord_types << endl; - xyz_file << projectSettings_.o._stn_coord_types << endl; + adj_file << projectSettings_.o._stn_coord_types << std::endl; + xyz_file << projectSettings_.o._stn_coord_types << std::endl; - adj_file << setw(PRINT_VAR_PAD) << left << "Stations printed in blocks:"; - xyz_file << setw(PRINT_VAR_PAD) << left << "Stations printed in blocks:"; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Stations printed in blocks:"; + xyz_file << std::setw(PRINT_VAR_PAD) << std::left << "Stations printed in blocks:"; if (projectSettings_.a.adjust_mode != SimultaneousMode && projectSettings_.o._output_stn_blocks) { - adj_file << "Yes" << endl; - xyz_file << "Yes" << endl; + adj_file << "Yes" << std::endl; + xyz_file << "Yes" << std::endl; } else { - adj_file << "No" << endl; - xyz_file << "No" << endl; + adj_file << "No" << std::endl; + xyz_file << "No" << std::endl; } if (projectSettings_.o._stn_corr) { - adj_file << setw(PRINT_VAR_PAD) << left << "Station coordinate corrections:" << - "Yes" << endl; - xyz_file << setw(PRINT_VAR_PAD) << left << "Station coordinate corrections:" << - "Yes" << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Station coordinate corrections:" << + "Yes" << std::endl; + xyz_file << std::setw(PRINT_VAR_PAD) << std::left << "Station coordinate corrections:" << + "Yes" << std::endl; } if (projectSettings_.o._apply_type_b_file || projectSettings_.o._apply_type_b_global) { if (projectSettings_.o._apply_type_b_global) { - adj_file << setw(PRINT_VAR_PAD) << left << "Type B uncertainties:" << - projectSettings_.a.type_b_global << endl; - xyz_file << setw(PRINT_VAR_PAD) << left << "Type B uncertainties:" << - projectSettings_.a.type_b_global << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Type B uncertainties:" << + projectSettings_.a.type_b_global << std::endl; + xyz_file << std::setw(PRINT_VAR_PAD) << std::left << "Type B uncertainties:" << + projectSettings_.a.type_b_global << std::endl; } if (projectSettings_.o._apply_type_b_file) { - adj_file << setw(PRINT_VAR_PAD) << left << "Type B uncertainty file:" << - system_complete(projectSettings_.a.type_b_file).string() << endl; - xyz_file << setw(PRINT_VAR_PAD) << left << "Type B uncertainty file:" << - system_complete(projectSettings_.a.type_b_file).string() << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << "Type B uncertainty file:" << + boost::filesystem::system_complete(projectSettings_.a.type_b_file).string() << std::endl; + xyz_file << std::setw(PRINT_VAR_PAD) << std::left << "Type B uncertainty file:" << + boost::filesystem::system_complete(projectSettings_.a.type_b_file).string() << std::endl; } } @@ -9673,23 +9675,23 @@ void dna_adjust::PrintOutputFileHeaderInfo() if (!projectSettings_.a.comments.empty()) { size_t s(0), t(0); - string var("Comments: "), comments(projectSettings_.a.comments); + std::string var("Comments: "), comments(projectSettings_.a.comments); size_t pos = 0; while (s < comments.length()) { if (s + PRINT_VAL_PAD >= comments.length()) { - adj_file << setw(PRINT_VAR_PAD) << left << var << comments.substr(s) << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << var << comments.substr(s) << std::endl; break; } else { - if ((pos = comments.substr(s, PRINT_VAL_PAD-1).find('\\')) != string::npos) + if ((pos = comments.substr(s, PRINT_VAL_PAD-1).find('\\')) != std::string::npos) { if (comments.at(s+pos+1) == 'n') { - adj_file << setw(PRINT_VAR_PAD) << left << var << comments.substr(s, pos) << endl; + adj_file << std::setw(PRINT_VAR_PAD) << std::left << var << comments.substr(s, pos) << std::endl; s += pos+2; if (comments.at(s) == ' ') ++s; @@ -9702,7 +9704,7 @@ void dna_adjust::PrintOutputFileHeaderInfo() while (comments.at(s+PRINT_VAL_PAD - t) != ' ') ++t; - adj_file << setw(PRINT_VAR_PAD) << left << var << comments.substr(s, PRINT_VAL_PAD - t); + adj_file << std::setw(PRINT_VAR_PAD) << std::left << var << comments.substr(s, PRINT_VAL_PAD - t); s += PRINT_VAL_PAD - t; if (comments.at(s-1) != ' ' && @@ -9711,18 +9713,18 @@ void dna_adjust::PrintOutputFileHeaderInfo() adj_file << "-"; else if (comments.at(s) == ' ') ++s; - adj_file << endl; + adj_file << std::endl; } var = " "; } } - adj_file << OUTPUTLINE << endl; - xyz_file << OUTPUTLINE << endl; + adj_file << OUTPUTLINE << std::endl; + xyz_file << OUTPUTLINE << std::endl; } -void dna_adjust::PrintCorStation(ostream& os, +void dna_adjust::PrintCorStation(std::ostream& os, const UINT32& block, const UINT32& stn, const UINT32& mat_index, const matrix_2d* stationEstimates) { @@ -9787,27 +9789,27 @@ void dna_adjust::PrintCorStation(ostream& os, // print... // station and constraint - os << setw(STATION) << left << bstBinaryRecords_.at(stn).stationName << setw(PAD2) << " "; + os << std::setw(STATION) << std::left << bstBinaryRecords_.at(stn).stationName << std::setw(PAD2) << " "; // data - os << setw(MSR) << right << FormatDmsString(RadtoDms(azimuth), 4, true, false) << - setw(MSR) << right << FormatDmsString(RadtoDms(vertical_angle), 4, true, false) << - setw(MSR) << setprecision(PRECISION_MTR_STN) << fixed << right << slope_distance << - setw(MSR) << setprecision(PRECISION_MTR_STN) << fixed << right << horiz_distance; + os << std::setw(MSR) << std::right << FormatDmsString(RadtoDms(azimuth), 4, true, false) << + std::setw(MSR) << std::right << FormatDmsString(RadtoDms(vertical_angle), 4, true, false) << + std::setw(MSR) << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << slope_distance << + std::setw(MSR) << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << horiz_distance; if (isAdjustmentQuestionable_) os << StringFromTW(local_12e, HEIGHT, PRECISION_MTR_STN) << StringFromTW(local_12n, HEIGHT, PRECISION_MTR_STN) << - StringFromTW(local_12up, HEIGHT, PRECISION_MTR_STN) << endl; + StringFromTW(local_12up, HEIGHT, PRECISION_MTR_STN) << std::endl; else os << - setw(HEIGHT) << setprecision(PRECISION_MTR_STN) << fixed << right << local_12e << - setw(HEIGHT) << setprecision(PRECISION_MTR_STN) << fixed << right << local_12n << - setw(HEIGHT) << setprecision(PRECISION_MTR_STN) << fixed << right << local_12up << endl; + std::setw(HEIGHT) << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << local_12e << + std::setw(HEIGHT) << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << local_12n << + std::setw(HEIGHT) << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << local_12up << std::endl; } -void dna_adjust::PrintAdjStation(ostream& os, +void dna_adjust::PrintAdjStation(std::ostream& os, const UINT32& block, const UINT32& stn, const UINT32& mat_idx, const matrix_2d* stationEstimates, matrix_2d* stationVariances, bool recomputeGeographicCoords, bool updateGeographicCoords, @@ -9819,8 +9821,8 @@ void dna_adjust::PrintAdjStation(ostream& os, stn_it += stn; // station and constraint - os << setw(STATION) << left << stn_it->stationName; - os << setw(CONSTRAINT) << left << stn_it->stationConst; + os << std::setw(STATION) << std::left << stn_it->stationName; + os << std::setw(CONSTRAINT) << std::left << stn_it->stationConst; // Are station corrections required? // If so, update the original stations matrix @@ -9843,12 +9845,12 @@ void dna_adjust::PrintAdjStation(ostream& os, // Are geographic coordinates required? if (recomputeGeographicCoords || - projectSettings_.o._stn_coord_types.find("P") != string::npos || - projectSettings_.o._stn_coord_types.find("L") != string::npos || - projectSettings_.o._stn_coord_types.find("H") != string::npos || - projectSettings_.o._stn_coord_types.find("h") != string::npos || - projectSettings_.o._stn_coord_types.find("N") != string::npos || - projectSettings_.o._stn_coord_types.find("z") != string::npos) + projectSettings_.o._stn_coord_types.find("P") != std::string::npos || + projectSettings_.o._stn_coord_types.find("L") != std::string::npos || + projectSettings_.o._stn_coord_types.find("H") != std::string::npos || + projectSettings_.o._stn_coord_types.find("h") != std::string::npos || + projectSettings_.o._stn_coord_types.find("N") != std::string::npos || + projectSettings_.o._stn_coord_types.find("z") != std::string::npos) { CartToGeo( stationEstimates->get(mat_idx, 0), // X @@ -9868,9 +9870,9 @@ void dna_adjust::PrintAdjStation(ostream& os, } // Are projection coordinates required? - if (projectSettings_.o._stn_coord_types.find("E") != string::npos || - projectSettings_.o._stn_coord_types.find("N") != string::npos || - projectSettings_.o._stn_coord_types.find("z") != string::npos) + if (projectSettings_.o._stn_coord_types.find("E") != std::string::npos || + projectSettings_.o._stn_coord_types.find("N") != std::string::npos || + projectSettings_.o._stn_coord_types.find("z") != std::string::npos) { GeoToGrid(estLatitude, estLongitude, &E, &N, &Zo, datum_.GetEllipsoidRef(), @@ -9887,69 +9889,69 @@ void dna_adjust::PrintAdjStation(ostream& os, // latitude // Which angular format? if (projectSettings_.o._angular_type_stn == DMS) - os << setprecision(4 + PRECISION_SEC_STN) << fixed << right << setw(LAT_EAST) << + os << std::setprecision(4 + PRECISION_SEC_STN) << std::fixed << std::right << std::setw(LAT_EAST) << RadtoDms(estLatitude); else - os << setprecision(4 + PRECISION_SEC_STN) << fixed << right << setw(LAT_EAST) << + os << std::setprecision(4 + PRECISION_SEC_STN) << std::fixed << std::right << std::setw(LAT_EAST) << Degrees(estLatitude); break; case 'L': // longitude // Which angular format? if (projectSettings_.o._angular_type_stn == DMS) - os << setprecision(4+PRECISION_SEC_STN) << fixed << right << setw(LON_NORTH) << + os << std::setprecision(4+PRECISION_SEC_STN) << std::fixed << std::right << std::setw(LON_NORTH) << RadtoDmsL(estLongitude); else - os << setprecision(4 + PRECISION_SEC_STN) << fixed << right << setw(LON_NORTH) << + os << std::setprecision(4 + PRECISION_SEC_STN) << std::fixed << std::right << std::setw(LON_NORTH) << DegreesL(estLongitude); break; case 'E': // Easting - os << setprecision(PRECISION_MTR_STN) << fixed << right << setw(LAT_EAST) << E; + os << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << std::setw(LAT_EAST) << E; break; case 'N': // Northing - os << setprecision(PRECISION_MTR_STN) << fixed << right << setw(LON_NORTH) << N; + os << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << std::setw(LON_NORTH) << N; break; case 'z': // Zone - os << setprecision(0) << fixed << right << setw(ZONE) << Zo; + os << std::setprecision(0) << std::fixed << std::right << std::setw(ZONE) << Zo; break; case 'H': // Orthometric height if (isAdjustmentQuestionable_) - os << right << StringFromTW((estHeight - stn_it->geoidSep), HEIGHT, PRECISION_MTR_STN); + os << std::right << StringFromTW((estHeight - stn_it->geoidSep), HEIGHT, PRECISION_MTR_STN); else - os << setprecision(PRECISION_MTR_STN) << fixed << right << setw(HEIGHT) << + os << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << std::setw(HEIGHT) << estHeight - stn_it->geoidSep; break; case 'h': // Ellipsoidal height if (isAdjustmentQuestionable_) - os << right << StringFromTW(estHeight, HEIGHT, PRECISION_MTR_STN); + os << std::right << StringFromTW(estHeight, HEIGHT, PRECISION_MTR_STN); else - os << setprecision(PRECISION_MTR_STN) << fixed << right << setw(HEIGHT) << + os << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << std::setw(HEIGHT) << estHeight; break; case 'X': // Cartesian X - os << setprecision(PRECISION_MTR_STN) << fixed << right << setw(XYZ) << + os << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << std::setw(XYZ) << stationEstimates->get(mat_idx, 0); break; case 'Y': // Cartesian Y - os << setprecision(PRECISION_MTR_STN) << fixed << right << setw(XYZ) << + os << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << std::setw(XYZ) << stationEstimates->get(mat_idx+1, 0); break; case 'Z': // Cartesian Z - os << setprecision(PRECISION_MTR_STN) << fixed << right << setw(XYZ) << + os << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << std::setw(XYZ) << stationEstimates->get(mat_idx+2, 0); break; } } - os << setw(PAD2) << " "; + os << std::setw(PAD2) << " "; // Standard deviation in local reference frame matrix_2d var_local(3, 3), var_cart(3, 3); @@ -10004,9 +10006,9 @@ void dna_adjust::PrintAdjStation(ostream& os, StringFromTW(sqrt(var_local.get(2, 2)), STDDEV, PRECISION_MTR_STN); else os << - setw(STDDEV) << right << StringFromT(sqrt(var_local.get(0, 0)), PRECISION_MTR_STN) << - setw(STDDEV) << right << StringFromT(sqrt(var_local.get(1, 1)), PRECISION_MTR_STN) << - setw(STDDEV) << right << StringFromT(sqrt(var_local.get(2, 2)), PRECISION_MTR_STN); + std::setw(STDDEV) << std::right << StringFromT(sqrt(var_local.get(0, 0)), PRECISION_MTR_STN) << + std::setw(STDDEV) << std::right << StringFromT(sqrt(var_local.get(1, 1)), PRECISION_MTR_STN) << + std::setw(STDDEV) << std::right << StringFromT(sqrt(var_local.get(2, 2)), PRECISION_MTR_STN); if (projectSettings_.o._stn_corr) { @@ -10022,19 +10024,19 @@ void dna_adjust::PrintAdjStation(ostream& os, stn_it->currentLongitude, &cor_e, &cor_n, &cor_up); // corrections in the local reference frame - os << setw(PAD2) << " " << - setprecision(PRECISION_MTR_STN) << fixed << right << setw(HEIGHT) << cor_e << - setprecision(PRECISION_MTR_STN) << fixed << right << setw(HEIGHT) << cor_n << - setprecision(PRECISION_MTR_STN) << fixed << right << setw(HEIGHT) << cor_up; + os << std::setw(PAD2) << " " << + std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << std::setw(HEIGHT) << cor_e << + std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << std::setw(HEIGHT) << cor_n << + std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << std::setw(HEIGHT) << cor_up; } // description - os << setw(PAD2) << " " << left << stn_it->description; - os << endl; + os << std::setw(PAD2) << " " << std::left << stn_it->description; + os << std::endl; } -void dna_adjust::PrintAdjStations(ostream& os, const UINT32& block, +void dna_adjust::PrintAdjStations(std::ostream& os, const UINT32& block, const matrix_2d* stationEstimates, matrix_2d* stationVariances, bool printBlockID, bool recomputeGeographicCoords, bool updateGeographicCoords, bool printHeader, bool reapplyTypeBUncertainties) @@ -10043,9 +10045,9 @@ void dna_adjust::PrintAdjStations(ostream& os, const UINT32& block, if (v_blockStations.size() * 3 != stationEstimates->rows()) { - stringstream ss; + std::stringstream ss; ss << "PrintAdjStations(): Number of estimated stations in block " << block << - " does not match the block station count." << endl; + " does not match the block station count." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -10072,7 +10074,7 @@ void dna_adjust::PrintAdjStations(ostream& os, const UINT32& block, if (projectSettings_.o._output_stn_blocks) { if (printBlockID) - os << "Block " << block + 1 << endl; + os << "Block " << block + 1 << std::endl; else if (projectSettings_.o._adj_stn_iteration) adj.print_adj_stn_block_header(os, block); @@ -10089,7 +10091,7 @@ void dna_adjust::PrintAdjStations(ostream& os, const UINT32& block, } } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -10107,14 +10109,14 @@ void dna_adjust::PrintAdjStations(ostream& os, const UINT32& block, reapplyTypeBUncertainties); } - os << endl; + os << std::endl; // return sort order to alpha-numeric if (projectSettings_.o._sort_stn_file_order) SortStationsbyID(v_blockStations); } -void dna_adjust::PrintAdjStationsUniqueList(ostream& os, +void dna_adjust::PrintAdjStationsUniqueList(std::ostream& os, const v_mat_2d* stationEstimates, v_mat_2d* stationVariances, bool recomputeGeographicCoords, bool updateGeographicCoords, bool reapplyTypeBUncertainties) @@ -10126,7 +10128,7 @@ void dna_adjust::PrintAdjStationsUniqueList(ostream& os, adj.print_stn_info_col_header(os, projectSettings_.o._stn_coord_types, projectSettings_.o._stn_corr); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -10137,22 +10139,22 @@ void dna_adjust::PrintAdjStationsUniqueList(ostream& os, if (projectSettings_.a.stage || projectSettings_.a.adjust_mode == Phased_Block_1Mode) { // sort by blocks to create efficiency when deserialising matrix info - sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end(), + std::sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end(), CompareBlockStationMapUnique_byBlock()); } else if (projectSettings_.o._sort_stn_file_order) { CompareBlockStationMapUnique_byFileOrder stnorderCompareFunc(&bstBinaryRecords_); - sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end(), stnorderCompareFunc); + std::sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end(), stnorderCompareFunc); } else - sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end()); + std::sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end()); - stringstream stationRecord; + std::stringstream stationRecord; v_uint32_string_pair stationsOutput; stationsOutput.reserve(v_blockStationsMapUnique_.size()); - ostream* outstream(&os); + std::ostream* outstream(&os); if (projectSettings_.a.stage) outstream = &stationRecord; @@ -10220,60 +10222,60 @@ void dna_adjust::PrintAdjStationsUniqueList(ostream& os, // if required, sort stations according to original station file order if (projectSettings_.o._sort_stn_file_order) { - CompareOddPairFirst_FileOrder stnorderCompareFunc(&bstBinaryRecords_); - sort(stationsOutput.begin(), stationsOutput.end(), stnorderCompareFunc); + CompareOddPairFirst_FileOrder stnorderCompareFunc(&bstBinaryRecords_); + std::sort(stationsOutput.begin(), stationsOutput.end(), stnorderCompareFunc); } else - sort(stationsOutput.begin(), stationsOutput.end(), CompareOddPairFirst()); + std::sort(stationsOutput.begin(), stationsOutput.end(), CompareOddPairFirst()); for_each(stationsOutput.begin(), stationsOutput.end(), - [&stationsOutput, &os] (pair& adjRecord) { + [&stationsOutput, &os] (std::pair& adjRecord) { os << adjRecord.second; } ); } - os << endl; + os << std::endl; } void dna_adjust::SortStationsbyFileOrder(vUINT32& v_blockStations) { CompareStnFileOrder stnorderCompareFunc(&bstBinaryRecords_); - sort(v_blockStations.begin(), v_blockStations.end(), stnorderCompareFunc); + std::sort(v_blockStations.begin(), v_blockStations.end(), stnorderCompareFunc); } void dna_adjust::SortStationsbyID(vUINT32& v_blockStations) { - sort(v_blockStations.begin(), v_blockStations.end()); + std::sort(v_blockStations.begin(), v_blockStations.end()); } -void dna_adjust::PrintPosUncertaintiesHeader(ostream& os) +void dna_adjust::PrintPosUncertaintiesHeader(std::ostream& os) { - os << setw(STATION) << left << "Station" << - setw(PAD2) << " " << - right << setw(LAT_EAST) << CDnaStation::CoordinateName('P') << - right << setw(LON_NORTH) << CDnaStation::CoordinateName('L') << - right << setw(STAT) << "Hz PosU" << - right << setw(STAT) << "Vt PosU" << - right << setw(PREC) << "Semi-major" << - right << setw(PREC) << "Semi-minor" << - right << setw(PREC) << "Orientation"; + os << std::setw(STATION) << std::left << "Station" << + std::setw(PAD2) << " " << + std::right << std::setw(LAT_EAST) << CDnaStation::CoordinateName('P') << + std::right << std::setw(LON_NORTH) << CDnaStation::CoordinateName('L') << + std::right << std::setw(STAT) << "Hz PosU" << + std::right << std::setw(STAT) << "Vt PosU" << + std::right << std::setw(PREC) << "Semi-major" << + std::right << std::setw(PREC) << "Semi-minor" << + std::right << std::setw(PREC) << "Orientation"; switch (projectSettings_.o._apu_vcv_units) { case ENU_apu_ui: os << - right << setw(MSR) << "Variance(e)" << - right << setw(MSR) << "Variance(n)" << - right << setw(MSR) << "Variance(up)" << endl; + std::right << std::setw(MSR) << "Variance(e)" << + std::right << std::setw(MSR) << "Variance(n)" << + std::right << std::setw(MSR) << "Variance(up)" << std::endl; break; case XYZ_apu_ui: default: os << - right << setw(MSR) << "Variance(X)" << - right << setw(MSR) << "Variance(Y)" << - right << setw(MSR) << "Variance(Z)" << endl; + std::right << std::setw(MSR) << "Variance(X)" << + std::right << std::setw(MSR) << "Variance(Y)" << + std::right << std::setw(MSR) << "Variance(Z)" << std::endl; break; } @@ -10281,11 +10283,11 @@ void dna_adjust::PrintPosUncertaintiesHeader(ostream& os) for (i=0; i()); } else if (projectSettings_.o._sort_stn_file_order) { CompareBlockStationMapUnique_byFileOrder stnorderCompareFunc(&bstBinaryRecords_); - sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end(), stnorderCompareFunc); + std::sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end(), stnorderCompareFunc); } else - sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end()); + std::sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end()); - stringstream stationRecord; + std::stringstream stationRecord; v_uint32_string_pair stationsOutput; stationsOutput.reserve(v_blockStationsMapUnique_.size()); - ostream* outstream(&os); + std::ostream* outstream(&os); if (projectSettings_.a.stage) outstream = &stationRecord; @@ -10362,21 +10364,21 @@ void dna_adjust::PrintPosUncertaintiesUniqueList(ostream& os, const v_mat_2d* st // if required, sort stations according to original station file order if (projectSettings_.o._sort_stn_file_order) { - CompareOddPairFirst_FileOrder stnorderCompareFunc(&bstBinaryRecords_); - sort(stationsOutput.begin(), stationsOutput.end(), stnorderCompareFunc); + CompareOddPairFirst_FileOrder stnorderCompareFunc(&bstBinaryRecords_); + std::sort(stationsOutput.begin(), stationsOutput.end(), stnorderCompareFunc); } else - sort(stationsOutput.begin(), stationsOutput.end(), CompareOddPairFirst()); + std::sort(stationsOutput.begin(), stationsOutput.end(), CompareOddPairFirst()); for_each(stationsOutput.begin(), stationsOutput.end(), - [&stationsOutput, &os] (pair& posRecord) { + [&stationsOutput, &os] (std::pair& posRecord) { os << posRecord.second; } ); } } -void dna_adjust::PrintPosUncertainty(ostream& os, /*ostream* csv,*/ const UINT32& block, const UINT32& stn, +void dna_adjust::PrintPosUncertainty(std::ostream& os, /*ostream* csv,*/ const UINT32& block, const UINT32& stn, const UINT32& mat_idx, const matrix_2d* stationVariances, const UINT32& map_idx, const vUINT32* blockStations) { double semimajor, semiminor, azimuth, hzPosU, vtPosU; @@ -10409,23 +10411,23 @@ void dna_adjust::PrintPosUncertainty(ostream& os, /*ostream* csv,*/ const UINT32 // print... // station and padding - os << setw(STATION) << left << bstBinaryRecords_.at(stn).stationName << setw(PAD2) << " "; + os << std::setw(STATION) << std::left << bstBinaryRecords_.at(stn).stationName << std::setw(PAD2) << " "; - os.flags(ios::fixed | ios::right); + os.flags(std::ios::fixed | std::ios::right); // latitude if (projectSettings_.o._angular_type_stn == DMS) - os << setprecision(4+PRECISION_SEC_STN) << setw(LAT_EAST) << + os << std::setprecision(4+PRECISION_SEC_STN) << std::setw(LAT_EAST) << RadtoDms(bstBinaryRecords_.at(stn).currentLatitude); else - os << setprecision(4 + PRECISION_SEC_STN) << setw(LAT_EAST) << + os << std::setprecision(4 + PRECISION_SEC_STN) << std::setw(LAT_EAST) << Degrees(bstBinaryRecords_.at(stn).currentLatitude); // longitude if (projectSettings_.o._angular_type_stn == DMS) - os << setprecision(4+PRECISION_SEC_STN) << setw(LON_NORTH) << + os << std::setprecision(4+PRECISION_SEC_STN) << std::setw(LON_NORTH) << RadtoDmsL(bstBinaryRecords_.at(stn).currentLongitude); else - os << setprecision(4 + PRECISION_SEC_STN) << setw(LON_NORTH) << + os << std::setprecision(4 + PRECISION_SEC_STN) << std::setw(LON_NORTH) << DegreesL(bstBinaryRecords_.at(stn).currentLongitude); // positional uncertainty @@ -10434,15 +10436,15 @@ void dna_adjust::PrintPosUncertainty(ostream& os, /*ostream* csv,*/ const UINT32 StringFromTW(hzPosU, STAT, PRECISION_MTR_STN) << StringFromTW(vtPosU, STAT, PRECISION_MTR_STN); else - os << setprecision(PRECISION_MTR_STN) << setw(STAT) << hzPosU << - setprecision(PRECISION_MTR_STN) << fixed << right << setw(STAT) << vtPosU; + os << std::setprecision(PRECISION_MTR_STN) << std::setw(STAT) << hzPosU << + std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << std::setw(STAT) << vtPosU; // error ellipse semi-major, semi-minor, orientation - os << setprecision(PRECISION_MTR_STN) << setw(PREC) << semimajor << - setprecision(PRECISION_MTR_STN) << setw(PREC) << semiminor << - setprecision(4) << setw(PREC) << RadtoDms(azimuth); + os << std::setprecision(PRECISION_MTR_STN) << std::setw(PREC) << semimajor << + std::setprecision(PRECISION_MTR_STN) << std::setw(PREC) << semiminor << + std::setprecision(4) << std::setw(PREC) << RadtoDms(azimuth); - os.flags(ios::scientific | ios::right); + os.flags(std::ios::scientific | std::ios::right); UINT16 PRECISION_UNCERTAINTY(9); @@ -10451,32 +10453,32 @@ void dna_adjust::PrintPosUncertainty(ostream& os, /*ostream* csv,*/ const UINT32 os << StringFromTW(variances->get(0, 0), MSR, PRECISION_UNCERTAINTY) << // e StringFromTW(variances->get(0, 1), MSR, PRECISION_UNCERTAINTY) << // n - StringFromTW(variances->get(0, 2), MSR, PRECISION_UNCERTAINTY) << endl; // up + StringFromTW(variances->get(0, 2), MSR, PRECISION_UNCERTAINTY) << std::endl; // up else os << - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(0, 0) << // e - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(0, 1) << // n - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(0, 2) << endl; // up + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(0, 0) << // e + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(0, 1) << // n + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(0, 2) << std::endl; // up // Next line: yy, yz - os << setw(STATION+PAD2+LAT_EAST+LON_NORTH+STAT+STAT+PREC+PREC+PREC+MSR) << " "; // padding + os << std::setw(STATION+PAD2+LAT_EAST+LON_NORTH+STAT+STAT+PREC+PREC+PREC+MSR) << " "; // padding if (isAdjustmentQuestionable_) os << StringFromTW(variances->get(1, 1), MSR, PRECISION_UNCERTAINTY) << // n - StringFromTW(variances->get(1, 2), MSR, PRECISION_UNCERTAINTY) << endl; // up + StringFromTW(variances->get(1, 2), MSR, PRECISION_UNCERTAINTY) << std::endl; // up else os << - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(1, 1) << // n - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(1, 2) << endl; // up + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(1, 1) << // n + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(1, 2) << std::endl; // up // Next line: zz - os << setw(STATION+PAD2+LAT_EAST+LON_NORTH+STAT+STAT+PREC+PREC+PREC+MSR+MSR) << " "; // padding + os << std::setw(STATION+PAD2+LAT_EAST+LON_NORTH+STAT+STAT+PREC+PREC+PREC+MSR+MSR) << " "; // padding if (isAdjustmentQuestionable_) os << - StringFromTW(variances->get(2, 2), MSR, PRECISION_UNCERTAINTY) << endl; // up + StringFromTW(variances->get(2, 2), MSR, PRECISION_UNCERTAINTY) << std::endl; // up else os << - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(2, 2) << endl; // up + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(2, 2) << std::endl; // up if (!projectSettings_.o._output_pu_covariances) return; @@ -10500,30 +10502,30 @@ void dna_adjust::PrintPosUncertainty(ostream& os, /*ostream* csv,*/ const UINT32 break; } - os << setw(STATION) << left << bstBinaryRecords_.at(blockStations->at(ic)).stationName; + os << std::setw(STATION) << std::left << bstBinaryRecords_.at(blockStations->at(ic)).stationName; - os.flags(ios::scientific | ios::right); + os.flags(std::ios::scientific | std::ios::right); os << - setw(PAD2+LAT_EAST+LON_NORTH+STAT+STAT+PREC+PREC+PREC) << " " << // padding - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(0, 0) << // 11 - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(0, 1) << // 12 - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(0, 2) << endl; // 13 + std::setw(PAD2+LAT_EAST+LON_NORTH+STAT+STAT+PREC+PREC+PREC) << " " << // padding + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(0, 0) << // 11 + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(0, 1) << // 12 + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(0, 2) << std::endl; // 13 os << - setw(STATION+PAD2+LAT_EAST+LON_NORTH+STAT+STAT+PREC+PREC+PREC) << " " << // padding - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(1, 0) << // 21 - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(1, 1) << // 22 - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(1, 2) << endl; // 23 + std::setw(STATION+PAD2+LAT_EAST+LON_NORTH+STAT+STAT+PREC+PREC+PREC) << " " << // padding + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(1, 0) << // 21 + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(1, 1) << // 22 + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(1, 2) << std::endl; // 23 os << - setw(STATION+PAD2+LAT_EAST+LON_NORTH+STAT+STAT+PREC+PREC+PREC) << " " << // padding - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(2, 0) << // 31 - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(2, 1) << // 32 - setprecision(PRECISION_UNCERTAINTY) << setw(MSR) << variances->get(2, 2) << endl; // 33 + std::setw(STATION+PAD2+LAT_EAST+LON_NORTH+STAT+STAT+PREC+PREC+PREC) << " " << // padding + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(2, 0) << // 31 + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(2, 1) << // 32 + std::setprecision(PRECISION_UNCERTAINTY) << std::setw(MSR) << variances->get(2, 2) << std::endl; // 33 } } -void dna_adjust::PrintPosUncertainties(ostream &os, const UINT32& block, const matrix_2d* stationVariances) +void dna_adjust::PrintPosUncertainties(std::ostream &os, const UINT32& block, const matrix_2d* stationVariances) { vUINT32 v_blockStations(v_parameterStationList_.at(block)); @@ -10535,7 +10537,7 @@ void dna_adjust::PrintPosUncertainties(ostream &os, const UINT32& block, const m { case PhasedMode: case Phased_Block_1Mode: // only the first block is rigorous - os << "Block " << block + 1 << endl; + os << "Block " << block + 1 << std::endl; break; } @@ -10555,7 +10557,7 @@ void dna_adjust::PrintPosUncertainties(ostream &os, const UINT32& block, const m stationVariances, i, &v_blockStations); } - os << endl; + os << std::endl; // return sort order to alpha-numeric if (projectSettings_.o._sort_stn_file_order) @@ -10563,7 +10565,7 @@ void dna_adjust::PrintPosUncertainties(ostream &os, const UINT32& block, const m } -void dna_adjust::PrintCorStations(ostream &cor_file, const UINT32& block) +void dna_adjust::PrintCorStations(std::ostream &cor_file, const UINT32& block) { vUINT32 v_blockStations(v_parameterStationList_.at(block)); @@ -10575,25 +10577,25 @@ void dna_adjust::PrintCorStations(ostream &cor_file, const UINT32& block) { case PhasedMode: case Phased_Block_1Mode: // only the first block is rigorous - cor_file << "Block " << block + 1 << endl; + cor_file << "Block " << block + 1 << std::endl; break; } - cor_file << setw(STATION) << left << "Station" << - setw(PAD2) << " " << - right << setw(MSR) << "Azimuth" << - right << setw(MSR) << "V. Angle" << - right << setw(MSR) << "S. Distance" << - right << setw(MSR) << "H. Distance" << - right << setw(HEIGHT) << "east" << - right << setw(HEIGHT) << "north" << - right << setw(HEIGHT) << "up" << endl; + cor_file << std::setw(STATION) << std::left << "Station" << + std::setw(PAD2) << " " << + std::right << std::setw(MSR) << "Azimuth" << + std::right << std::setw(MSR) << "V. Angle" << + std::right << std::setw(MSR) << "S. Distance" << + std::right << std::setw(MSR) << "H. Distance" << + std::right << std::setw(HEIGHT) << "east" << + std::right << std::setw(HEIGHT) << "north" << + std::right << std::setw(HEIGHT) << "up" << std::endl; UINT32 i, j = STATION+PAD2+MSR+MSR+MSR+MSR+HEIGHT+HEIGHT+HEIGHT; for (i=0; iat(block)); } - cor_file << endl; + cor_file << std::endl; // return sort order to alpha-numeric if (projectSettings_.o._sort_stn_file_order) @@ -10619,31 +10621,31 @@ void dna_adjust::PrintCorStations(ostream &cor_file, const UINT32& block) } -void dna_adjust::PrintCorStationsUniqueList(ostream &cor_file) +void dna_adjust::PrintCorStationsUniqueList(std::ostream &cor_file) { vUINT32 v_blockStations; vstring stn_corr_records(bstBinaryRecords_.size()); - cor_file << setw(STATION) << left << "Station" << - setw(PAD2) << " " << - right << setw(MSR) << "Azimuth" << - right << setw(MSR) << "V. Angle" << - right << setw(MSR) << "S. Distance" << - right << setw(MSR) << "H. Distance" << - right << setw(HEIGHT) << "east" << - right << setw(HEIGHT) << "north" << - right << setw(HEIGHT) << "up" << endl; + cor_file << std::setw(STATION) << std::left << "Station" << + std::setw(PAD2) << " " << + std::right << std::setw(MSR) << "Azimuth" << + std::right << std::setw(MSR) << "V. Angle" << + std::right << std::setw(MSR) << "S. Distance" << + std::right << std::setw(MSR) << "H. Distance" << + std::right << std::setw(HEIGHT) << "east" << + std::right << std::setw(HEIGHT) << "north" << + std::right << std::setw(HEIGHT) << "up" << std::endl; UINT32 i, j = STATION+PAD2+MSR+MSR+MSR+MSR+HEIGHT+HEIGHT+HEIGHT; for (i=0; i stnorderCompareFunc(&bstBinaryRecords_); - sort(correctionsOutput.begin(), correctionsOutput.end(), stnorderCompareFunc); + CompareOddPairFirst_FileOrder stnorderCompareFunc(&bstBinaryRecords_); + std::sort(correctionsOutput.begin(), correctionsOutput.end(), stnorderCompareFunc); } else - sort(correctionsOutput.begin(), correctionsOutput.end(), CompareOddPairFirst()); + std::sort(correctionsOutput.begin(), correctionsOutput.end(), CompareOddPairFirst()); for_each(correctionsOutput.begin(), correctionsOutput.end(), - [&correctionsOutput, &cor_file] (pair& corrRecord) { + [&correctionsOutput, &cor_file] (std::pair& corrRecord) { cor_file << corrRecord.second; } ); @@ -10756,15 +10758,15 @@ void dna_adjust::UpdateGeographicCoords() } } -void dna_adjust::PrintCompMeasurements(const UINT32& block, const string& type) +void dna_adjust::PrintCompMeasurements(const UINT32& block, const std::string& type) { // Print header - string table_heading("Computed Measurements"); - string col_heading("Computed"); + std::string table_heading("Computed Measurements"); + std::string col_heading("Computed"); if (projectSettings_.a.adjust_mode == PhasedMode || !type.empty()) { - stringstream ss; + std::stringstream ss; ss << " ("; if (projectSettings_.a.adjust_mode == PhasedMode) { @@ -10799,7 +10801,7 @@ void dna_adjust::PrintCompMeasurements(const UINT32& block, const string& type) if (_it_msr->vectorCount1 < 1) continue; - adj_file << left << setw(PAD2) << _it_msr->measType; + adj_file << std::left << std::setw(PAD2) << _it_msr->measType; // normal format switch (_it_msr->measType) @@ -10842,16 +10844,16 @@ void dna_adjust::PrintCompMeasurements(const UINT32& block, const string& type) } - adj_file << endl << endl; + adj_file << std::endl << std::endl; } -void dna_adjust::PrintAdjMeasurementsHeader(bool printHeader, const string& table_heading, +void dna_adjust::PrintAdjMeasurementsHeader(bool printHeader, const std::string& table_heading, printMeasurementsMode printMode, UINT32 block, bool printBlocks) { if (printHeader) - adj_file << endl << table_heading << endl << - "------------------------------------------" << endl << endl; + adj_file << std::endl << table_heading << std::endl << + "------------------------------------------" << std::endl << std::endl; if (printBlocks) { @@ -10860,12 +10862,12 @@ void dna_adjust::PrintAdjMeasurementsHeader(bool printHeader, const string& tabl case PhasedMode: case Phased_Block_1Mode: if (projectSettings_.o._output_msr_blocks) - adj_file << "Block " << block << endl; + adj_file << "Block " << block << std::endl; break; } } - string col1_heading, col2_heading; + std::string col1_heading, col2_heading; // determine headings switch (printMode) @@ -10886,20 +10888,20 @@ void dna_adjust::PrintAdjMeasurementsHeader(bool printHeader, const string& tabl // Adjusted, computed and ignored measurements UINT32 j(PAD2 + STATION + STATION + STATION); adj_file << - setw(PAD2) << left << "M" << - setw(STATION) << left << "Station 1" << - setw(STATION) << left << "Station 2" << - setw(STATION) << left << "Station 3"; + std::setw(PAD2) << std::left << "M" << + std::setw(STATION) << std::left << "Station 1" << + std::setw(STATION) << std::left << "Station 2" << + std::setw(STATION) << std::left << "Station 3"; // Adjusted, computed and ignored measurements j += PAD3 + PAD3 + MSR + MSR + CORR + PREC; adj_file << - setw(PAD3) << left << "*" << - setw(PAD2) << left << "C" << - setw(MSR) << right << "Measured" << - setw(MSR) << right << col1_heading << // Computed or Adjusted - setw(CORR) << right << col2_heading << // Difference or Correction - setw(PREC) << right << "Meas. SD"; + std::setw(PAD3) << std::left << "*" << + std::setw(PAD2) << std::left << "C" << + std::setw(MSR) << std::right << "Measured" << + std::setw(MSR) << std::right << col1_heading << // Computed or Adjusted + std::setw(CORR) << std::right << col2_heading << // Difference or Correction + std::setw(PREC) << std::right << "Meas. SD"; // Adjusted measurements only switch (printMode) @@ -10907,20 +10909,20 @@ void dna_adjust::PrintAdjMeasurementsHeader(bool printHeader, const string& tabl case adjustedMsrs: j += PREC + PREC + STAT; adj_file << - setw(PREC) << right << "Adj. SD" << - setw(PREC) << right << "Corr. SD" << - setw(STAT) << right << "N-stat"; + std::setw(PREC) << std::right << "Adj. SD" << + std::setw(PREC) << std::right << "Corr. SD" << + std::setw(STAT) << std::right << "N-stat"; // print t-statistics? if (projectSettings_.o._adj_msr_tstat) { j += STAT; - adj_file << setw(STAT) << right << "T-stat"; + adj_file << std::setw(STAT) << std::right << "T-stat"; } j += REL; adj_file << - setw(REL) << right << "Pelzer Rel"; + std::setw(REL) << std::right << "Pelzer Rel"; break; default: break; @@ -10929,7 +10931,7 @@ void dna_adjust::PrintAdjMeasurementsHeader(bool printHeader, const string& tabl // Adjusted, computed and ignored measurements j += PACORR; adj_file << - setw(PACORR) << right << "Pre Adj Corr"; + std::setw(PACORR) << std::right << "Pre Adj Corr"; // Adjusted measurements only switch (printMode) @@ -10937,7 +10939,7 @@ void dna_adjust::PrintAdjMeasurementsHeader(bool printHeader, const string& tabl case adjustedMsrs: j += OUTLIER; adj_file << - setw(OUTLIER) << right << "Outlier?"; + std::setw(OUTLIER) << std::right << "Outlier?"; break; default: break; @@ -10949,17 +10951,17 @@ void dna_adjust::PrintAdjMeasurementsHeader(bool printHeader, const string& tabl { j += STDDEV + STDDEV; adj_file << - setw(STDDEV) << right << "Meas. ID" << - setw(STDDEV) << right << "Clust. ID"; + std::setw(STDDEV) << std::right << "Meas. ID" << + std::setw(STDDEV) << std::right << "Clust. ID"; } - adj_file << endl; + adj_file << std::endl; UINT32 i; for (i=0; istation1); - stringstream ss; + std::stringstream ss; ss << "UpdateIgnoredMeasurements(): Station " << (*_it_msr)->station1 << - " was not found in the station map." << endl; + " was not found in the station map." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -10999,9 +11001,9 @@ void dna_adjust::UpdateIgnoredMeasurements_A(pit_vmsr_t _it_msr, bool storeOrigi if (it_stnmap_range.first == it_stnmap_range.second) { //TRACE("%d not found\n", (*_it_msr)->station2); - stringstream ss; + std::stringstream ss; ss << "UpdateIgnoredMeasurements(): Station " << (*_it_msr)->station1 << - " was not found in the station map." << endl; + " was not found in the station map." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } // Get the index of the station in the map @@ -11017,9 +11019,9 @@ void dna_adjust::UpdateIgnoredMeasurements_A(pit_vmsr_t _it_msr, bool storeOrigi if (it_stnmap_range.first == it_stnmap_range.second) { //TRACE("%d not found\n", (*_it_msr)->station3); - stringstream ss; + std::stringstream ss; ss << "UpdateIgnoredMeasurements(): Station " << (*_it_msr)->station3 << - " was not found in the station map." << endl; + " was not found in the station map." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -11297,9 +11299,9 @@ void dna_adjust::UpdateIgnoredMeasurements_D(pit_vmsr_t _it_msr, bool storeOrigi catch (...) { // Print error message to adj file and throw exception - stringstream ss; - ss << "UpdateIgnoredMeasurements_D(): An error was encountered whilst" << endl << - " calculating ignored measurement details" << endl; + std::stringstream ss; + ss << "UpdateIgnoredMeasurements_D(): An error was encountered whilst" << std::endl << + " calculating ignored measurement details" << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -11786,9 +11788,9 @@ void dna_adjust::UpdateIgnoredMeasurements_S(pit_vmsr_t _it_msr, bool storeOrigi if (it_stnmap_range.first == it_stnmap_range.second) { //TRACE("%d not found\n", (*_it_msr)->station1); - stringstream ss; + std::stringstream ss; ss << "UpdateIgnoredMeasurements(): Station " << (*_it_msr)->station1 << - " was not found in the station map." << endl; + " was not found in the station map." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -11805,9 +11807,9 @@ void dna_adjust::UpdateIgnoredMeasurements_S(pit_vmsr_t _it_msr, bool storeOrigi if (it_stnmap_range.first == it_stnmap_range.second) { //TRACE("%d not found\n", (*_it_msr)->station2); - stringstream ss; + std::stringstream ss; ss << "UpdateIgnoredMeasurements(): Station " << (*_it_msr)->station2 << - " was not found in the station map." << endl; + " was not found in the station map." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -12116,13 +12118,13 @@ void dna_adjust::UpdateIgnoredMeasurements_Z(pit_vmsr_t _it_msr, bool storeOrigi void dna_adjust::UpdateIgnoredMeasurements(pit_vmsr_t _it_msr, bool storeOriginalMeasurement) { - stringstream ss; + std::stringstream ss; // Since the stations connected by an ignored measurement may appear // in different blocks, it is essential to get the correct block // number for each station. For this, use v_blockStationsMapUnique_ which // is sorted on station id. - sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end()); + std::sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end()); switch ((*_it_msr)->measType) { @@ -12188,7 +12190,7 @@ void dna_adjust::UpdateIgnoredMeasurements(pit_vmsr_t _it_msr, bool storeOrigina break; default: ss << "UpdateIgnoredMeasurements(): Unknown measurement type - '" << - (*_it_msr)->measType << "'." << endl; + (*_it_msr)->measType << "'." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } } @@ -12197,8 +12199,8 @@ void dna_adjust::UpdateIgnoredMeasurements(pit_vmsr_t _it_msr, bool storeOrigina void dna_adjust::PrintIgnoredAdjMeasurements(bool printHeader) { // Print heading - adj_file << endl; - string table_heading("Ignored Measurements (a-posteriori)"); + adj_file << std::endl; + std::string table_heading("Ignored Measurements (a-posteriori)"); PrintAdjMeasurementsHeader(printHeader, table_heading, ignoredMsrs, 0, false); @@ -12245,7 +12247,7 @@ void dna_adjust::PrintIgnoredAdjMeasurements(bool printHeader) if (ignored_msrs.empty()) { - adj_file << endl << endl; + adj_file << std::endl << std::endl; return; } @@ -12263,7 +12265,7 @@ void dna_adjust::PrintIgnoredAdjMeasurements(bool printHeader) if (_it_msr->measAdj == 0. && _it_msr->measCorr == 0. && _it_msr->preAdjCorr == 0. && _it_msr->preAdjMeas == 0.) storeOriginalMeasurement = true; - sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end()); + std::sort(v_blockStationsMapUnique_.begin(), v_blockStationsMapUnique_.end()); // Reduce measurements and compute stats for (_it_ign = ignored_msrs.begin(); _it_ign != ignored_msrs.end(); ++_it_ign) @@ -12296,14 +12298,14 @@ void dna_adjust::PrintIgnoredAdjMeasurements(bool printHeader) case 'Y': // GPS Point cluster if (_it_msr->clusterID != clusterID) { - adj_file << left << setw(PAD2) << _it_msr->measType; + adj_file << std::left << std::setw(PAD2) << _it_msr->measType; clusterID = _it_msr->clusterID; } else adj_file << " "; break; default: - adj_file << left << setw(PAD2) << _it_msr->measType; + adj_file << std::left << std::setw(PAD2) << _it_msr->measType; } #ifdef _MSDEBUG @@ -12357,7 +12359,7 @@ void dna_adjust::PrintIgnoredAdjMeasurements(bool printHeader) } - adj_file << endl << endl; + adj_file << std::endl << std::endl; } @@ -12446,11 +12448,11 @@ bool dna_adjust::IgnoredMeasurementContainsInvalidStation(pit_vmsr_t _it_msr) void dna_adjust::PrintAdjMeasurements(v_uint32_u32u32_pair msr_block, bool printHeader) { // Print heading - string table_heading("Adjusted Measurements"); + std::string table_heading("Adjusted Measurements"); if (projectSettings_.o._adj_msr_iteration) { - stringstream ss; + std::stringstream ss; if (projectSettings_.a.adjust_mode == PhasedMode && forward_) { UINT32 block = msr_block.at(0).second.first; @@ -12501,12 +12503,12 @@ void dna_adjust::PrintAdjMeasurements(v_uint32_u32u32_pair msr_block, bool print break; case orig_adj_msr_sort_ui: default: - sort(msr_block.begin(), msr_block.end()); + std::sort(msr_block.begin(), msr_block.end()); break; } } catch (...) { - stringstream ss; + std::stringstream ss; ss << "Failed to sort measurements according to the "; switch (projectSettings_.o._sort_adj_msr) @@ -12538,7 +12540,7 @@ void dna_adjust::PrintAdjMeasurements(v_uint32_u32u32_pair msr_block, bool print } - ss << endl; + ss << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -12568,14 +12570,14 @@ void dna_adjust::PrintAdjMeasurements(v_uint32_u32u32_pair msr_block, bool print case 'Y': // GPS Point cluster if (_it_msr->clusterID != clusterID) { - adj_file << left << setw(PAD2) << _it_msr->measType; + adj_file << std::left << std::setw(PAD2) << _it_msr->measType; clusterID = _it_msr->clusterID; } else adj_file << " "; break; default: - adj_file << left << setw(PAD2) << _it_msr->measType; + adj_file << std::left << std::setw(PAD2) << _it_msr->measType; } // normal format @@ -12619,7 +12621,7 @@ void dna_adjust::PrintAdjMeasurements(v_uint32_u32u32_pair msr_block, bool print } - adj_file << endl; + adj_file << std::endl; } @@ -12635,7 +12637,7 @@ void dna_adjust::PrintCompMeasurementsAngular(const char cardinal, const double& if (projectSettings_.o._database_ids) PrintMeasurementDatabaseID(_it_msr); - adj_file << endl; + adj_file << std::endl; } @@ -12659,16 +12661,16 @@ void dna_adjust::PrintCompMeasurementsLinear(const char cardinal, const double& if (projectSettings_.o._database_ids) PrintMeasurementDatabaseID(_it_msr); - adj_file << endl; + adj_file << std::endl; } void dna_adjust::PrintCompMeasurements_A(const UINT32& block, it_vmsr_t& _it_msr, UINT32& design_row, printMeasurementsMode printMode) { // normal format - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station3).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station3).stationName; double computed, correction; switch (printMode) @@ -12695,9 +12697,9 @@ void dna_adjust::PrintCompMeasurements_A(const UINT32& block, it_vmsr_t& _it_msr void dna_adjust::PrintCompMeasurements_BKVZ(const UINT32& block, it_vmsr_t& _it_msr, UINT32& design_row, printMeasurementsMode printMode) { // normal format - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; + adj_file << std::left << std::setw(STATION) << " "; double computed, correction; switch (printMode) @@ -12724,9 +12726,9 @@ void dna_adjust::PrintCompMeasurements_BKVZ(const UINT32& block, it_vmsr_t& _it_ void dna_adjust::PrintCompMeasurements_CELMS(it_vmsr_t& _it_msr, UINT32& design_row, printMeasurementsMode printMode) { // normal format - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; + adj_file << std::left << std::setw(STATION) << " "; double computed; switch (printMode) @@ -12755,13 +12757,13 @@ void dna_adjust::PrintCompMeasurements_D(it_vmsr_t& _it_msr, UINT32& design_row, UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); // normal format - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; + adj_file << std::left << std::setw(STATION) << " "; double computed; - string ignoreFlag(" "); + std::string ignoreFlag(" "); if (_it_msr->ignore) ignoreFlag = "*"; @@ -12771,18 +12773,18 @@ void dna_adjust::PrintCompMeasurements_D(it_vmsr_t& _it_msr, UINT32& design_row, else angle_count = _it_msr->vectorCount2 - 1; - adj_file << setw(PAD3) << left << ignoreFlag << setw(PAD2) << left << angle_count; + adj_file << std::setw(PAD3) << std::left << ignoreFlag << std::setw(PAD2) << std::left << angle_count; // Print measurement database ids if (projectSettings_.o._database_ids) { // Measured + Computed + Correction + Meas SD + Pre Adj Corr UINT32 b(MSR + MSR + CORR + PREC + PACORR); - adj_file << setw(b) << " "; + adj_file << std::setw(b) << " "; PrintMeasurementDatabaseID(_it_msr); } - adj_file << endl; + adj_file << std::endl; _it_msr++; @@ -12804,10 +12806,10 @@ void dna_adjust::PrintCompMeasurements_D(it_vmsr_t& _it_msr, UINT32& design_row, computed = _it_msr->term1 + _it_msr->measCorr; - adj_file << left << setw(PAD2) << " "; // measurement type - adj_file << left << setw(STATION) << " "; // station1 (Instrument) - adj_file << left << setw(STATION) << " "; // station2 (RO) - adj_file << left << setw(STATION) << + adj_file << std::left << std::setw(PAD2) << " "; // measurement type + adj_file << std::left << std::setw(STATION) << " "; // station1 (Instrument) + adj_file << std::left << std::setw(STATION) << " "; // station2 (RO) + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; // target // Print angular measurement, taking care of user requirements for @@ -12868,17 +12870,17 @@ void dna_adjust::PrintCompMeasurements_YLLH(it_vmsr_t& _it_msr, UINT32& design_r stn1_it = bstBinaryRecords_.begin() + _it_y_msr->station1; if (nextElement) - adj_file << left << setw(PAD2) << _it_y_msr->measType; + adj_file << std::left << std::setw(PAD2) << _it_y_msr->measType; else nextElement = true; covariance_count = _it_y_msr->vectorCount2; // first, second, third stations - adj_file << left << setw(STATION) << + adj_file << std::left << std::setw(STATION) << stn1_it->stationName << - left << setw(STATION) << " " << // second station - left << setw(STATION) << " "; // third station + std::left << std::setw(STATION) << " " << // second station + std::left << std::setw(STATION) << " "; // third station // Print latitude PrintCompMeasurementsAngular('P', _it_y_msr->measAdj, _it_y_msr->measCorr, _it_y_msr); @@ -12922,28 +12924,28 @@ void dna_adjust::PrintCompMeasurements_GXY(const UINT32& block, it_vmsr_t& _it_m for (cluster_msr=0; cluster_msrmeasType; + adj_file << std::left << std::setw(PAD2) << _it_msr->measType; else nextElement = true; covariance_count = _it_msr->vectorCount2; // first station - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; // Print second station? switch (_it_msr->measType) { case 'G': case 'X': - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; break; default: - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << " "; } // third station - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << " "; switch (printMode) { @@ -13013,9 +13015,9 @@ void dna_adjust::PrintCompMeasurements_GXY(const UINT32& block, it_vmsr_t& _it_m void dna_adjust::PrintCompMeasurements_HR(const UINT32& block, it_vmsr_t& _it_msr, UINT32& design_row, printMeasurementsMode printMode) { // normal format - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; - adj_file << left << setw(STATION) << " "; - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << " "; double computed, correction; @@ -13042,9 +13044,9 @@ void dna_adjust::PrintCompMeasurements_HR(const UINT32& block, it_vmsr_t& _it_ms void dna_adjust::PrintCompMeasurements_IJPQ(const UINT32& block, it_vmsr_t& _it_msr, UINT32& design_row, printMeasurementsMode printMode) { // normal format - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; - adj_file << left << setw(STATION) << " "; - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << " "; double computed, correction; @@ -13070,7 +13072,7 @@ void dna_adjust::PrintCompMeasurements_IJPQ(const UINT32& block, it_vmsr_t& _it_ void dna_adjust::PrintMeasurementsAngular(const char cardinal, const double& measurement, const double& correction, const it_vmsr_t& _it_msr, bool printAdjMsr) { - string ignoreFlag(" "); + std::string ignoreFlag(" "); double preAdjMeas(_it_msr->preAdjMeas); double adjMeas(measurement); @@ -13101,27 +13103,27 @@ void dna_adjust::PrintMeasurementsAngular(const char cardinal, const double& mea case 'v': // GNSS (alt units) Elevation // Change from printing whitespace for 2nd/3rd baseline station components, to // printing all station information - //adj_file << setw(PAD2+STATION+STATION+STATION) << " "; + //adj_file << std::setw(PAD2+STATION+STATION+STATION) << " "; // Measurement type - adj_file << left << setw(PAD2) << _it_msr->measType; + adj_file << std::left << std::setw(PAD2) << _it_msr->measType; // first station - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; // second station switch (_it_msr->measType) { case 'G': case 'X': - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; break; case 'Y': - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << " "; } // third station - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << " "; } - adj_file << setw(PAD3) << left << ignoreFlag << setw(PAD2) << left << cardinal; + adj_file << std::setw(PAD3) << std::left << ignoreFlag << std::setw(PAD2) << std::left << cardinal; double precision(0.0); @@ -13160,74 +13162,74 @@ void dna_adjust::PrintMeasurementsAngular(const char cardinal, const double& mea case SEPARATED_WITH_SYMBOLS: // ddd\B0 mm' ss.sss" adj_file << - setw(MSR) << right << FormatDmsString(RadtoDms(preAdjMeas), 4+PRECISION_SEC_MSR, // Measured (less correction + std::setw(MSR) << std::right << FormatDmsString(RadtoDms(preAdjMeas), 4+PRECISION_SEC_MSR, // Measured (less correction true, true) << // for deflections if applied) - setw(MSR) << right << FormatDmsString(RadtoDms(adjMeas), 4+PRECISION_SEC_MSR, // Adjusted + std::setw(MSR) << std::right << FormatDmsString(RadtoDms(adjMeas), 4+PRECISION_SEC_MSR, // Adjusted true, true); break; case HP_NOTATION: // ddd.mmssssss - adj_file << setw(MSR) << right << StringFromT(RadtoDms(preAdjMeas), 4+PRECISION_SEC_MSR) << // Measured (less correction for deflections) - setw(MSR) << right << StringFromT(RadtoDms(adjMeas), 4+PRECISION_SEC_MSR); // Adjusted + adj_file << std::setw(MSR) << std::right << StringFromT(RadtoDms(preAdjMeas), 4+PRECISION_SEC_MSR) << // Measured (less correction for deflections) + std::setw(MSR) << std::right << StringFromT(RadtoDms(adjMeas), 4+PRECISION_SEC_MSR); // Adjusted break; case SEPARATED: default: // ddd mm ss.ssss adj_file << - setw(MSR) << right << FormatDmsString(RadtoDms(preAdjMeas), 4+PRECISION_SEC_MSR, // Measured (less correction + std::setw(MSR) << std::right << FormatDmsString(RadtoDms(preAdjMeas), 4+PRECISION_SEC_MSR, // Measured (less correction true, false) << // for deflections if applied) - setw(MSR) << right << FormatDmsString(RadtoDms(adjMeas), 4+PRECISION_SEC_MSR, // Computed + std::setw(MSR) << std::right << FormatDmsString(RadtoDms(adjMeas), 4+PRECISION_SEC_MSR, // Computed true, false); break; } if (isAdjustmentQuestionable_ || (fabs(_it_msr->NStat) > criticalValue_ * 4.0)) adj_file << - right << StringFromTW(removeNegativeZero(Seconds(correction), PRECISION_SEC_MSR), CORR, PRECISION_SEC_MSR) << // correction - right << StringFromTW(Seconds(sqrt(precision)), PREC, PRECISION_SEC_MSR); // Precision (Meas) + std::right << StringFromTW(removeNegativeZero(Seconds(correction), PRECISION_SEC_MSR), CORR, PRECISION_SEC_MSR) << // correction + std::right << StringFromTW(Seconds(sqrt(precision)), PREC, PRECISION_SEC_MSR); // Precision (Meas) else adj_file << - setw(CORR) << right << StringFromT(removeNegativeZero(Seconds(correction), PRECISION_SEC_MSR), PRECISION_SEC_MSR) << // correction - setw(PREC) << right << StringFromT(Seconds(sqrt(precision)), PRECISION_SEC_MSR); // Precision (Meas) + std::setw(CORR) << std::right << StringFromT(removeNegativeZero(Seconds(correction), PRECISION_SEC_MSR), PRECISION_SEC_MSR) << // correction + std::setw(PREC) << std::right << StringFromT(Seconds(sqrt(precision)), PRECISION_SEC_MSR); // Precision (Meas) if (printAdjMsr) { if (isAdjustmentQuestionable_ || (fabs(_it_msr->NStat) > criticalValue_ * 4.0)) adj_file << - right << StringFromTW(Seconds(sqrt(_it_msr->measAdjPrec)), PREC, PRECISION_SEC_MSR) << // Precision (Adjusted) - right << StringFromTW(Seconds(sqrt(_it_msr->residualPrec)), PREC, PRECISION_SEC_MSR); // Precision (Residual) + std::right << StringFromTW(Seconds(sqrt(_it_msr->measAdjPrec)), PREC, PRECISION_SEC_MSR) << // Precision (Adjusted) + std::right << StringFromTW(Seconds(sqrt(_it_msr->residualPrec)), PREC, PRECISION_SEC_MSR); // Precision (Residual) else adj_file << - setw(PREC) << right << StringFromT(Seconds(sqrt(_it_msr->measAdjPrec)), PRECISION_SEC_MSR) << // Precision (Adjusted) - setw(PREC) << right << StringFromT(Seconds(sqrt(_it_msr->residualPrec)), PRECISION_SEC_MSR); // Precision (Residual) + std::setw(PREC) << std::right << StringFromT(Seconds(sqrt(_it_msr->measAdjPrec)), PRECISION_SEC_MSR) << // Precision (Adjusted) + std::setw(PREC) << std::right << StringFromT(Seconds(sqrt(_it_msr->residualPrec)), PRECISION_SEC_MSR); // Precision (Residual) } } else // DDEG { // ddd.dddddddd //TODO - is longitude being printed? If so, use DegreesL - adj_file << setw(MSR) << right << StringFromT(Degrees(preAdjMeas), 4+PRECISION_SEC_MSR) << // Measured (less correction for deflections) - setw(MSR) << right << StringFromT(Degrees(adjMeas), 4+PRECISION_SEC_MSR); // Adjusted + adj_file << std::setw(MSR) << std::right << StringFromT(Degrees(preAdjMeas), 4+PRECISION_SEC_MSR) << // Measured (less correction for deflections) + std::setw(MSR) << std::right << StringFromT(Degrees(adjMeas), 4+PRECISION_SEC_MSR); // Adjusted if (isAdjustmentQuestionable_ || (fabs(_it_msr->NStat) > criticalValue_ * 4.0)) adj_file << - right << StringFromTW(removeNegativeZero(Degrees(correction), PRECISION_SEC_MSR), CORR, PRECISION_SEC_MSR) << // Correction - right << StringFromTW(Degrees(sqrt(precision)), PREC, PRECISION_SEC_MSR); // Precision (Meas) + std::right << StringFromTW(removeNegativeZero(Degrees(correction), PRECISION_SEC_MSR), CORR, PRECISION_SEC_MSR) << // Correction + std::right << StringFromTW(Degrees(sqrt(precision)), PREC, PRECISION_SEC_MSR); // Precision (Meas) else adj_file << - setw(CORR) << right << StringFromT(removeNegativeZero(Degrees(correction), PRECISION_SEC_MSR), PRECISION_SEC_MSR) << // Correction - setw(PREC) << right << StringFromT(Degrees(sqrt(precision)), PRECISION_SEC_MSR); // Precision (Meas) + std::setw(CORR) << std::right << StringFromT(removeNegativeZero(Degrees(correction), PRECISION_SEC_MSR), PRECISION_SEC_MSR) << // Correction + std::setw(PREC) << std::right << StringFromT(Degrees(sqrt(precision)), PRECISION_SEC_MSR); // Precision (Meas) if (printAdjMsr) { if (isAdjustmentQuestionable_ || (fabs(_it_msr->NStat) > criticalValue_ * 4.0)) adj_file << - right << StringFromTW(Degrees(sqrt(_it_msr->measAdjPrec)), PREC, PRECISION_SEC_MSR) << // Precision (Adjusted) - right << StringFromTW(Degrees(sqrt(_it_msr->residualPrec)), PREC, PRECISION_SEC_MSR); // Precision (Residual) + std::right << StringFromTW(Degrees(sqrt(_it_msr->measAdjPrec)), PREC, PRECISION_SEC_MSR) << // Precision (Adjusted) + std::right << StringFromTW(Degrees(sqrt(_it_msr->residualPrec)), PREC, PRECISION_SEC_MSR); // Precision (Residual) else adj_file << - setw(PREC) << right << StringFromT(Degrees(sqrt(_it_msr->measAdjPrec)), PRECISION_SEC_MSR) << // Precision (Adjusted) - setw(PREC) << right << StringFromT(Degrees(sqrt(_it_msr->residualPrec)), PRECISION_SEC_MSR); // Precision (Residual) + std::setw(PREC) << std::right << StringFromT(Degrees(sqrt(_it_msr->measAdjPrec)), PRECISION_SEC_MSR) << // Precision (Adjusted) + std::setw(PREC) << std::right << StringFromT(Degrees(sqrt(_it_msr->residualPrec)), PRECISION_SEC_MSR); // Precision (Residual) } } } @@ -13260,7 +13262,7 @@ void dna_adjust::PrintMeasurementsLinear( const it_vmsr_t& _it_msr, bool printAdjMsr) { - string ignoreFlag(" "); + std::string ignoreFlag(" "); if (_it_msr->ignore) ignoreFlag = "*"; @@ -13274,36 +13276,36 @@ void dna_adjust::PrintMeasurementsLinear( case 's': // Change from printing whitespace for 2nd/3rd baseline station components, to // printing all station information - //adj_file << setw(PAD2+STATION+STATION+STATION) << " "; + //adj_file << std::setw(PAD2+STATION+STATION+STATION) << " "; // Measurement type - adj_file << left << setw(PAD2) << _it_msr->measType; + adj_file << std::left << std::setw(PAD2) << _it_msr->measType; // first station - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; // second station switch (_it_msr->measType) { case 'G': case 'X': - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; break; case 'Y': - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << " "; } // third station - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << " "; } - adj_file << setw(PAD3) << left << ignoreFlag << setw(PAD2) << left << cardinal << // If GPS, then 'X', 'Y' or 'Z', else ' ' - setw(MSR) << setprecision(PRECISION_MTR_MSR) << fixed << right << _it_msr->preAdjMeas << // Measured (less correction for geoid) - setw(MSR) << setprecision(PRECISION_MTR_MSR) << fixed << right << measurement; // Adjusted + adj_file << std::setw(PAD3) << std::left << ignoreFlag << std::setw(PAD2) << std::left << cardinal << // If GPS, then 'X', 'Y' or 'Z', else ' ' + std::setw(MSR) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << _it_msr->preAdjMeas << // Measured (less correction for geoid) + std::setw(MSR) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << measurement; // Adjusted if (isAdjustmentQuestionable_ || (fabs(_it_msr->NStat) > criticalValue_ * 4.0)) adj_file << - right << StringFromTW(removeNegativeZero(correction, PRECISION_MTR_MSR), CORR, PRECISION_MTR_MSR); // Correction + std::right << StringFromTW(removeNegativeZero(correction, PRECISION_MTR_MSR), CORR, PRECISION_MTR_MSR); // Correction else adj_file << - setw(CORR) << setprecision(PRECISION_MTR_MSR) << fixed << right << + std::setw(CORR) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << removeNegativeZero(correction, PRECISION_MTR_MSR); // Correction // print the correct precision term @@ -13316,25 +13318,25 @@ void dna_adjust::PrintMeasurementsLinear( { case 'X': // XYZ case 'e': // ENU - adj_file << setw(PREC) << setprecision(PRECISION_MTR_MSR) << fixed << right << sqrt(_it_msr->term2); // Precision (Meas) + adj_file << std::setw(PREC) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << sqrt(_it_msr->term2); // Precision (Meas) break; case 'Y': // XYZ case 'n': // ENU - adj_file << setw(PREC) << setprecision(PRECISION_MTR_MSR) << fixed << right << sqrt(_it_msr->term3); // Precision (Meas) + adj_file << std::setw(PREC) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << sqrt(_it_msr->term3); // Precision (Meas) break; case 'Z': // XYZ case 'u': // ENU case 'H': // LLH (Lat and Lon cardinals are printed in PrintMeasurementsAngular) - adj_file << setw(PREC) << setprecision(PRECISION_MTR_MSR) << fixed << right << sqrt(_it_msr->term4); // Precision (Meas) + adj_file << std::setw(PREC) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << sqrt(_it_msr->term4); // Precision (Meas) break; case 's': // AED (Azimuth and vertical angle cardinals are printed in PrintMeasurementsAngular) switch (projectSettings_.o._adj_gnss_units) { case AED_adj_gnss_ui: - adj_file << setw(PREC) << setprecision(PRECISION_MTR_MSR) << fixed << right << sqrt(_it_msr->term4); // Precision (Meas) + adj_file << std::setw(PREC) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << sqrt(_it_msr->term4); // Precision (Meas) break; case ADU_adj_gnss_ui: - adj_file << setw(PREC) << setprecision(PRECISION_MTR_MSR) << fixed << right << sqrt(_it_msr->term3); // Precision (Meas) + adj_file << std::setw(PREC) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << sqrt(_it_msr->term3); // Precision (Meas) break; } break; @@ -13344,18 +13346,18 @@ void dna_adjust::PrintMeasurementsLinear( if (isAdjustmentQuestionable_ || (fabs(_it_msr->NStat) > criticalValue_ * 4.0)) adj_file << StringFromTW(sqrt(_it_msr->term2), PREC, PRECISION_MTR_MSR); // Precision (Meas) else - adj_file << setw(PREC) << setprecision(PRECISION_MTR_MSR) << fixed << right << sqrt(_it_msr->term2); // Precision (Meas) + adj_file << std::setw(PREC) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << sqrt(_it_msr->term2); // Precision (Meas) } if (printAdjMsr) { if (isAdjustmentQuestionable_ || (fabs(_it_msr->NStat) > criticalValue_ * 4.0)) adj_file << - right << StringFromTW(sqrt(_it_msr->measAdjPrec), PREC, PRECISION_MTR_MSR) << // Precision (Adjusted) - right << StringFromTW(sqrt(_it_msr->residualPrec), PREC, PRECISION_MTR_MSR); // Precision (Residual) + std::right << StringFromTW(sqrt(_it_msr->measAdjPrec), PREC, PRECISION_MTR_MSR) << // Precision (Adjusted) + std::right << StringFromTW(sqrt(_it_msr->residualPrec), PREC, PRECISION_MTR_MSR); // Precision (Residual) else - adj_file << setw(PREC) << setprecision(PRECISION_MTR_MSR) << fixed << right << sqrt(_it_msr->measAdjPrec) << // Precision (Adjusted) - setw(PREC) << setprecision(PRECISION_MTR_MSR) << fixed << right << sqrt(_it_msr->residualPrec); // Precision (Residual) + adj_file << std::setw(PREC) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << sqrt(_it_msr->measAdjPrec) << // Precision (Adjusted) + std::setw(PREC) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << sqrt(_it_msr->residualPrec); // Precision (Residual) } } @@ -13374,7 +13376,7 @@ void dna_adjust::PrintMeasurementCorrection(const char cardinal, const it_vmsr_t case 'V': case 'Z': // Pre adjustment correction for deflections - adj_file << setw(PACORR) << setprecision(PRECISION_SEC_MSR) << fixed << right << + adj_file << std::setw(PACORR) << std::setprecision(PRECISION_SEC_MSR) << std::fixed << std::right << removeNegativeZero(Seconds(_it_msr->preAdjCorr), PRECISION_SEC_MSR); break; case 'Y': @@ -13383,15 +13385,15 @@ void dna_adjust::PrintMeasurementCorrection(const char cardinal, const it_vmsr_t switch (cardinal) { case 'H': - adj_file << setw(PACORR) << setprecision(PRECISION_MTR_MSR) << fixed << right << + adj_file << std::setw(PACORR) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << removeNegativeZero(_it_msr->preAdjCorr, PRECISION_MTR_MSR); break; case 'P': case 'L': - adj_file << setw(PACORR) << setprecision(PRECISION_SEC_MSR) << fixed << right << 0.0; + adj_file << std::setw(PACORR) << std::setprecision(PRECISION_SEC_MSR) << std::fixed << std::right << 0.0; break; default: // X, Y, Z - adj_file << setw(PACORR) << setprecision(PRECISION_MTR_MSR) << fixed << right << 0.0; + adj_file << std::setw(PACORR) << std::setprecision(PRECISION_MTR_MSR) << std::fixed << std::right << 0.0; break; } break; @@ -13405,7 +13407,7 @@ void dna_adjust::PrintMeasurementCorrection(const char cardinal, const it_vmsr_t case 'X': default: // Pre adjustment correction for N-value or reductions from MSL/ellipsoid arcs - adj_file << setw(PACORR) << setprecision(PRECISION_SEC_MSR) << fixed << right << + adj_file << std::setw(PACORR) << std::setprecision(PRECISION_SEC_MSR) << std::fixed << std::right << removeNegativeZero(_it_msr->preAdjCorr, PRECISION_SEC_MSR); break; } @@ -13424,9 +13426,9 @@ void dna_adjust::PrintMeasurementDatabaseID(const it_vmsr_t& _it_msr, bool initi // Print measurement id if (_it_dbid->is_msr_id_set) - adj_file << setw(STDDEV) << right << _it_dbid->msr_id; + adj_file << std::setw(STDDEV) << std::right << _it_dbid->msr_id; else - adj_file << setw(STDDEV) << " "; + adj_file << std::setw(STDDEV) << " "; // Print cluster id? switch (_it_msr->measType) @@ -13436,9 +13438,9 @@ void dna_adjust::PrintMeasurementDatabaseID(const it_vmsr_t& _it_msr, bool initi case 'X': case 'Y': if (_it_dbid->is_cls_id_set) - adj_file << setw(STDDEV) << right << _it_dbid->cluster_id; + adj_file << std::setw(STDDEV) << std::right << _it_dbid->cluster_id; else - adj_file << setw(STDDEV) << " "; + adj_file << std::setw(STDDEV) << " "; } } @@ -13450,7 +13452,7 @@ void dna_adjust::PrintAdjMeasurementStatistics(const char cardinal, const it_vms if (isAdjustmentQuestionable_ || (fabs(_it_msr->NStat) > criticalValue_ * 4.0)) adj_file << StringFromTW(removeNegativeZero(_it_msr->NStat, 2), STAT, PRECISION_STAT); // N Stat else - adj_file << setw(STAT) << setprecision(2) << fixed << right << + adj_file << std::setw(STAT) << std::setprecision(2) << std::fixed << std::right << removeNegativeZero(_it_msr->NStat, 2); // N Stat if (projectSettings_.o._adj_msr_tstat) @@ -13458,34 +13460,34 @@ void dna_adjust::PrintAdjMeasurementStatistics(const char cardinal, const it_vms if (isAdjustmentQuestionable_ || (fabs(_it_msr->NStat) > criticalValue_ * 4.0)) adj_file << StringFromTW(removeNegativeZero(_it_msr->TStat, 2), STAT, PRECISION_STAT); // T Stat else - adj_file << setw(STAT) << setprecision(2) << fixed << right << + adj_file << std::setw(STAT) << std::setprecision(2) << std::fixed << std::right << removeNegativeZero(_it_msr->TStat, 2); // T Stat } - adj_file << setw(REL) << setprecision(2) << fixed << right << _it_msr->PelzerRel; // Pelzer's reliability + adj_file << std::setw(REL) << std::setprecision(2) << std::fixed << std::right << _it_msr->PelzerRel; // Pelzer's reliability // Print measurement correction PrintMeasurementCorrection(cardinal, _it_msr); // Print asterisk for values which exceed the critical value if (fabs(_it_msr->NStat) > criticalValue_) - adj_file << setw(OUTLIER) << right << "*"; + adj_file << std::setw(OUTLIER) << std::right << "*"; else - adj_file << setw(OUTLIER) << right << " "; + adj_file << std::setw(OUTLIER) << std::right << " "; // Print measurement database ids if (projectSettings_.o._database_ids) PrintMeasurementDatabaseID(_it_msr, initialise_dbindex); - adj_file << endl; + adj_file << std::endl; } void dna_adjust::PrintAdjMeasurements_A(it_vmsr_t& _it_msr) { // normal format - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station3).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station3).stationName; // Print angular measurement, taking care of user requirements for // type, format and precision @@ -13496,9 +13498,9 @@ void dna_adjust::PrintAdjMeasurements_A(it_vmsr_t& _it_msr) void dna_adjust::PrintAdjMeasurements_BKVZ(it_vmsr_t& _it_msr) { // normal format - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; + adj_file << std::left << std::setw(STATION) << " "; // Print angular measurement, taking care of user requirements for // type, format and precision @@ -13509,9 +13511,9 @@ void dna_adjust::PrintAdjMeasurements_BKVZ(it_vmsr_t& _it_msr) void dna_adjust::PrintAdjMeasurements_CELMS(it_vmsr_t& _it_msr) { // normal format - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; + adj_file << std::left << std::setw(STATION) << " "; PrintAdjMeasurementsLinear(' ', _it_msr); } @@ -13523,18 +13525,18 @@ void dna_adjust::PrintAdjMeasurements_CELMS(it_vmsr_t& _it_msr) void dna_adjust::PrintAdjMeasurements_D(it_vmsr_t& _it_msr) { // normal format - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; + adj_file << std::left << std::setw(STATION) << " "; - string ignoreFlag(" "); + std::string ignoreFlag(" "); if (_it_msr->ignore) ignoreFlag = "*"; UINT32 a, angle_count(_it_msr->vectorCount2 - 1); UINT32 skip(0), ignored(_it_msr->vectorCount1 - _it_msr->vectorCount2); - adj_file << setw(PAD3) << left << ignoreFlag << setw(PAD2) << left << angle_count; + adj_file << std::setw(PAD3) << std::left << ignoreFlag << std::setw(PAD2) << std::left << angle_count; if (projectSettings_.o._database_ids) { @@ -13542,11 +13544,11 @@ void dna_adjust::PrintAdjMeasurements_D(it_vmsr_t& _it_msr) UINT32 b(MSR + MSR + CORR + PREC + PREC + PREC + STAT + REL + PACORR + OUTLIER); if (projectSettings_.o._adj_msr_tstat) b += STAT; - adj_file << setw(b) << " "; + adj_file << std::setw(b) << " "; PrintMeasurementDatabaseID(_it_msr); } - adj_file << endl; + adj_file << std::endl; _it_msr++; @@ -13564,10 +13566,10 @@ void dna_adjust::PrintAdjMeasurements_D(it_vmsr_t& _it_msr) } } - adj_file << left << setw(PAD2) << " "; // measurement type - adj_file << left << setw(STATION) << " "; // station1 (Instrument) - adj_file << left << setw(STATION) << " "; // station2 (RO) - adj_file << left << setw(STATION) << + adj_file << std::left << std::setw(PAD2) << " "; // measurement type + adj_file << std::left << std::setw(STATION) << " "; // station1 (Instrument) + adj_file << std::left << std::setw(STATION) << " "; // station2 (RO) + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; // target // Print angular measurement, taking care of user requirements for @@ -13741,7 +13743,7 @@ void dna_adjust::PrintAdjMeasurements_YLLH(it_vmsr_t& _it_msr) stn1_it = bstBinaryRecords_.begin() + _it_y_msr->station1; if (nextElement) - adj_file << left << setw(PAD2) << _it_y_msr->measType; + adj_file << std::left << std::setw(PAD2) << _it_y_msr->measType; else nextElement = true; @@ -13780,10 +13782,10 @@ void dna_adjust::PrintAdjMeasurements_YLLH(it_vmsr_t& _it_msr) _it_y_msr-=2; // first, second, third stations - adj_file << left << setw(STATION) << + adj_file << std::left << std::setw(STATION) << stn1_it->stationName << - left << setw(STATION) << " " << // second station - left << setw(STATION) << " "; // third station + std::left << std::setw(STATION) << " " << // second station + std::left << std::setw(STATION) << " "; // third station // Print X PrintAdjMeasurementsAngular('P', _it_y_msr); @@ -13824,28 +13826,28 @@ void dna_adjust::PrintAdjMeasurements_GXY(it_vmsr_t& _it_msr, const uint32_uint3 for (cluster_msr=0; cluster_msrmeasType; + adj_file << std::left << std::setw(PAD2) << _it_msr->measType; else nextElement = true; covariance_count = _it_msr->vectorCount2; // first station - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; // Print second station? switch (_it_msr->measType) { case 'G': case 'X': - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station2).stationName; break; default: - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << " "; } // third station - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << " "; // Print adjusted GNSS baseline measurements in alternate units? if (projectSettings_.o._adj_gnss_units != XYZ_adj_gnss_ui && @@ -14210,9 +14212,9 @@ void dna_adjust::PrintAdjGNSSAlternateUnits(it_vmsr_t& _it_msr, const uint32_uin void dna_adjust::PrintAdjMeasurements_HR(it_vmsr_t& _it_msr) { // normal format - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; - adj_file << left << setw(STATION) << " "; - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << " "; PrintAdjMeasurementsLinear(' ', _it_msr); } @@ -14221,9 +14223,9 @@ void dna_adjust::PrintAdjMeasurements_HR(it_vmsr_t& _it_msr) void dna_adjust::PrintAdjMeasurements_IJPQ(it_vmsr_t& _it_msr) { // normal format - adj_file << left << setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; - adj_file << left << setw(STATION) << " "; - adj_file << left << setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << bstBinaryRecords_.at(_it_msr->station1).stationName; + adj_file << std::left << std::setw(STATION) << " "; + adj_file << std::left << std::setw(STATION) << " "; // Print angular measurement, taking care of user requirements for // type, format and precision @@ -14235,7 +14237,7 @@ void dna_adjust::PrintAdjMeasurements_IJPQ(it_vmsr_t& _it_msr) // Purpose: Closes all files (if file pointers are passed in) and throws NetAdjustException // Called by: Any // Calls: NetAdjustException() -void dna_adjust::SignalExceptionAdjustment(const string& msg, const UINT32 block_no) +void dna_adjust::SignalExceptionAdjustment(const std::string& msg, const UINT32 block_no) { adjustStatus_ = ADJUST_EXCEPTION_RAISED; @@ -14243,18 +14245,18 @@ void dna_adjust::SignalExceptionAdjustment(const string& msg, const UINT32 block isCombining_ = false; isAdjusting_ = false; - string error_msg(msg); + std::string error_msg(msg); switch (projectSettings_.a.adjust_mode) { case Phased_Block_1Mode: case PhasedMode: - stringstream ss; - ss << msg << endl << " Phased adjustment terminated whilst processing block " << block_no + 1 << endl; + std::stringstream ss; + ss << msg << std::endl << " Phased adjustment terminated whilst processing block " << block_no + 1 << std::endl; error_msg = ss.str(); } - throw boost::enable_current_exception(runtime_error(error_msg)); + throw boost::enable_current_exception(std::runtime_error(error_msg)); } void dna_adjust::SetDefaultReferenceFrame() @@ -14288,21 +14290,21 @@ void dna_adjust::SetDefaultReferenceFrame() bst.load_bst_file_meta(projectSettings_.a.bst_file, bst_meta_); datum_.SetDatumFromEpsg(bst_meta_.epsgCode, bst_meta_.epoch); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } } void dna_adjust::LoadNetworkFiles() { - adj_file << "+ Loading network files" << endl; + adj_file << "+ Loading network files" << std::endl; try { // Load binary stations data. Throws runtime_error on failure. dna_io_bst bst; bstn_count_ = bst.load_bst_file(projectSettings_.a.bst_file, &bstBinaryRecords_, bst_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -14337,7 +14339,7 @@ void dna_adjust::LoadNetworkFiles() dna_io_asl asl; asl_count_ = asl.load_asl_file(projectSettings_.s.asl_file, &vAssocStnList_, &v_ISLTemp); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -14360,8 +14362,8 @@ void dna_adjust::LoadNetworkFiles() // check memory availability for block station map if (v_blockStationsMap_.at(0).max_size() <= v_ISL_.at(0).size()) { - stringstream ss; - ss << "LoadNetworkFiles(): Could not allocate sufficient memory for blockStationsMap." << endl; + std::stringstream ss; + ss << "LoadNetworkFiles(): Could not allocate sufficient memory for blockStationsMap." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -14375,7 +14377,7 @@ void dna_adjust::LoadNetworkFiles() dna_io_bms bms; bmsr_count_ = bms.load_bms_file(projectSettings_.a.bms_file, &bmsBinaryRecords_, bms_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -14503,9 +14505,9 @@ void dna_adjust::LoadNetworkFiles() if (m == 0) { - stringstream ss; - ss << "No measurements were found." << endl << - " If measurements were successfully loaded on import, ensure that\n all measurements have not been ignored." << endl; + std::stringstream ss; + ss << "No measurements were found." << std::endl << + " If measurements were successfully loaded on import, ensure that\n all measurements have not been ignored." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -14525,10 +14527,10 @@ void dna_adjust::LoadNetworkFiles() void dna_adjust::AddDiscontinuitySites(vstring& constraintStns) { // sort on original name - sort(bstBinaryRecords_.begin(), bstBinaryRecords_.end(), CompareStnOriginalName()); + std::sort(bstBinaryRecords_.begin(), bstBinaryRecords_.end(), CompareStnOriginalName()); - pair it_stn_range; - string constraint; + std::pair it_stn_range; + std::string constraint; _it_vstr const_it; @@ -14538,7 +14540,7 @@ void dna_adjust::AddDiscontinuitySites(vstring& constraintStns) for (const_it=constraintStns.begin(); const_it!=constraintStns.end(); ++const_it) { // find this constraint station in the station map - it_stn_range = equal_range(bstBinaryRecords_.begin(), bstBinaryRecords_.end(), (*const_it), CompareStnOriginalName()); + it_stn_range = equal_range(bstBinaryRecords_.begin(), bstBinaryRecords_.end(), (*const_it), CompareStnOriginalName()); if (it_stn_range.first == it_stn_range.second) { // Not in the map. Get the next one @@ -14558,7 +14560,7 @@ void dna_adjust::AddDiscontinuitySites(vstring& constraintStns) constraintStns.insert(constraintStns.end(), constraintDiscontStns.begin(), constraintDiscontStns.end()); // restore original sort order - sort(bstBinaryRecords_.begin(), bstBinaryRecords_.end(), CompareStnName()); + std::sort(bstBinaryRecords_.begin(), bstBinaryRecords_.end(), CompareStnName()); } // Take user-supplied type B uncertainties and compute relevant elements for @@ -14579,7 +14581,7 @@ void dna_adjust::InitialiseTypeBUncertainties() tbu.load_tbu_argument(projectSettings_.a.type_b_global, typeBUncertaintyGlobal_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } catch (...) { @@ -14600,7 +14602,7 @@ void dna_adjust::InitialiseTypeBUncertainties() try { tbu.load_tbu_file(projectSettings_.a.type_b_file, v_typeBUncertaintiesLocal_, vStnsMap); - sort(v_typeBUncertaintiesLocal_.begin(), v_typeBUncertaintiesLocal_.end()); + std::sort(v_typeBUncertaintiesLocal_.begin(), v_typeBUncertaintiesLocal_.end()); // reduce to the cartesian reference frame tbu.reduce_uncertainties_local(v_typeBUncertaintiesLocal_, bstBinaryRecords_); @@ -14608,7 +14610,7 @@ void dna_adjust::InitialiseTypeBUncertainties() catch (const std::ifstream::failure& f) { SignalExceptionAdjustment(f.what(), 0); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } } @@ -14667,15 +14669,15 @@ void dna_adjust::ApplyAdditionalConstraints() projectSettings_.a.map_file = projectSettings_.g.input_folder + FOLDER_SLASH + projectSettings_.g.network_name + ".map"; LoadStationMap(&vStnsMap, projectSettings_.a.map_file); - string constraint; + std::string constraint; vstring constraintStns; _it_vstr const_it; try { // Extract constraints from comma delimited string - SplitDelimitedString( + SplitDelimitedString( projectSettings_.a.station_constraints, // the comma delimited string - string(","), // the delimiter + std::string(","), // the delimiter &constraintStns); // the respective values } catch (...) { @@ -14706,9 +14708,9 @@ void dna_adjust::ApplyAdditionalConstraints() continue; } - stringstream ss; + std::stringstream ss; ss << "The supplied constraint station " << (*const_it) << " is not in the stations map. Please ensure that " << - (*const_it) << " is included in the list of stations." << endl; + (*const_it) << " is included in the list of stations." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -14723,8 +14725,8 @@ void dna_adjust::ApplyAdditionalConstraints() if (!CDnaStation::IsValidConstraint(constraint)) { - stringstream ss; - ss << "The supplied station constraint " << constraint << " is not a valid constraint." << endl; + std::stringstream ss; + ss << "The supplied station constraint " << constraint << " is not a valid constraint." << std::endl; SignalExceptionAdjustment(ss.str(), 0); } @@ -14734,14 +14736,14 @@ void dna_adjust::ApplyAdditionalConstraints() } -void dna_adjust::LoadStationMap(pv_string_uint32_pair stnsMap, const string& stnmap_file) +void dna_adjust::LoadStationMap(pv_string_uint32_pair stnsMap, const std::string& stnmap_file) { try { // Load station map. Throws runtime_error on failure. dna_io_map map; map.load_map_file(stnmap_file, stnsMap); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } } @@ -14749,7 +14751,7 @@ void dna_adjust::LoadStationMap(pv_string_uint32_pair stnsMap, const string& stn void dna_adjust::ResizeMatrixVectors() { - adj_file << "+ Allocating memory" << endl; + adj_file << "+ Allocating memory" << std::endl; switch (projectSettings_.a.adjust_mode) { @@ -14794,8 +14796,10 @@ void dna_adjust::ResizeMatrixVectors() v_originalStations_.resize(blockCount_); v_corrections_.resize(blockCount_); +#ifdef MULTI_THREAD_ADJUST if (projectSettings_.a.multi_thread) v_normalsRC_.resize(blockCount_); +#endif for (UINT32 block(0); block 1) { - debug_file << endl << "Station appearance list" << endl; + debug_file << std::endl << "Station appearance list" << std::endl; it_vUINT32_const _it_const; it_vstn_appear _it_appear; for (UINT32 block(0); block!=blockCount_; ++block) { - debug_file << "Block " << block << endl; - debug_file << setw(HEADER_20) << "Station" << setw(HEADER_20) << "Forward" << setw(HEADER_20) << "Reverse" << setw(HEADER_20) << " " << endl; + debug_file << "Block " << block << std::endl; + debug_file << std::setw(HEADER_20) << "Station" << std::setw(HEADER_20) << "Forward" << std::setw(HEADER_20) << "Reverse" << std::setw(HEADER_20) << " " << std::endl; for (_it_const=v_parameterStationList_.at(block).begin(), _it_appear=v_paramStnAppearance_.at(block).begin(); @@ -15018,27 +15022,27 @@ void dna_adjust::LoadSegmentationMetrics() ++_it_const, ++_it_appear) { // station id - debug_file << setw(HEADER_20) << *_it_const; + debug_file << std::setw(HEADER_20) << *_it_const; // forward if (_it_appear->first_appearance_fwd) - debug_file << setw(HEADER_20) << "true"; + debug_file << std::setw(HEADER_20) << "true"; else - debug_file << setw(HEADER_20) << "false"; + debug_file << std::setw(HEADER_20) << "false"; // reverse if (_it_appear->first_appearance_rev) - debug_file << setw(HEADER_20) << "true" << endl; + debug_file << std::setw(HEADER_20) << "true" << std::endl; else - debug_file << setw(HEADER_20) << "false" << endl; + debug_file << std::setw(HEADER_20) << "false" << std::endl; } - debug_file << endl; + debug_file << std::endl; } - debug_file << endl; + debug_file << std::endl; } } -void dna_adjust::LoadSegmentationFileParameters(const string& seg_filename) +void dna_adjust::LoadSegmentationFileParameters(const std::string& seg_filename) { UINT32 blockThreshold, minInnerStns; @@ -15048,7 +15052,7 @@ void dna_adjust::LoadSegmentationFileParameters(const string& seg_filename) seg.load_seg_file_header_f(seg_filename, blockCount_, blockThreshold, minInnerStns); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } } @@ -15068,7 +15072,7 @@ void dna_adjust::LoadSegmentationFile() &v_measurementCount_, &v_unknownsCount_, &v_ContiguousNetList_, &v_parameterStationCount_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionAdjustment(e.what(), 0); } @@ -15093,9 +15097,9 @@ void dna_adjust::RemoveDuplicateStations(vUINT32& vStations) void dna_adjust::RemoveInvalidISLStations(vUINT32& v_ISLTemp) { CompareValidity aslValidityCompareFunc(&vAssocStnList_, FALSE); - sort(v_ISLTemp.begin(), v_ISLTemp.end(), aslValidityCompareFunc); + std::sort(v_ISLTemp.begin(), v_ISLTemp.end(), aslValidityCompareFunc); erase_if(v_ISLTemp, aslValidityCompareFunc); - sort(v_ISLTemp.begin(), v_ISLTemp.end()); + std::sort(v_ISLTemp.begin(), v_ISLTemp.end()); } @@ -15106,12 +15110,12 @@ void dna_adjust::RemoveNonMeasurements(const UINT32& block) return; // Strip anything that is not xMeas CompareNonMeasStart measstartCompareFunc(&bmsBinaryRecords_, xMeas); - sort(v_CML_.at(block).begin(), v_CML_.at(block).end(), measstartCompareFunc); + std::sort(v_CML_.at(block).begin(), v_CML_.at(block).end(), measstartCompareFunc); erase_if(v_CML_.at(block), measstartCompareFunc); // Sort CML on file order (default option) CompareMsrFileOrder fileorderCompareFunc(&bmsBinaryRecords_); - sort(v_CML_.at(block).begin(), v_CML_.at(block).end(), fileorderCompareFunc); + std::sort(v_CML_.at(block).begin(), v_CML_.at(block).end(), fileorderCompareFunc); } @@ -15121,7 +15125,7 @@ void dna_adjust::SortMeasurementsbyType(v_uint32_u32u32_pair& msr_block) if (msr_block.size() < 2) return; CompareMeasType_PairFirst meastypeCompareFunc(&bmsBinaryRecords_); - sort(msr_block.begin(), msr_block.end(), meastypeCompareFunc); + std::sort(msr_block.begin(), msr_block.end(), meastypeCompareFunc); } @@ -15130,7 +15134,7 @@ void dna_adjust::SortMeasurementsbyFromStn(v_uint32_u32u32_pair& msr_block) if (msr_block.size() < 2) return; CompareMeasFromStn_PairFirst measfromstnCompareFunc(&bmsBinaryRecords_); - sort(msr_block.begin(), msr_block.end(), measfromstnCompareFunc); + std::sort(msr_block.begin(), msr_block.end(), measfromstnCompareFunc); } @@ -15139,7 +15143,7 @@ void dna_adjust::SortMeasurementsbyToStn(v_uint32_u32u32_pair& msr_block) if (msr_block.size() < 2) return; CompareMeasToStn_PairFirst meastostnCompareFunc(&bmsBinaryRecords_); - sort(msr_block.begin(), msr_block.end(), meastostnCompareFunc); + std::sort(msr_block.begin(), msr_block.end(), meastostnCompareFunc); } @@ -15148,7 +15152,7 @@ void dna_adjust::SortMeasurementsbyValue(v_uint32_u32u32_pair& msr_block) if (msr_block.size() < 2) return; CompareMeasValue_PairFirst measvalueCompareFunc(&bmsBinaryRecords_); - sort(msr_block.begin(), msr_block.end(), measvalueCompareFunc); + std::sort(msr_block.begin(), msr_block.end(), measvalueCompareFunc); } @@ -15157,7 +15161,7 @@ void dna_adjust::SortMeasurementsbyResidual(v_uint32_u32u32_pair& msr_block) if (msr_block.size() < 2) return; CompareMeasResidual_PairFirst measresidualCompareFunc(&bmsBinaryRecords_); - sort(msr_block.begin(), msr_block.end(), measresidualCompareFunc); + std::sort(msr_block.begin(), msr_block.end(), measresidualCompareFunc); } @@ -15166,7 +15170,7 @@ void dna_adjust::SortMeasurementsbyAdjSD(v_uint32_u32u32_pair& msr_block) if (msr_block.size() < 2) return; CompareMeasAdjSD_PairFirst measadjsdCompareFunc(&bmsBinaryRecords_); - sort(msr_block.begin(), msr_block.end(), measadjsdCompareFunc); + std::sort(msr_block.begin(), msr_block.end(), measadjsdCompareFunc); } @@ -15175,7 +15179,7 @@ void dna_adjust::SortMeasurementsbyNstat(v_uint32_u32u32_pair& msr_block) if (msr_block.size() < 2) return; CompareMeasNstat_PairFirst measnstatCompareFunc(&bmsBinaryRecords_); - sort(msr_block.begin(), msr_block.end(), measnstatCompareFunc); + std::sort(msr_block.begin(), msr_block.end(), measnstatCompareFunc); } diff --git a/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp b/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp index 6b0210a6..6b538534 100644 --- a/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp +++ b/dynadjust/dynadjust/dnaadjust/dnaadjust.hpp @@ -91,12 +91,6 @@ #include -using namespace std; -using namespace boost; -using namespace boost::posix_time; -using namespace boost::filesystem; -using namespace boost::math; - using namespace dynadjust::datum_parameters; using namespace dynadjust::measurements; using namespace dynadjust::math; @@ -133,7 +127,7 @@ class adjust_process_prepare_thread { public: adjust_process_prepare_thread( dna_adjust* dnaAdj, const UINT32& id, - boost::exception_ptr& error, vector& prep_errors) + boost::exception_ptr& error, std::vector& prep_errors) : main_adj_(dnaAdj) , thread_id_(id) , error_(error) @@ -145,7 +139,7 @@ class adjust_process_prepare_thread { dna_adjust* main_adj_; UINT32 thread_id_; boost::exception_ptr& error_; - vector& prep_errors_; + std::vector& prep_errors_; // Prevent assignment operator adjust_process_prepare_thread& operator=(const adjust_process_prepare_thread& rhs); @@ -207,7 +201,7 @@ class adjust_process_combine_thread { public: adjust_process_combine_thread( dna_adjust* dnaAdj, const UINT32& id, - boost::exception_ptr& error, vector& cmb_errors) + boost::exception_ptr& error, std::vector& cmb_errors) : main_adj_(dnaAdj) , thread_id_(id) , error_(error) @@ -219,7 +213,7 @@ class adjust_process_combine_thread { dna_adjust* main_adj_; UINT32 thread_id_; boost::exception_ptr& error_; - vector& cmb_errors_; + std::vector& cmb_errors_; // Prevent assignment operator adjust_process_combine_thread& operator=(const adjust_process_combine_thread& rhs); @@ -286,9 +280,9 @@ class dna_adjust { void PrintAdjustedNetworkMeasurements(); void PrintMeasurementsToStation(); - bool PrintEstimatedStationCoordinatestoSNX(string& sinex_file); - void PrintEstimatedStationCoordinatestoDNAXML(const string& stnFile, INPUT_FILE_TYPE t, bool flagUnused = false); - void PrintEstimatedStationCoordinatestoDNAXML_Y(const string& msrFile, INPUT_FILE_TYPE t); + bool PrintEstimatedStationCoordinatestoSNX(std::string& sinex_file); + void PrintEstimatedStationCoordinatestoDNAXML(const std::string& stnFile, INPUT_FILE_TYPE t, bool flagUnused = false); + void PrintEstimatedStationCoordinatestoDNAXML_Y(const std::string& msrFile, INPUT_FILE_TYPE t); void CloseOutputFiles(); void UpdateBinaryFiles(); @@ -314,7 +308,7 @@ class dna_adjust { }; inline UINT32 blockCount() const { return blockCount_; } - inline milliseconds adjustTime() const { return total_time_; } + inline boost::posix_time::milliseconds adjustTime() const { return total_time_; } inline bool processingForward() { return forward_; } inline bool processingCombine() { return isCombining_; } inline int GetDegreesOfFreedom() const { return degreesofFreedom_; } @@ -331,7 +325,7 @@ class dna_adjust { void GetMemoryFootprint(double& memory, const _MEM_UNIT_ unit); - void LoadSegmentationFileParameters(const string& seg_filename); + void LoadSegmentationFileParameters(const std::string& seg_filename); void SerialiseAdjustedVarianceMatrices(); void DeSerialiseAdjustedVarianceMatrices(); @@ -342,7 +336,7 @@ class dna_adjust { inline bool GetMessageIteration(UINT32& iteration) { return iterationQueue_.front_and_pop(iteration); } // iteration is indexed from 1. That is, not zero-indexed. - inline string GetMaxCorrection(const UINT32& iteration) const { + inline std::string GetMaxCorrection(const UINT32& iteration) const { if (iteration == 0) return iterationCorrections_.get_message(iteration); // safe guard return iterationCorrections_.get_message(iteration-1); @@ -351,25 +345,25 @@ class dna_adjust { #ifdef MULTI_THREAD_ADJUST - concurrent_ofstream concurrent_adj_ofstream; + concurrent_ofstream concurrent_adj_ofstream; - inline void ThreadSafeWritetoAdjFile(const string& s) { + inline void ThreadSafeWritetoAdjFile(const std::string& s) { concurrent_adj_ofstream.wrtie(adj_file, s); } - inline void WriteStatstoAdjFile(const string& s) { + inline void WriteStatstoAdjFile(const std::string& s) { if (projectSettings_.o._adj_stat_iteration) ThreadSafeWritetoAdjFile(s); } - inline void WriteStntoAdjFile(const string& s) { + inline void WriteStntoAdjFile(const std::string& s) { if (projectSettings_.o._adj_stn_iteration) ThreadSafeWritetoAdjFile(s); } - inline void WriteMsrtoAdjFile(const string& s) { + inline void WriteMsrtoAdjFile(const std::string& s) { if (projectSettings_.o._adj_msr_iteration) ThreadSafeWritetoAdjFile(s); } - inline void ThreadSafeWritetoDbgFile(const string& s) { concurrent_adj_ofstream.wrtie(debug_file, s); } + inline void ThreadSafeWritetoDbgFile(const std::string& s) { concurrent_adj_ofstream.wrtie(debug_file, s); } #endif _ADJUST_STATUS_ AdjustNetwork(); @@ -385,11 +379,11 @@ class dna_adjust { UINT32 blockCount_; UINT32 currentBlock_; - milliseconds total_time_; + boost::posix_time::milliseconds total_time_; _ADJUST_STATUS_ adjustStatus_; vstring statusMessages_; UINT32 currentIteration_; - vector v_blockMeta_; + std::vector v_blockMeta_; inline bool FirstBlock(const UINT32& block) const { @@ -400,7 +394,7 @@ class dna_adjust { return v_blockMeta_.at(block)._blockLast; } - void SignalExceptionAdjustment(const string& msg, const UINT32 block_no); + void SignalExceptionAdjustment(const std::string& msg, const UINT32 block_no); void CreateMeasurementTally(const UINT32& block = 0); @@ -431,9 +425,9 @@ class dna_adjust { void RebuildNormals(const UINT32 block, adjustOperation direction, bool AddConstraintStationstoNormals, bool BackupNormals); void UpdateAdjustment(bool iterate); - void ValidateandFinaliseAdjustment(cpu_timer& tot_time); + void ValidateandFinaliseAdjustment(boost::timer::cpu_timer& tot_time); void PrintAdjustmentStatus(); - void PrintAdjustmentTime(cpu_timer& time, _TIMER_TYPE_); + void PrintAdjustmentTime(boost::timer::cpu_timer& time, _TIMER_TYPE_); void PrintIteration(const UINT32& iteration); void InitialiseAdjustment(); @@ -462,7 +456,7 @@ class dna_adjust { // Adjustment helps void ApplyAdditionalConstraints(); void AddDiscontinuitySites(vstring& constraintStns); - void LoadStationMap(pv_string_uint32_pair stnsMap, const string& stnmap_file); + void LoadStationMap(pv_string_uint32_pair stnsMap, const std::string& stnmap_file); void ResizeMatrixVectors(); void LoadPhasedBlocks(); void LoadSegmentationFile(); @@ -629,8 +623,8 @@ class dna_adjust { void LoadVarianceMatrix_X(it_vmsr_t _it_msr, matrix_2d* var_cart); void LoadVarianceMatrix_Y(it_vmsr_t _it_msr, matrix_2d* var_cart, const _COORD_TYPE_ coordType); - void PrintMsrVarianceMatrixException(const it_vmsr_t& _it_msr, const runtime_error& e, stringstream& ss, - const string& calling_function, const UINT32 msr_count = 0); + void PrintMsrVarianceMatrixException(const it_vmsr_t& _it_msr, const std::runtime_error& e, std::stringstream& ss, + const std::string& calling_function, const UINT32 msr_count = 0); // Estimated stations matrix void PrepareStationandVarianceMatrices(const UINT32& block); @@ -672,7 +666,7 @@ class dna_adjust { void UpdateNormals_Y(const UINT32& block, it_vmsr_t& _it_msr, UINT32& design_row, matrix_2d* normals, matrix_2d* AtVinv); - void OutputLargestCorrection(string& formatted_msg); + void OutputLargestCorrection(std::string& formatted_msg); // Design/Normals matrix void PrepareDesignAndMsrMnsCmpMatrices(const UINT32& block); @@ -750,14 +744,14 @@ class dna_adjust { void FormInverseVarianceMatrix(matrix_2d* vmat, bool LOWER_IS_CLEARED = false); void FormInverseGPSVarianceMatrix(const it_vmsr_t& _it_msr, matrix_2d* vmat); - bool FormInverseVarianceMatrixReduced(it_vmsr_t _it_msr, matrix_2d* var_cart, const string& method_name); + bool FormInverseVarianceMatrixReduced(it_vmsr_t _it_msr, matrix_2d* var_cart, const std::string& method_name); void PrintStatistics(bool printPelzer=true); // Output files void OpenOutputFileStreams(); void PrintOutputFileHeaderInfo(); - void PrintCompMeasurements(const UINT32& block, const string& msg = ""); + void PrintCompMeasurements(const UINT32& block, const std::string& msg = ""); void PrintCompMeasurementsAngular(const char cardinal, const double& computed, const double& correction, const it_vmsr_t& _it_msr); void PrintCompMeasurementsLinear(const char cardinal, const double& computed, const double& correction, const it_vmsr_t& _it_msr); void PrintCompMeasurements_A(const UINT32& block, it_vmsr_t& _it_msr, UINT32& design_row, printMeasurementsMode printMode); @@ -775,7 +769,7 @@ class dna_adjust { void PrintMeasurementDatabaseID(const it_vmsr_t& _it_msr, bool initialise_dbindex=true); void FormUniqueMsrList(); - void PrintAdjMeasurementsHeader(bool printHeader, const string& table_heading, + void PrintAdjMeasurementsHeader(bool printHeader, const std::string& table_heading, printMeasurementsMode printMode, UINT32 block, bool printBlocks = false); void PrintAdjMeasurements(v_uint32_u32u32_pair msr_block, bool printHeader); void PrintAdjMeasurementsAngular(const char cardinal, const it_vmsr_t& _it_msr, bool initialise_dbindex = true); @@ -795,19 +789,19 @@ class dna_adjust { void PrintAdjMeasurements_YLLH(it_vmsr_t& _it_msr); void ReduceYLLHMeasurementsforPrinting(vmsr_t& y_msr, matrix_2d& mpositions, printMeasurementsMode print_mode); - void PrintAdjStation(ostream& os, const UINT32& block, const UINT32& stn, const UINT32& mat_idx, const matrix_2d* stationEstimates, matrix_2d* stationVariances, bool recomputeGeographicCoords, bool updateGeographicCoords, bool reapplyTypeBUncertainties); - void PrintAdjStations(ostream& os, const UINT32& block, const matrix_2d* stationEstimates, matrix_2d* stationVariances, + void PrintAdjStation(std::ostream& os, const UINT32& block, const UINT32& stn, const UINT32& mat_idx, const matrix_2d* stationEstimates, matrix_2d* stationVariances, bool recomputeGeographicCoords, bool updateGeographicCoords, bool reapplyTypeBUncertainties); + void PrintAdjStations(std::ostream& os, const UINT32& block, const matrix_2d* stationEstimates, matrix_2d* stationVariances, bool printBlockID, bool recomputeGeographicCoords, bool updateGeographicCoords, bool printHeader, bool reapplyTypeBUncertainties); - void PrintAdjStationsUniqueList(ostream& os, const v_mat_2d* stationEstimates, v_mat_2d* stationVariances, bool recomputeGeographicCoords, bool updateGeographicCoords, bool reapplyTypeBUncertainties); + void PrintAdjStationsUniqueList(std::ostream& os, const v_mat_2d* stationEstimates, v_mat_2d* stationVariances, bool recomputeGeographicCoords, bool updateGeographicCoords, bool reapplyTypeBUncertainties); - void PrintCorStations(ostream &cor_file, const UINT32& block); - void PrintCorStationsUniqueList(ostream& cor_file); - void PrintCorStation(ostream& os, const UINT32& block, const UINT32& stn, const UINT32& mat_idx, const matrix_2d* stationEstimates); + void PrintCorStations(std::ostream &cor_file, const UINT32& block); + void PrintCorStationsUniqueList(std::ostream& cor_file); + void PrintCorStation(std::ostream& os, const UINT32& block, const UINT32& stn, const UINT32& mat_idx, const matrix_2d* stationEstimates); - void PrintPosUncertainty(ostream& os, /*ostream* csv,*/ const UINT32& block, const UINT32& stn, const UINT32& mat_idx, const matrix_2d* stationVariances, const UINT32& map_idx=0, const vUINT32* blockStations=NULL); - void PrintPosUncertainties(ostream& os, const UINT32& block, const matrix_2d* stationVariances); - void PrintPosUncertaintiesUniqueList(ostream& os, const v_mat_2d* stationVariances); - void PrintPosUncertaintiesHeader(ostream& os); + void PrintPosUncertainty(std::ostream& os, /*ostream* csv,*/ const UINT32& block, const UINT32& stn, const UINT32& mat_idx, const matrix_2d* stationVariances, const UINT32& map_idx=0, const vUINT32* blockStations=NULL); + void PrintPosUncertainties(std::ostream& os, const UINT32& block, const matrix_2d* stationVariances); + void PrintPosUncertaintiesUniqueList(std::ostream& os, const v_mat_2d* stationVariances); + void PrintPosUncertaintiesHeader(std::ostream& os); void UpdateGeographicCoordsPhased(const UINT32& block, matrix_2d* estimatedStations); void UpdateGeographicCoords(); @@ -822,7 +816,7 @@ class dna_adjust { return v_blockStationsMap_.at(block)[(*_it_msr)->station3] * 3; } - void debug_BlockInformation(const UINT32& currentBlock, const string& adjustment_method); + void debug_BlockInformation(const UINT32& currentBlock, const std::string& adjustment_method); void debug_SolutionInformation(const UINT32& currentBlock); CDnaDatum datum_; @@ -875,7 +869,7 @@ class dna_adjust { UINT32 potentialOutlierCount_; bool allStationsFixed_; - message_bank iterationCorrections_; + message_bank iterationCorrections_; // For each block vUINT32 v_ContiguousNetList_; // vector of contiguous network IDs (corresponding to each block) diff --git a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustprogress.cpp b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustprogress.cpp index 797b2622..58348f19 100644 --- a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustprogress.cpp +++ b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustprogress.cpp @@ -65,11 +65,11 @@ bool dna_adjust_thread::prepareAdjustment() catch (const NetMemoryException& e) { handlePrepareAdjustError(e.what()); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { handlePrepareAdjustError(e.what()); } catch (...) { - string err("Undefined error.\n This could be the result of insufficient memory or poorly configured data."); + std::string err("Undefined error.\n This could be the result of insufficient memory or poorly configured data."); handlePrepareAdjustError(err); } *_adjustStatus = ADJUST_EXCEPTION_RAISED; @@ -89,36 +89,36 @@ bool dna_adjust_thread::processAdjustment() catch (const NetMemoryException& e) { handleProcessAdjustError(e.what()); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { handleProcessAdjustError(e.what()); } catch (...) { - string err("- Error: Undefined error.\n This could be the result of insufficient memory or poorly configured data."); + std::string err("- Error: Undefined error.\n This could be the result of insufficient memory or poorly configured data."); handleProcessAdjustError(err); } *_adjustStatus = ADJUST_EXCEPTION_RAISED; return false; } -void dna_adjust_thread::handlePrepareAdjustError(const string& error_msg) +void dna_adjust_thread::handlePrepareAdjustError(const std::string& error_msg) { running = false; - stringstream ss; - ss << /*PROGRESS_BACKSPACE_12 << */setw(PROGRESS_ADJ_BLOCK_12) << " " << endl - << "- Error: " << endl << " " << error_msg << endl; + std::stringstream ss; + ss << /*PROGRESS_BACKSPACE_12 << */setw(PROGRESS_ADJ_BLOCK_12) << " " << std::endl + << "- Error: " << std::endl << " " << error_msg << std::endl; coutMessage(ss.str()); } -void dna_adjust_thread::handleProcessAdjustError(const string& error_msg) +void dna_adjust_thread::handleProcessAdjustError(const std::string& error_msg) { running = false; - boost::this_thread::sleep(milliseconds(50)); + boost::this_thread::sleep(boost::posix_time::milliseconds(50)); printErrorMsg(error_msg); } -void dna_adjust_thread::printErrorMsg(const string& error_msg) +void dna_adjust_thread::printErrorMsg(const std::string& error_msg) { - stringstream ss, sst; + std::stringstream ss, sst; switch (_p->a.adjust_mode) { @@ -127,8 +127,8 @@ void dna_adjust_thread::printErrorMsg(const string& error_msg) // setw(2) = 2 // ------------------- // 14 - sst << " Iteration " << right << setw(2) << fixed << setprecision(0) << _dnaAdj->CurrentIteration(); - ss << PROGRESS_BACKSPACE_14 << setw(PROGRESS_ADJ_BLOCK_14) << right << sst.str(); + sst << " Iteration " << std::right << std::setw(2) << std::fixed << std::setprecision(0) << _dnaAdj->CurrentIteration(); + ss << PROGRESS_BACKSPACE_14 << std::setw(PROGRESS_ADJ_BLOCK_14) << std::right << sst.str(); break; case Phased_Block_1Mode: case PhasedMode: @@ -140,26 +140,26 @@ void dna_adjust_thread::printErrorMsg(const string& error_msg) // ------------------- // 37 sst << " Iteration " << - right << setw(2) << fixed << setprecision(0) << _dnaAdj->CurrentIteration() << ", block" << right << setw(6) << fixed << setprecision(0) << + std::right << std::setw(2) << std::fixed << std::setprecision(0) << _dnaAdj->CurrentIteration() << ", block" << std::right << std::setw(6) << std::fixed << std::setprecision(0) << _dnaAdj->CurrentBlock() + 1 << (_dnaAdj->processingForward() ? " (forward)" : " (reverse)"); - ss << PROGRESS_BACKSPACE_37 << setw(37) << right << sst.str(); + ss << PROGRESS_BACKSPACE_37 << std::setw(37) << std::right << sst.str(); } - ss << endl << "- Error: Cannot compute the least squares estimates. Reason:\n " << error_msg << endl; + ss << std::endl << "- Error: Cannot compute the least squares estimates. Reason:\n " << error_msg << std::endl; coutMessage(ss); } -void dna_adjust_thread::coutMessage(stringstream& message) +void dna_adjust_thread::coutMessage(std::stringstream& message) { coutMessage(message.str()); } -void dna_adjust_thread::coutMessage(const string& message) +void dna_adjust_thread::coutMessage(const std::string& message) { cout_mutex.lock(); - cout.flush(); - cout << message; - cout.flush(); + std::cout.flush(); + std::cout << message; + std::cout.flush(); cout_mutex.unlock(); } @@ -183,7 +183,7 @@ void dna_adjust_progress_thread::prepareAdjustment() // Nothing to be displayed return; - stringstream ss; + std::stringstream ss; ss << "+ Preparing for "; switch (_p->a.adjust_mode) @@ -199,7 +199,7 @@ void dna_adjust_progress_thread::prepareAdjustment() ss.str(""); UINT32 block, currentBlock(0); - stringstream sst; + std::stringstream sst; bool first_time(true); switch (_p->a.adjust_mode) @@ -207,13 +207,13 @@ void dna_adjust_progress_thread::prepareAdjustment() case SimultaneousMode: while (running && _dnaAdj->IsPreparing()) { - boost::this_thread::sleep(milliseconds(40)); + boost::this_thread::sleep(boost::posix_time::milliseconds(40)); } if (_dnaAdj->ExceptionRaised()) return; - ss << " done." << endl; + ss << " done." << std::endl; coutMessage(ss.str()); break; @@ -226,19 +226,19 @@ void dna_adjust_progress_thread::prepareAdjustment() if (block != currentBlock) { ss.str(""); - ss << " block " << left << setw(5) << fixed << setprecision(0) << _dnaAdj->CurrentBlock() + 1; + ss << " block " << std::left << std::setw(5) << std::fixed << std::setprecision(0) << _dnaAdj->CurrentBlock() + 1; sst.str(""); if (first_time) { - sst << setw(PROGRESS_ADJ_BLOCK_12) << left << " "; + sst << std::setw(PROGRESS_ADJ_BLOCK_12) << std::left << " "; first_time = false; } - sst << PROGRESS_BACKSPACE_12 << setw(PROGRESS_ADJ_BLOCK_12) << left << ss.str(); + sst << PROGRESS_BACKSPACE_12 << std::setw(PROGRESS_ADJ_BLOCK_12) << std::left << ss.str(); coutMessage(sst.str()); currentBlock = block; } - boost::this_thread::sleep(milliseconds(40)); + boost::this_thread::sleep(boost::posix_time::milliseconds(40)); } if (_dnaAdj->ExceptionRaised()) @@ -249,7 +249,7 @@ void dna_adjust_progress_thread::prepareAdjustment() sst.str(""); if (!first_time) sst << PROGRESS_BACKSPACE_12; - sst << setw(PROGRESS_ADJ_BLOCK_12) << left << ss.str() << endl; + sst << std::setw(PROGRESS_ADJ_BLOCK_12) << std::left << ss.str() << std::endl; coutMessage(sst.str()); } @@ -262,11 +262,11 @@ void dna_adjust_progress_thread::processAdjustment() return; if (_p->a.max_iterations > 0) - coutMessage(string("+ Adjusting network...\n")); + coutMessage(std::string("+ Adjusting network...\n")); UINT32 block, currentBlock(0); UINT32 currentIteration(0); - stringstream ss, sst; + std::stringstream ss, sst; bool first_time(true); switch (_p->a.adjust_mode) @@ -281,13 +281,13 @@ void dna_adjust_progress_thread::processAdjustment() if (!_dnaAdj->GetMessageIteration(currentIteration)) break; ss.str(""); - ss << " Iteration " << right << setw(2) << fixed << setprecision(0) << currentIteration; - ss << ", max station corr: " << right << setw(PROGRESS_ADJ_BLOCK_12) << - _dnaAdj->GetMaxCorrection(currentIteration) << endl; + ss << " Iteration " << std::right << std::setw(2) << std::fixed << std::setprecision(0) << currentIteration; + ss << ", max station corr: " << std::right << std::setw(PROGRESS_ADJ_BLOCK_12) << + _dnaAdj->GetMaxCorrection(currentIteration) << std::endl; coutMessage(ss.str()); } - boost::this_thread::sleep(milliseconds(80)); + boost::this_thread::sleep(boost::posix_time::milliseconds(80)); } break; @@ -305,40 +305,40 @@ void dna_adjust_progress_thread::processAdjustment() break; ss.str(""); - ss << " Iteration " << right << setw(2) << fixed << setprecision(0) << currentIteration; - ss << ", max station corr: " << right << setw(PROGRESS_ADJ_BLOCK_12) << _dnaAdj->GetMaxCorrection(currentIteration) << endl; + ss << " Iteration " << std::right << std::setw(2) << std::fixed << std::setprecision(0) << currentIteration; + ss << ", max station corr: " << std::right << std::setw(PROGRESS_ADJ_BLOCK_12) << _dnaAdj->GetMaxCorrection(currentIteration) << std::endl; sst.str(""); if (first_time) - sst << setw(PROGRESS_ADJ_BLOCK_28) << left << " "; - sst << PROGRESS_BACKSPACE_28 << setw(PROGRESS_ADJ_BLOCK_28) << left << ss.str(); + sst << std::setw(PROGRESS_ADJ_BLOCK_28) << std::left << " "; + sst << PROGRESS_BACKSPACE_28 << std::setw(PROGRESS_ADJ_BLOCK_28) << std::left << ss.str(); coutMessage(sst.str()); first_time = true; } - boost::this_thread::sleep(milliseconds(40)); + boost::this_thread::sleep(boost::posix_time::milliseconds(40)); // print new block to screen when adjusting only if (block != currentBlock && _dnaAdj->IsAdjusting()) { ss.str(""); - ss << " Iteration " << right << setw(2) << fixed << setprecision(0) << _dnaAdj->CurrentIteration(); + ss << " Iteration " << std::right << std::setw(2) << std::fixed << std::setprecision(0) << _dnaAdj->CurrentIteration(); #ifdef MULTI_THREAD_ADJUST if (_p->a.multi_thread && !_dnaAdj->processingCombine()) - ss << left << setw(13) << ", adjusting..."; + ss << std::left << std::setw(13) << ", adjusting..."; else #endif - ss << ", block " << left << setw(6) << fixed << setprecision(0) << _dnaAdj->CurrentBlock() + 1; + ss << ", block " << std::left << std::setw(6) << std::fixed << std::setprecision(0) << _dnaAdj->CurrentBlock() + 1; sst.str(""); if (first_time) { - sst << setw(PROGRESS_ADJ_BLOCK_28) << left << " "; + sst << std::setw(PROGRESS_ADJ_BLOCK_28) << std::left << " "; first_time = false; } - sst << PROGRESS_BACKSPACE_28 << setw(PROGRESS_ADJ_BLOCK_28) << left << ss.str(); + sst << PROGRESS_BACKSPACE_28 << std::setw(PROGRESS_ADJ_BLOCK_28) << std::left << ss.str(); coutMessage(sst.str()); currentBlock = block; @@ -366,12 +366,12 @@ void dna_adjust_progress_thread::operator()() processAdjustment(); } -void dna_adjust_progress_thread::coutMessage(const string& message) +void dna_adjust_progress_thread::coutMessage(const std::string& message) { cout_mutex.lock(); - cout.flush(); - cout << message; - cout.flush(); + std::cout.flush(); + std::cout << message; + std::cout.flush(); cout_mutex.unlock(); } diff --git a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustprogress.hpp b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustprogress.hpp index 20c692c1..f97c0282 100644 --- a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustprogress.hpp +++ b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustprogress.hpp @@ -45,10 +45,6 @@ #include -using namespace std; -using namespace boost; -using namespace boost::posix_time; - using namespace dynadjust::networkadjust; using namespace dynadjust::exception; @@ -63,11 +59,11 @@ class dna_adjust_thread bool prepareAdjustment(); bool processAdjustment(); - void handlePrepareAdjustError(const string& error_msg); - void handleProcessAdjustError(const string& error_msg); - void printErrorMsg(const string& error_msg); - void coutMessage(stringstream& message); - void coutMessage(const string& message); + void handlePrepareAdjustError(const std::string& error_msg); + void handleProcessAdjustError(const std::string& error_msg); + void printErrorMsg(const std::string& error_msg); + void coutMessage(std::stringstream& message); + void coutMessage(const std::string& message); dna_adjust* _dnaAdj; project_settings* _p; @@ -84,7 +80,7 @@ class dna_adjust_progress_thread void prepareAdjustment(); void processAdjustment(); - void coutMessage(const string& message); + void coutMessage(const std::string& message); dna_adjust* _dnaAdj; project_settings* _p; diff --git a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp index aa07da31..4f4b94e1 100644 --- a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp +++ b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp @@ -29,13 +29,13 @@ extern boost::mutex cout_mutex; using namespace dynadjust; using namespace dynadjust::epsg; -void PrintSummaryMessage(dna_adjust* netAdjust, const project_settings* p, milliseconds *elapsed_time) +void PrintSummaryMessage(dna_adjust* netAdjust, const project_settings* p, boost::posix_time::milliseconds *elapsed_time) { if (p->g.quiet) return; cout_mutex.lock(); - cout.flush(); + std::cout.flush(); UINT32 currentIteration(0); // any messages left @@ -43,23 +43,23 @@ void PrintSummaryMessage(dna_adjust* netAdjust, const project_settings* p, milli { if (!netAdjust->GetMessageIteration(currentIteration)) break; - stringstream ss(""); - ss << " Iteration " << right << setw(2) << fixed << setprecision(0) << currentIteration; - ss << ", max station corr: " << right << setw(12) << netAdjust->GetMaxCorrection(currentIteration) << endl; - cout << PROGRESS_BACKSPACE_28 << setw(28) << left << ss.str(); + std::stringstream ss(""); + ss << " Iteration " << std::right << std::setw(2) << std::fixed << std::setprecision(0) << currentIteration; + ss << ", max station corr: " << std::right << std::setw(12) << netAdjust->GetMaxCorrection(currentIteration) << std::endl; + std::cout << PROGRESS_BACKSPACE_28 << std::setw(28) << std::left << ss.str(); } if (p->a.report_mode) { - cout << "+ Printing results of last adjustment only" << endl; + std::cout << "+ Printing results of last adjustment only" << std::endl; cout_mutex.unlock(); return; } - cout << left << "+ Done." << endl; + std::cout << std::left << "+ Done." << std::endl; UINT32 block_count(netAdjust->blockCount()); - string block_str(" block"); + std::string block_str(" block"); if (block_count > 1) block_str.append("s"); block_str.append("."); @@ -69,27 +69,27 @@ void PrintSummaryMessage(dna_adjust* netAdjust, const project_settings* p, milli case Phased_Block_1Mode: case PhasedMode: if (netAdjust->GetStatus() == ADJUST_SUCCESS) - cout << "+ Successfully adjusted " << block_count << block_str; + std::cout << "+ Successfully adjusted " << block_count << block_str; else - cout << "+ Attempted to adjust " << netAdjust->blockCount() << block_str; - cout << endl; + std::cout << "+ Attempted to adjust " << netAdjust->blockCount() << block_str; + std::cout << std::endl; } - cout << "+ Solution: "; + std::cout << "+ Solution: "; if (netAdjust->GetStatus() != ADJUST_SUCCESS) { - cout << "failed to converge after "; + std::cout << "failed to converge after "; if (p->a.adjust_mode == Phased_Block_1Mode || p->a.max_iterations == 1) - cout << "one iteration." << endl; + std::cout << "one iteration." << std::endl; else - cout << p->a.max_iterations << " iterations." << endl; + std::cout << p->a.max_iterations << " iterations." << std::endl; if (netAdjust->GetStatus() > ADJUST_THRESHOLD_EXCEEDED) { - cout << endl << "+ Open " << leafStr(p->o._adj_file) << " to view the adjustment details." << endl << endl; + std::cout << std::endl << "+ Open " << leafStr(p->o._adj_file) << " to view the adjustment details." << std::endl << std::endl; cout_mutex.unlock(); return; } @@ -99,21 +99,21 @@ void PrintSummaryMessage(dna_adjust* netAdjust, const project_settings* p, milli switch (p->a.adjust_mode) { case Phased_Block_1Mode: - cout << "estimates solved for Block 1 only." << endl << - endl << - "- Warning: Depending on the quality of the apriori station estimates, further" << endl << - " iterations may be needed. --block1-phased mode should only be used once" << endl << - " rigorous estimates have been produced for the entire network." << endl << endl; + std::cout << "estimates solved for Block 1 only." << std::endl << + std::endl << + "- Warning: Depending on the quality of the apriori station estimates, further" << std::endl << + " iterations may be needed. --block1-phased mode should only be used once" << std::endl << + " rigorous estimates have been produced for the entire network." << std::endl << std::endl; break; default: - cout << "converged after " << netAdjust->CurrentIteration() << " iteration"; + std::cout << "converged after " << netAdjust->CurrentIteration() << " iteration"; if (netAdjust->CurrentIteration() > 1) - cout << "s"; - cout << "." << endl; + std::cout << "s"; + std::cout << "." << std::endl; } } - cout << formatedElapsedTime(elapsed_time, "+ Network adjustment took ") << endl; + std::cout << formatedElapsedTime(elapsed_time, "+ Network adjustment took ") << std::endl; cout_mutex.unlock(); } @@ -127,16 +127,16 @@ void SerialiseVarianceMatrices(dna_adjust* netAdjust, const project_settings* p) if (!p->g.quiet) { - cout << "+ Serialising adjustment matrices... "; - cout.flush(); + std::cout << "+ Serialising adjustment matrices... "; + std::cout.flush(); } netAdjust->SerialiseAdjustedVarianceMatrices(); if (!p->g.quiet) { - cout << "done." << endl; - cout.flush(); + std::cout << "done." << std::endl; + std::cout.flush(); } @@ -162,45 +162,45 @@ void GenerateStatistics(dna_adjust* netAdjust, const project_settings* p) { if (!p->g.quiet) { - cout << "+ Generating statistics..."; - cout.flush(); + std::cout << "+ Generating statistics..."; + std::cout.flush(); } netAdjust->GenerateStatistics(); if (!p->g.quiet) { - cout << " done." << endl; + std::cout << " done." << std::endl; - cout << "+ Adjustment results:" << endl << endl; - cout << "+" << OUTPUTLINE << endl; - cout << setw(PRINT_VAR_PAD) << left << " Number of unknown parameters" << fixed << setprecision(0) << netAdjust->GetUnknownsCount(); + std::cout << "+ Adjustment results:" << std::endl << std::endl; + std::cout << "+" << OUTPUTLINE << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Number of unknown parameters" << std::fixed << std::setprecision(0) << netAdjust->GetUnknownsCount(); if (netAdjust->GetAllFixed()) - cout << " (All stations held constrained)"; - cout << endl; + std::cout << " (All stations held constrained)"; + std::cout << std::endl; - cout << setw(PRINT_VAR_PAD) << left << " Number of measurements" << fixed << setprecision(0) << netAdjust->GetMeasurementCount(); + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Number of measurements" << std::fixed << std::setprecision(0) << netAdjust->GetMeasurementCount(); if (netAdjust->GetPotentialOutlierCount() > 0) { - cout << " (" << netAdjust->GetPotentialOutlierCount() << " potential outlier"; + std::cout << " (" << netAdjust->GetPotentialOutlierCount() << " potential outlier"; if (netAdjust->GetPotentialOutlierCount() > 1) - cout << "s"; - cout << ")"; + std::cout << "s"; + std::cout << ")"; } - cout << endl; - cout << setw(PRINT_VAR_PAD) << left << " Degrees of freedom" << fixed << setprecision(0) << netAdjust->GetDegreesOfFreedom() << endl; - cout << setw(PRINT_VAR_PAD) << left << " Chi squared" << fixed << setprecision(2) << netAdjust->GetChiSquared() << endl; - cout << setw(PRINT_VAR_PAD) << left << " Rigorous sigma zero" << fixed << setprecision(3) << netAdjust->GetSigmaZero() << endl; - cout << setw(PRINT_VAR_PAD) << left << " Global (Pelzer) Reliability" << fixed << setw(8) << setprecision(3) << netAdjust->GetGlobalPelzerRel() << "(excludes non redundant measurements)" << endl << endl; + std::cout << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Degrees of freedom" << std::fixed << std::setprecision(0) << netAdjust->GetDegreesOfFreedom() << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Chi squared" << std::fixed << std::setprecision(2) << netAdjust->GetChiSquared() << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Rigorous sigma zero" << std::fixed << std::setprecision(3) << netAdjust->GetSigmaZero() << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Global (Pelzer) Reliability" << std::fixed << std::setw(8) << std::setprecision(3) << netAdjust->GetGlobalPelzerRel() << "(excludes non redundant measurements)" << std::endl << std::endl; - stringstream ss(""); - ss << left << " Chi-Square test (" << setprecision (1) << fixed << p->a.confidence_interval << "%)"; - cout << setw(PRINT_VAR_PAD) << left << ss.str(); + std::stringstream ss(""); + ss << std::left << " Chi-Square test (" << std::setprecision(1) << std::fixed << p->a.confidence_interval << "%)"; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << ss.str(); ss.str(""); - ss << fixed << setprecision(3) << + ss << std::fixed << std::setprecision(3) << netAdjust->GetChiSquaredLowerLimit() << " < " << netAdjust->GetSigmaZero() << " < " << netAdjust->GetChiSquaredUpperLimit(); - cout << setw(CHISQRLIMITS) << left << ss.str(); + std::cout << std::setw(CHISQRLIMITS) << std::left << ss.str(); ss.str(""); if (netAdjust->GetDegreesOfFreedom() < 1) @@ -223,12 +223,12 @@ void GenerateStatistics(dna_adjust* netAdjust, const project_settings* p) ss << " ***"; } - cout << setw(PASS_FAIL) << right << ss.str() << endl; - cout << "+" << OUTPUTLINE << endl << endl; + std::cout << std::setw(PASS_FAIL) << std::right << ss.str() << std::endl; + std::cout << "+" << OUTPUTLINE << std::endl << std::endl; } } else - cout << endl; + std::cout << std::endl; } void PrintAdjustedMeasurements(dna_adjust* netAdjust, const project_settings* p) @@ -237,13 +237,13 @@ void PrintAdjustedMeasurements(dna_adjust* netAdjust, const project_settings* p) { if (!p->g.quiet) { - cout << "+ Printing adjusted measurements..."; - cout.flush(); + std::cout << "+ Printing adjusted measurements..."; + std::cout.flush(); } netAdjust->PrintAdjustedNetworkMeasurements(); if (!p->g.quiet) - cout << " done." << endl; + std::cout << " done." << std::endl; } } @@ -254,12 +254,12 @@ void PrintMeasurementstoStations(dna_adjust* netAdjust, const project_settings* { if (!p->g.quiet) { - cout << "+ Printing summary of measurements connected to each station..."; - cout.flush(); + std::cout << "+ Printing summary of measurements connected to each station..."; + std::cout.flush(); } netAdjust->PrintMeasurementsToStation(); if (!p->g.quiet) - cout << " done." << endl; + std::cout << " done." << std::endl; } } @@ -268,12 +268,12 @@ void PrintAdjustedNetworkStations(dna_adjust* netAdjust, const project_settings* // Print adjusted stations to ADJ file if (!p->g.quiet) { - cout << "+ Printing adjusted station coordinates..."; - cout.flush(); + std::cout << "+ Printing adjusted station coordinates..."; + std::cout.flush(); } netAdjust->PrintAdjustedNetworkStations(); if (!p->g.quiet) - cout << " done." << endl; + std::cout << " done." << std::endl; } void PrintPositionalUncertainty(dna_adjust* netAdjust, const project_settings* p) @@ -283,13 +283,13 @@ void PrintPositionalUncertainty(dna_adjust* netAdjust, const project_settings* p { if (!p->g.quiet) { - cout << "+ Printing positional uncertainty of adjusted coordinates..."; - cout.flush(); + std::cout << "+ Printing positional uncertainty of adjusted coordinates..."; + std::cout.flush(); } // Print correlations as required netAdjust->PrintPositionalUncertainty(); if (!p->g.quiet) - cout << " done." << endl; + std::cout << " done." << std::endl; } } @@ -300,12 +300,12 @@ void PrintStationCorrections(dna_adjust* netAdjust, const project_settings* p) { if (!p->g.quiet) { - cout << "+ Printing corrections to initial station coordinates..."; - cout.flush(); + std::cout << "+ Printing corrections to initial station coordinates..."; + std::cout.flush(); } netAdjust->PrintNetworkStationCorrections(); if (!p->g.quiet) - cout << " done." << endl; + std::cout << " done." << std::endl; } } @@ -314,12 +314,12 @@ void UpdateBinaryFiles(dna_adjust* netAdjust, const project_settings* p) // Update bst and bms files with adjustment results if (!p->g.quiet) { - cout << "+ Updating binary station and measurement files..."; - cout.flush(); + std::cout << "+ Updating binary station and measurement files..."; + std::cout.flush(); } netAdjust->UpdateBinaryFiles(); if (!p->g.quiet) - cout << " done." << endl; + std::cout << " done." << std::endl; } void ExportDynaML(dna_adjust* netAdjust, project_settings* p) @@ -331,14 +331,14 @@ void ExportDynaML(dna_adjust* netAdjust, project_settings* p) p->o._xml_file = p->o._adj_file + ".stn.xml"; if (!p->g.quiet) - cout << "+ Serializing estimated coordinates to " << leafStr(p->o._xml_file) << "... "; + std::cout << "+ Serializing estimated coordinates to " << leafStr(p->o._xml_file) << "... "; // Export Stations file netAdjust->PrintEstimatedStationCoordinatestoDNAXML(p->o._xml_file, dynaml, (p->i.flag_unused_stn ? true : false)); if (!p->g.quiet) - cout << "Done." << endl; + std::cout << "Done." << std::endl; } // Output adjustment as XML msr @@ -348,14 +348,14 @@ void ExportDynaML(dna_adjust* netAdjust, project_settings* p) p->o._xml_file = p->o._adj_file + ".msr.xml"; if (!p->g.quiet) - cout << "+ Serializing estimated coordinates and uncertainties to " << leafStr(p->o._xml_file) << "... "; + std::cout << "+ Serializing estimated coordinates and uncertainties to " << leafStr(p->o._xml_file) << "... "; // Export Measurements file (exclude unused stations given // they will not have been estimated) netAdjust->PrintEstimatedStationCoordinatestoDNAXML_Y(p->o._xml_file, dynaml); if (!p->g.quiet) - cout << "Done." << endl; + std::cout << "Done." << std::endl; } } @@ -364,33 +364,33 @@ void ExportDNA(dna_adjust* netAdjust, project_settings* p) // Print adjusted stations and measurements to DNA stn if (p->o._export_dna_stn_file) { - string stnfilename(p->o._adj_file + ".stn"); + std::string stnfilename(p->o._adj_file + ".stn"); if (!p->g.quiet) - cout << "+ Serializing estimated coordinates to " << leafStr(stnfilename) << "... "; + std::cout << "+ Serializing estimated coordinates to " << leafStr(stnfilename) << "... "; // Export Station file netAdjust->PrintEstimatedStationCoordinatestoDNAXML(stnfilename, dna, (p->i.flag_unused_stn ? true : false)); if (!p->g.quiet) - cout << "Done." << endl; + std::cout << "Done." << std::endl; } // Print adjusted stations and measurements to DNA msr if (p->o._export_dna_msr_file) { - string msrfilename(p->o._adj_file + ".msr"); + std::string msrfilename(p->o._adj_file + ".msr"); if (!p->g.quiet) - cout << "+ Serializing estimated coordinates and uncertainties to " << leafStr(msrfilename) << "... "; + std::cout << "+ Serializing estimated coordinates and uncertainties to " << leafStr(msrfilename) << "... "; // Export Measurements file (exclude unused stations given // they will not have been estimated) netAdjust->PrintEstimatedStationCoordinatestoDNAXML_Y(msrfilename, dna); if (!p->g.quiet) - cout << "Done." << endl; + std::cout << "Done." << std::endl; } } @@ -399,31 +399,31 @@ void ExportSinex(dna_adjust* netAdjust, const project_settings* p) // Print adjusted stations and measurements to SINEX if (p->o._export_snx_file) { - string sinex_file; + std::string sinex_file; // Export to SINEX if (!p->g.quiet) - cout << "+ Printing station estimates and uncertainties to SINEX..."; + std::cout << "+ Printing station estimates and uncertainties to SINEX..."; bool success(netAdjust->PrintEstimatedStationCoordinatestoSNX(sinex_file)); // SomeFunc() if (!p->g.quiet) - cout << " done." << endl; + std::cout << " done." << std::endl; if (!success) { - cout << "- Warning: The SINEX export process produced some warnings." << endl; + std::cout << "- Warning: The SINEX export process produced some warnings." << std::endl; switch (p->a.adjust_mode) { case PhasedMode: - sinex_file = findandreplace(sinex_file, string("-block1"), string("-block*")); + sinex_file = findandreplace(sinex_file, std::string("-block1"), std::string("-block*")); } - cout << " See " << leafStr(sinex_file) << ".err for details." << endl; + std::cout << " See " << leafStr(sinex_file) << ".err for details." << std::endl; } } } -int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& vm, project_settings& p) +int ParseCommandLineOptions(const int& argc, char* argv[], const boost::program_options::variables_map& vm, project_settings& p) { // capture command line arguments for (int cmd_arg(0); cmd_arg(p.g.output_folder, p.g.network_name, "dnaproj"); + p.g.project_file = formPath(p.g.output_folder, p.g.network_name, "dnaproj"); - if (exists(p.g.project_file)) + if (boost::filesystem::exists(p.g.project_file)) { // update import settings from dnaproj file try { @@ -494,24 +494,24 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& // binary station file location (output) if (vm.count(BIN_STN_FILE)) - p.a.bst_file = formPath(p.g.input_folder, p.a.bst_file); + p.a.bst_file = formPath(p.g.input_folder, p.a.bst_file); else - p.a.bst_file = formPath(p.g.output_folder, p.g.network_name, "bst"); + p.a.bst_file = formPath(p.g.output_folder, p.g.network_name, "bst"); // binary station file location (output) if (vm.count(BIN_MSR_FILE)) - p.a.bms_file = formPath(p.g.input_folder, p.a.bms_file); + p.a.bms_file = formPath(p.g.input_folder, p.a.bms_file); else - p.a.bms_file = formPath(p.g.output_folder, p.g.network_name, "bms"); + p.a.bms_file = formPath(p.g.output_folder, p.g.network_name, "bms"); - if (!exists(p.a.bst_file) || !exists(p.a.bms_file)) + if (!boost::filesystem::exists(p.a.bst_file) || !boost::filesystem::exists(p.a.bms_file)) { cout_mutex.lock(); - cout << endl << "- Nothing to do: "; + std::cout << std::endl << "- Nothing to do: "; if (p.g.network_name.empty()) - cout << endl << "network name has not been specified specified, and " << endl << " "; - cout << p.a.bst_file << " and " << p.a.bms_file << " do not exist." << endl << endl; + std::cout << std::endl << "network name has not been specified specified, and " << std::endl << " "; + std::cout << p.a.bst_file << " and " << p.a.bms_file << " do not exist." << std::endl << std::endl; cout_mutex.unlock(); return EXIT_FAILURE; } @@ -592,22 +592,22 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (vm.count(TYPE_B_FILE)) p.o._apply_type_b_file = 1; - p.s.asl_file = formPath(p.g.output_folder, p.g.network_name, "asl"); // associated stations list - p.s.aml_file = formPath(p.g.output_folder, p.g.network_name, "aml"); // associated measurements list - p.a.map_file = formPath(p.g.output_folder, p.g.network_name, "map"); // station names map + p.s.asl_file = formPath(p.g.output_folder, p.g.network_name, "asl"); // associated stations list + p.s.aml_file = formPath(p.g.output_folder, p.g.network_name, "aml"); // associated measurements list + p.a.map_file = formPath(p.g.output_folder, p.g.network_name, "map"); // station names map // has a seg file name been specified? if (vm.count(SEG_FILE)) - p.a.seg_file = formPath(p.g.input_folder, p.a.seg_file); + p.a.seg_file = formPath(p.g.input_folder, p.a.seg_file); else - p.a.seg_file = formPath(p.g.output_folder, p.g.network_name, "seg"); + p.a.seg_file = formPath(p.g.output_folder, p.g.network_name, "seg"); if (vm.count(OUTPUT_APU_CORRELATIONS)) p.o._output_pu_covariances = 1; // Set up file names dependent on adjustment mode p.o._xyz_file = p.o._adj_file = - formPath(p.g.output_folder, p.g.network_name); + formPath(p.g.output_folder, p.g.network_name); if (vm.count(OUTPUT_POS_UNCERTAINTY)) { @@ -728,53 +728,53 @@ void LoadBinaryMeta(binary_file_meta_t& bst_meta, binary_file_meta_t& bms_meta, bst.load_bst_file_meta(p.a.bst_file, bst_meta); bms.load_bms_file_meta(p.a.bms_file, bms_meta); - bst_meta_import = (iequals(bst_meta.modifiedBy, __import_app_name__) || - iequals(bst_meta.modifiedBy, __import_dll_name__)); - bms_meta_import = (iequals(bms_meta.modifiedBy, __import_app_name__) || - iequals(bms_meta.modifiedBy, __import_dll_name__)); + bst_meta_import = (boost::iequals(bst_meta.modifiedBy, __import_app_name__) || + boost::iequals(bst_meta.modifiedBy, __import_dll_name__)); + bms_meta_import = (boost::iequals(bms_meta.modifiedBy, __import_app_name__) || + boost::iequals(bms_meta.modifiedBy, __import_dll_name__)); } int main(int argc, char* argv[]) { // create banner message - string cmd_line_banner, stnfilename, msrfilename; + std::string cmd_line_banner, stnfilename, msrfilename; fileproc_help_header(&cmd_line_banner); project_settings p; - variables_map vm; - positional_options_description positional_options; + boost::program_options::variables_map vm; + boost::program_options::positional_options_description positional_options; - options_description standard_options("+ " + string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description adj_mode_options("+ " + string(ADJUST_MODULE_MODE), PROGRAM_OPTIONS_LINE_LENGTH); - options_description phased_adj_options("+ " + string(ADJUST_MODULE_PHASED), PROGRAM_OPTIONS_LINE_LENGTH); - options_description adj_config_options("+ " + string(ADJUST_MODULE_CONFIG), PROGRAM_OPTIONS_LINE_LENGTH); - options_description staged_adj_options("+ " + string(ADJUST_MODULE_STAGE), PROGRAM_OPTIONS_LINE_LENGTH); - options_description output_options("+ " + string(ALL_MODULE_OUTPUT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description export_options("+ " + string(ALL_MODULE_EXPORT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description generic_options("+ " + string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description standard_options("+ " + std::string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description adj_mode_options("+ " + std::string(ADJUST_MODULE_MODE), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description phased_adj_options("+ " + std::string(ADJUST_MODULE_PHASED), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description adj_config_options("+ " + std::string(ADJUST_MODULE_CONFIG), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description staged_adj_options("+ " + std::string(ADJUST_MODULE_STAGE), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description output_options("+ " + std::string(ALL_MODULE_OUTPUT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description export_options("+ " + std::string(ALL_MODULE_EXPORT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description generic_options("+ " + std::string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); - string cmd_line_usage("+ "); + std::string cmd_line_usage("+ "); cmd_line_usage.append(__BINARY_NAME__).append(" usage: ").append(__BINARY_NAME__).append(" ").append(NETWORK_NAME).append(" [options]"); - options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); try { standard_options.add_options() - (PROJECT_FILE_P, value(&p.g.project_file), + (PROJECT_FILE_P, boost::program_options::value(&p.g.project_file), "Project file containing all user options. If specified, all other options are ignored.") - (NETWORK_NAME_N, value(&p.g.network_name), + (NETWORK_NAME_N, boost::program_options::value(&p.g.network_name), "Network name. User defined name for all input and output files. Default is \"network#\".") - (INPUT_FOLDER_I, value(&p.g.input_folder), + (INPUT_FOLDER_I, boost::program_options::value(&p.g.input_folder), "Path containing all input files") - (OUTPUT_FOLDER_O, value(&p.g.output_folder), // default is ./, + (OUTPUT_FOLDER_O, boost::program_options::value(&p.g.output_folder), // default is ./, "Path for all output files") - (BIN_STN_FILE, value(&p.a.bst_file), + (BIN_STN_FILE, boost::program_options::value(&p.a.bst_file), "Binary station file name. Overrides network name.") - (BIN_MSR_FILE, value(&p.a.bms_file), + (BIN_MSR_FILE, boost::program_options::value(&p.a.bms_file), "Binary measurement file name. Overrides network name.") - (SEG_FILE, value(&p.a.seg_file), + (SEG_FILE, boost::program_options::value(&p.a.seg_file), "Network segmentation file name. Overrides network name.") - (COMMENTS, value(&p.a.comments), + (COMMENTS, boost::program_options::value(&p.a.comments), "Comments about the adjustment. All comments are printed to the adj file.") ; @@ -801,28 +801,28 @@ int main(int argc, char* argv[]) ; adj_config_options.add_options() - (CONF_INTERVAL, value(&p.a.confidence_interval), - (string("Confidence interval for testing the least squares solution and measurement corrections. Default is ")+ - StringFromT(p.a.confidence_interval, 1)+string("%.")).c_str()) - (ITERATION_THRESHOLD, value(&p.a.iteration_threshold), - (string("Least squares iteration threshold. Default is ")+ - StringFromT(p.a.iteration_threshold, 4)+string("m.")).c_str()) - (MAX_ITERATIONS, value(&p.a.max_iterations), - (string("Maximum number of iterations. Default is ")+ - StringFromT(p.a.max_iterations)+string(".")).c_str()) - (STN_CONSTRAINTS, value(&p.a.station_constraints), + (CONF_INTERVAL, boost::program_options::value(&p.a.confidence_interval), + (std::string("Confidence interval for testing the least squares solution and measurement corrections. Default is ")+ + StringFromT(p.a.confidence_interval, 1)+std::string("%.")).c_str()) + (ITERATION_THRESHOLD, boost::program_options::value(&p.a.iteration_threshold), + (std::string("Least squares iteration threshold. Default is ")+ + StringFromT(p.a.iteration_threshold, 4)+std::string("m.")).c_str()) + (MAX_ITERATIONS, boost::program_options::value(&p.a.max_iterations), + (std::string("Maximum number of iterations. Default is ")+ + StringFromT(p.a.max_iterations)+std::string(".")).c_str()) + (STN_CONSTRAINTS, boost::program_options::value(&p.a.station_constraints), "Station constraints. arg is a comma delimited string \"stn1,CCC,stn2,CCF\" defining specific station constraints. These constraints override those contained in the station file.") - (FREE_STN_SD, value(&p.a.free_std_dev), - (string("A-priori standard deviation for free stations. Default is ")+ - StringFromT(p.a.free_std_dev)+string("m.")).c_str()) - (FIXED_STN_SD, value(&p.a.fixed_std_dev), - (string("A-priori standard deviation for fixed stations. Default is ")+ - StringFromT(p.a.fixed_std_dev, 6)+string("m.")).c_str()) + (FREE_STN_SD, boost::program_options::value(&p.a.free_std_dev), + (std::string("A-priori standard deviation for free stations. Default is ")+ + StringFromT(p.a.free_std_dev)+std::string("m.")).c_str()) + (FIXED_STN_SD, boost::program_options::value(&p.a.fixed_std_dev), + (std::string("A-priori standard deviation for fixed stations. Default is ")+ + StringFromT(p.a.fixed_std_dev, 6)+std::string("m.")).c_str()) (SCALE_NORMAL_UNITY, "Scale adjustment normal matrices to unity prior to computing inverse to minimise loss of precision caused by tight variances placed on constraint stations.") - (TYPE_B_GLOBAL, value(&p.a.type_b_global), + (TYPE_B_GLOBAL, boost::program_options::value(&p.a.type_b_global), "Type b uncertainties to be added to each computed uncertainty. arg is a comma delimited string that provides 1D, 2D or 3D uncertainties in the local reference frame (e.g. \"up\" or \"e,n\" or \"e,n,up\").") - (TYPE_B_FILE, value(&p.a.type_b_file), + (TYPE_B_FILE, boost::program_options::value(&p.a.type_b_file), "Type b uncertainties file name. Full path to a file containing Type b uncertainties to be added to the computed uncertainty for specific sites.") ; @@ -836,8 +836,8 @@ int main(int argc, char* argv[]) output_options.add_options() (OUTPUT_MSR_TO_STN, "Output summary of measurements connected to each station.") - (OUTPUT_MSR_TO_STN_SORTBY, value(&p.o._sort_msr_to_stn), - string("Sort order for measurement to stations summary.\n " + + (OUTPUT_MSR_TO_STN_SORTBY, boost::program_options::value(&p.o._sort_msr_to_stn), + std::string("Sort order for measurement to stations summary.\n " + StringFromT(orig_stn_sort_ui) + ": Original station order (default)\n " + StringFromT(meas_stn_sort_ui) + ": Measurement count").c_str()) (OUTPUT_ADJ_STN_ITER, @@ -850,8 +850,8 @@ int main(int argc, char* argv[]) "Output computed measurements on each iteration.") (OUTPUT_ADJ_MSR, "Output final adjusted measurements.") - (OUTPUT_ADJ_GNSS_UNITS, value(&p.o._adj_gnss_units), - string("Units for adjusted GNSS baseline measurements in the .adj file.\n " + + (OUTPUT_ADJ_GNSS_UNITS, boost::program_options::value(&p.o._adj_gnss_units), + std::string("Units for adjusted GNSS baseline measurements in the .adj file.\n " + StringFromT(XYZ_adj_gnss_ui) + ": As measured (default)\n " + StringFromT(ENU_adj_gnss_ui) + ": Local [east, north, up]\n " + StringFromT(AED_adj_gnss_ui) + ": Polar [azimuth, vert. angle, slope dist]\n " + @@ -862,8 +862,8 @@ int main(int argc, char* argv[]) "Output measurement and cluster ids for database mapping.") (OUTPUT_IGNORED_MSRS, "Output adjusted measurement statistics for ignored measurements.") - (OUTPUT_ADJ_MSR_SORTBY, value(&p.o._sort_adj_msr), - string("Sort order for adjusted measurements.\n " + + (OUTPUT_ADJ_MSR_SORTBY, boost::program_options::value(&p.o._sort_adj_msr), + std::string("Sort order for adjusted measurements.\n " + StringFromT(orig_adj_msr_sort_ui) + ": Original input file order (default)\n " + StringFromT(type_adj_msr_sort_ui) + ": Measurement type\n " + StringFromT(inst_adj_msr_sort_ui) + ": Station 1\n " + @@ -878,34 +878,34 @@ int main(int argc, char* argv[]) "For phased adjustments, output adjusted measurements according to each block.") (OUTPUT_ADJ_STN_SORT_ORDER, "Output station information using the station order in the original station file. By default, stations are output in alpha-numeric order.") - (OUTPUT_STN_COORD_TYPES, value(&p.o._stn_coord_types), - (string("Output station coordinate types. arg is a case-sensitive string of chars \"ENzPLHhXYZ\" defining the specific types to be printed. Default is ").append( + (OUTPUT_STN_COORD_TYPES, boost::program_options::value(&p.o._stn_coord_types), + (std::string("Output station coordinate types. arg is a case-sensitive string of chars \"ENzPLHhXYZ\" defining the specific types to be printed. Default is ").append( p.o._stn_coord_types).append( ".")).c_str()) - (OUTPUT_ANGULAR_TYPE_STN, value(&p.o._angular_type_stn), - string("Output type for angular station coordinates.\n" + (OUTPUT_ANGULAR_TYPE_STN, boost::program_options::value(&p.o._angular_type_stn), + std::string("Output type for angular station coordinates.\n" " 0: Degrees, minutes and seconds (default)\n" " 1: Decimal degrees").c_str()) (OUTPUT_STN_CORR, "Output station corrections with adjusted station coordinates.") - (OUTPUT_PRECISION_METRES_STN, value(&p.o._precision_metres_stn), - (string("Output precision for linear station coordinates in metres. Default is ")+ + (OUTPUT_PRECISION_METRES_STN, boost::program_options::value(&p.o._precision_metres_stn), + (std::string("Output precision for linear station coordinates in metres. Default is ")+ StringFromT(p.o._precision_metres_stn, 0)).c_str()) - (OUTPUT_PRECISION_SECONDS_STN, value(&p.o._precision_seconds_stn), - (string("Output precision for angular station coordinates. For values in degrees, minutes and seconds, precision relates to seconds. For values in decimal degrees, precision relates to degrees. Default is ")+ + (OUTPUT_PRECISION_SECONDS_STN, boost::program_options::value(&p.o._precision_seconds_stn), + (std::string("Output precision for angular station coordinates. For values in degrees, minutes and seconds, precision relates to seconds. For values in decimal degrees, precision relates to degrees. Default is ")+ StringFromT(p.o._precision_seconds_stn, 0)).c_str()) - (OUTPUT_PRECISION_METRES_MSR, value(&p.o._precision_metres_msr), - (string("Output precision for linear measurements in metres. Default is ")+ + (OUTPUT_PRECISION_METRES_MSR, boost::program_options::value(&p.o._precision_metres_msr), + (std::string("Output precision for linear measurements in metres. Default is ")+ StringFromT(p.o._precision_metres_msr, 0)).c_str()) - (OUTPUT_PRECISION_SECONDS_MSR, value(&p.o._precision_seconds_msr), - (string("Output precision for angular measurements. For values in degrees, minutes and seconds, precision relates to seconds. For values in decimal degrees, precision relates to degrees. Default is ")+ + (OUTPUT_PRECISION_SECONDS_MSR, boost::program_options::value(&p.o._precision_seconds_msr), + (std::string("Output precision for angular measurements. For values in degrees, minutes and seconds, precision relates to seconds. For values in decimal degrees, precision relates to degrees. Default is ")+ StringFromT(p.o._precision_seconds_msr, 0)).c_str()) - (OUTPUT_ANGULAR_TYPE_MSR, value(&p.o._angular_type_msr), - string("Output type for angular measurements.\n" + (OUTPUT_ANGULAR_TYPE_MSR, boost::program_options::value(&p.o._angular_type_msr), + std::string("Output type for angular measurements.\n" " 0: Degrees, minutes and seconds (default)\n" " 1: Decimal degrees").c_str()) - (OUTPUT_DMS_FORMAT_MSR, value(&p.o._dms_format_msr), - string("Output format for angular (dms) measurements.\n" + (OUTPUT_DMS_FORMAT_MSR, boost::program_options::value(&p.o._dms_format_msr), + std::string("Output format for angular (dms) measurements.\n" " 0: Separated fields (default)\n" " 1: Separated fields with symbols\n" " 2: HP notation").c_str()) @@ -916,19 +916,19 @@ int main(int argc, char* argv[]) "Output positional uncertainty and variances of adjusted station coordinates to .apu file.") (OUTPUT_APU_CORRELATIONS, "Output covariances between adjusted station coordinates to .apu file.") - (OUTPUT_APU_UNITS, value(&p.o._apu_vcv_units), - string("Variance matrix units in the .apu file.\n " + + (OUTPUT_APU_UNITS, boost::program_options::value(&p.o._apu_vcv_units), + std::string("Variance matrix units in the .apu file.\n " + StringFromT(XYZ_apu_ui) + ": Cartesian [X,Y,Z] (default)\n " + //StringFromT(LLH_apu_ui) + ": Geographic [Lat,Lon,ht]\n " + StringFromT(ENU_apu_ui) + ": Local [e,n,up]").c_str()) (OUTPUT_STN_COR_FILE, "Output corrections (azimuth, distance, e, n, up) to initial station coordinates to .cor file.") - (HZ_CORR_THRESHOLD, value(&p.o._hz_corr_threshold), - (string("Minimum horizontal threshold by which to restrict output of station corrections to .cor file. Default is ")+ - StringFromT(p.o._hz_corr_threshold, 1)+string("m")).c_str()) - (VT_CORR_THRESHOLD, value(&p.o._vt_corr_threshold), - (string("Minimum vertical threshold by which to restrict output of station corrections to .cor file. Default is ")+ - StringFromT(p.o._vt_corr_threshold, 1)+string("m")).c_str()) + (HZ_CORR_THRESHOLD, boost::program_options::value(&p.o._hz_corr_threshold), + (std::string("Minimum horizontal threshold by which to restrict output of station corrections to .cor file. Default is ")+ + StringFromT(p.o._hz_corr_threshold, 1)+std::string("m")).c_str()) + (VT_CORR_THRESHOLD, boost::program_options::value(&p.o._vt_corr_threshold), + (std::string("Minimum vertical threshold by which to restrict output of station corrections to .cor file. Default is ")+ + StringFromT(p.o._vt_corr_threshold, 1)+std::string("m")).c_str()) //(UPDATE_ORIGINAL_STN_FILE, // "Update original station file with adjusted station coordinates.") (EXPORT_XML_STN_FILE, @@ -946,17 +946,17 @@ int main(int argc, char* argv[]) // Declare a group of options that will be // allowed only on command line generic_options.add_options() - (VERBOSE, value(&p.g.verbose), - string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n" + (VERBOSE, boost::program_options::value(&p.g.verbose), + std::string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n" " 0: No information (default)\n" " 1: Helpful information\n" " 2: Extended information\n" " 3: Debug level information").c_str()) (QUIET, - string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) + std::string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) (VERSION_V, "Display the current program version") (HELP_H, "Show this help message") - (HELP_MODULE_H, value(), + (HELP_MODULE_H, boost::program_options::value(), "Provide help for a specific help category.") ; @@ -965,92 +965,92 @@ int main(int argc, char* argv[]) // add "positional options" to handle command line tokens which have no option name positional_options.add(NETWORK_NAME, -1); - command_line_parser parser(argc, argv); + boost::program_options::command_line_parser parser(argc, argv); store(parser.options(allowable_options).positional(positional_options).run(), vm); notify(vm); } catch (const std::exception& e) { cout_mutex.lock(); - cout << "- Error: " << e.what() << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << "- Error: " << e.what() << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; cout_mutex.unlock(); return EXIT_FAILURE; } catch (...) { - cout << "+ Exception of unknown type!\n"; + std::cout << "+ Exception of unknown type!\n"; return EXIT_FAILURE; } if (argc < 2) { - cout << endl << "- Nothing to do - no options provided. " << endl << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << std::endl << "- Nothing to do - no options provided. " << std::endl << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } if (vm.count(VERSION)) { - cout << cmd_line_banner << endl; + std::cout << cmd_line_banner << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP)) { - cout << cmd_line_banner << allowable_options << endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP_MODULE)) { - cout << cmd_line_banner; - string original_text = vm[HELP_MODULE].as(); - string help_text = str_upper(original_text); + std::cout << cmd_line_banner; + std::string original_text = vm[HELP_MODULE].as(); + std::string help_text = str_upper(original_text); bool module_found(false); - if (str_upper(ALL_MODULE_STDOPT).find(help_text) != string::npos) { - cout << standard_options << endl; + if (str_upper(ALL_MODULE_STDOPT).find(help_text) != std::string::npos) { + std::cout << standard_options << std::endl; module_found = true; } - if (str_upper(ADJUST_MODULE_MODE).find(help_text) != string::npos) { - cout << adj_mode_options << endl; + if (str_upper(ADJUST_MODULE_MODE).find(help_text) != std::string::npos) { + std::cout << adj_mode_options << std::endl; module_found = true; } - if (str_upper(ADJUST_MODULE_PHASED).find(help_text) != string::npos) { - cout << phased_adj_options << endl; + if (str_upper(ADJUST_MODULE_PHASED).find(help_text) != std::string::npos) { + std::cout << phased_adj_options << std::endl; module_found = true; } - if (str_upper(ADJUST_MODULE_CONFIG).find(help_text) != string::npos) { - cout << adj_config_options << endl; + if (str_upper(ADJUST_MODULE_CONFIG).find(help_text) != std::string::npos) { + std::cout << adj_config_options << std::endl; module_found = true; } - if (str_upper(ADJUST_MODULE_STAGE).find(help_text) != string::npos) { - cout << staged_adj_options << endl; + if (str_upper(ADJUST_MODULE_STAGE).find(help_text) != std::string::npos) { + std::cout << staged_adj_options << std::endl; module_found = true; } - if (str_upper(ALL_MODULE_OUTPUT).find(help_text) != string::npos) { - cout << output_options << endl; + if (str_upper(ALL_MODULE_OUTPUT).find(help_text) != std::string::npos) { + std::cout << output_options << std::endl; module_found = true; } - if (str_upper(ALL_MODULE_EXPORT).find(help_text) != string::npos) { - cout << export_options << endl; + if (str_upper(ALL_MODULE_EXPORT).find(help_text) != std::string::npos) { + std::cout << export_options << std::endl; module_found = true; } - if (str_upper(ALL_MODULE_GENERIC).find(help_text) != string::npos) { - cout << generic_options << endl; + if (str_upper(ALL_MODULE_GENERIC).find(help_text) != std::string::npos) { + std::cout << generic_options << std::endl; module_found = true; } if (!module_found) { - cout << endl << "- Error: Help module '" << - original_text << "' is not in the list of options." << endl; + std::cout << std::endl << "- Error: Help module '" << + original_text << "' is not in the list of options." << std::endl; return EXIT_FAILURE; } @@ -1094,44 +1094,44 @@ int main(int argc, char* argv[]) if (!p.g.quiet) { cout_mutex.lock(); - cout << endl << cmd_line_banner; - - cout << "+ Options:" << endl; - cout << setw(PRINT_VAR_PAD) << left << " Network name: " << p.g.network_name << endl; - cout << setw(PRINT_VAR_PAD) << left << " Input folder: " << p.g.input_folder << endl; - cout << setw(PRINT_VAR_PAD) << left << " Output folder: " << p.g.output_folder << endl; - cout << setw(PRINT_VAR_PAD) << left << " Associated station file: " << p.s.asl_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Associated measurement file: " << p.s.aml_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Binary station file: " << p.a.bst_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Binary measurement file: " << p.a.bms_file << endl; + std::cout << std::endl << cmd_line_banner; + + std::cout << "+ Options:" << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Network name: " << p.g.network_name << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Input folder: " << p.g.input_folder << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Output folder: " << p.g.output_folder << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Associated station file: " << p.s.asl_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Associated measurement file: " << p.s.aml_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Binary station file: " << p.a.bst_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Binary measurement file: " << p.a.bms_file << std::endl; if (p.a.adjust_mode == PhasedMode || p.a.adjust_mode == Phased_Block_1Mode) - cout << setw(PRINT_VAR_PAD) << left << " Segmentation file: " << p.a.seg_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Adjustment output file: " << p.o._adj_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Coordinate output file: " << p.o._xyz_file << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Segmentation file: " << p.a.seg_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Adjustment output file: " << p.o._adj_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Coordinate output file: " << p.o._xyz_file << std::endl; if (p.o._init_stn_corrections) - cout << setw(PRINT_VAR_PAD) << left << " Corrections output file: " << p.o._cor_file << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Corrections output file: " << p.o._cor_file << std::endl; if (p.a.stage) { - cout << setw(PRINT_VAR_PAD) << left << " Stage using hard disk: " << "yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Stage using hard disk: " << "yes" << std::endl; if (p.a.recreate_stage_files) - cout << setw(PRINT_VAR_PAD) << left << " Recreate mapped stage files: " << "yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Recreate mapped stage files: " << "yes" << std::endl; if (p.a.purge_stage_files) - cout << setw(PRINT_VAR_PAD) << left << " Purge mapped stage files: " << "yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Purge mapped stage files: " << "yes" << std::endl; } - cout << setw(PRINT_VAR_PAD) << left << " Reference frame: " << datum.GetName() << endl; - cout << setw(PRINT_VAR_PAD) << left << " Epoch: " << datum.GetEpoch_s() << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Reference frame: " << datum.GetName() << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Epoch: " << datum.GetEpoch_s() << std::endl; - cout << setw(PRINT_VAR_PAD) << left << " Geoid model: " << system_complete(p.n.ntv2_geoid_file).string() << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Geoid model: " << boost::filesystem::system_complete(p.n.ntv2_geoid_file).string() << std::endl; if (p.a.scale_normals_to_unity) - cout << setw(PRINT_VAR_PAD) << left << " Scale normals to unity: " << "yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Scale normals to unity: " << "yes" << std::endl; if (!p.a.station_constraints.empty()) { - cout << setw(PRINT_VAR_PAD) << left << " Station constraints: " << p.a.station_constraints << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Station constraints: " << p.a.station_constraints << std::endl; if (p.i.apply_discontinuities) - cout << setw(PRINT_VAR_PAD) << left << " Apply discontinuities: " << "yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Apply discontinuities: " << "yes" << std::endl; } switch (p.a.adjust_mode) @@ -1139,12 +1139,12 @@ int main(int argc, char* argv[]) case Phased_Block_1Mode: case PhasedMode: - if (!exists(p.a.seg_file)) + if (!boost::filesystem::exists(p.a.seg_file)) { - cout << endl << endl << - "- Error: The required segmentation file does not exist:" << endl; - cout << " " << p.a.seg_file << endl << endl; - cout << " Run 'segment " << p.g.network_name << "' to create a segmentation file" << endl << endl; + std::cout << std::endl << std::endl << + "- Error: The required segmentation file does not exist:" << std::endl; + std::cout << " " << p.a.seg_file << std::endl << std::endl; + std::cout << " Run 'segment " << p.g.network_name << "' to create a segmentation file" << std::endl << std::endl; cout_mutex.unlock(); return EXIT_FAILURE; } @@ -1155,41 +1155,41 @@ int main(int argc, char* argv[]) netAdjust.LoadSegmentationFileParameters(p.a.seg_file); } - cout << endl; - cout << setw(PRINT_VAR_PAD) << left; + std::cout << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left; switch (p.a.adjust_mode) { case SimultaneousMode: - cout << "+ Simultaneous adjustment mode" << endl; + std::cout << "+ Simultaneous adjustment mode" << std::endl; break; case PhasedMode: - cout << "+ Rigorous sequential phased adjustment mode"; + std::cout << "+ Rigorous sequential phased adjustment mode"; if (p.a.stage) - cout << " (staged)"; + std::cout << " (staged)"; // If the user has not provided a seg file, check the meta of the default file if (!userSuppliedSegFile) { - if (last_write_time(p.a.seg_file) < last_write_time(p.a.bst_file) || - last_write_time(p.a.seg_file) < last_write_time(p.a.bms_file)) + if (boost::filesystem::last_write_time(p.a.seg_file) < boost::filesystem::last_write_time(p.a.bst_file) || + boost::filesystem::last_write_time(p.a.seg_file) < boost::filesystem::last_write_time(p.a.bms_file)) { // Has import been run after the segmentation file was created? - if ((bst_meta_import && (last_write_time(p.a.seg_file) < last_write_time(p.a.bst_file))) || - (bms_meta_import && (last_write_time(p.a.seg_file) < last_write_time(p.a.bms_file)))) + if ((bst_meta_import && (boost::filesystem::last_write_time(p.a.seg_file) < boost::filesystem::last_write_time(p.a.bst_file))) || + (bms_meta_import && (boost::filesystem::last_write_time(p.a.seg_file) < boost::filesystem::last_write_time(p.a.bms_file)))) { - cout << endl << endl << - "- Error: The raw stations and measurements have been imported after" << endl << - " the segmentation file was created:" << endl; + std::cout << std::endl << std::endl << + "- Error: The raw stations and measurements have been imported after" << std::endl << + " the segmentation file was created:" << std::endl; - time_t t_bst(last_write_time(p.a.bst_file)), t_bms(last_write_time(p.a.bms_file)); - time_t t_seg(last_write_time(p.a.seg_file)); + time_t t_bst(boost::filesystem::last_write_time(p.a.bst_file)), t_bms(boost::filesystem::last_write_time(p.a.bms_file)); + time_t t_seg(boost::filesystem::last_write_time(p.a.seg_file)); - cout << " " << leafStr(p.a.bst_file) << " last modified on " << ctime(&t_bst); - cout << " " << leafStr(p.a.bms_file) << " last modified on " << ctime(&t_bms) << endl; - cout << " " << leafStr(p.a.seg_file) << " created on " << ctime(&t_seg) << endl; - cout << " Run 'segment " << p.g.network_name << " [options]' to re-create the segmentation file, or re-run" << endl << + std::cout << " " << leafStr(p.a.bst_file) << " last modified on " << ctime(&t_bst); + std::cout << " " << leafStr(p.a.bms_file) << " last modified on " << ctime(&t_bms) << std::endl; + std::cout << " " << leafStr(p.a.seg_file) << " created on " << ctime(&t_seg) << std::endl; + std::cout << " Run 'segment " << p.g.network_name << " [options]' to re-create the segmentation file, or re-run" << std::endl << " adjust using the --" << SEG_FILE << " option if the file " << - path(p.a.seg_file).stem() << " must\n be used." << endl << endl; + boost::filesystem::path(p.a.seg_file).stem() << " must\n be used." << std::endl << std::endl; cout_mutex.unlock(); return EXIT_FAILURE; } @@ -1201,13 +1201,13 @@ int main(int argc, char* argv[]) if (p.a.stage && !p.a.recreate_stage_files) { // Simply test one file - the estimated stations file - string est_mmapfile_name = + std::string est_mmapfile_name = p.g.output_folder + FOLDER_SLASH + p.g.network_name + "-est.mtx"; - string est_mmapfile_wildcard = + std::string est_mmapfile_wildcard = p.g.output_folder + FOLDER_SLASH + p.g.network_name + "-*.mtx"; - if (exists(est_mmapfile_name)) + if (boost::filesystem::exists(est_mmapfile_name)) { // Has import been run after the segmentation file was created? @@ -1222,20 +1222,20 @@ int main(int argc, char* argv[]) // then adjust will attempt to load memory map files using the same parameters from the first import // and segment. // Hence, force the user to run adjust with the --create-stage-files option. - if ((bst_meta_import && (last_write_time(est_mmapfile_name) < last_write_time(p.a.bst_file))) || - (bms_meta_import && (last_write_time(est_mmapfile_name) < last_write_time(p.a.bms_file)))) + if ((bst_meta_import && (boost::filesystem::last_write_time(est_mmapfile_name) < boost::filesystem::last_write_time(p.a.bst_file))) || + (bms_meta_import && (boost::filesystem::last_write_time(est_mmapfile_name) < boost::filesystem::last_write_time(p.a.bms_file)))) { - cout << endl << endl << - "- Error: The raw stations and measurements have been imported after" << endl << - " a staged adjustment created the memory map files:" << endl; + std::cout << std::endl << std::endl << + "- Error: The raw stations and measurements have been imported after" << std::endl << + " a staged adjustment created the memory map files:" << std::endl; - time_t t_bst(last_write_time(p.a.bst_file)), t_bms(last_write_time(p.a.bms_file)); - time_t t_mtx(last_write_time(est_mmapfile_name)); + time_t t_bst(boost::filesystem::last_write_time(p.a.bst_file)), t_bms(boost::filesystem::last_write_time(p.a.bms_file)); + time_t t_mtx(boost::filesystem::last_write_time(est_mmapfile_name)); - cout << " " << leafStr(p.a.bst_file) << " last modified on " << ctime(&t_bst); - cout << " " << leafStr(p.a.bms_file) << " last modified on " << ctime(&t_bms) << endl; - cout << " " << leafStr(est_mmapfile_wildcard) << " created on " << ctime(&t_mtx) << endl; - cout << " To readjust this network, re-run adjust using the " << RECREATE_STAGE_FILES << " option." << endl; + std::cout << " " << leafStr(p.a.bst_file) << " last modified on " << ctime(&t_bst); + std::cout << " " << leafStr(p.a.bms_file) << " last modified on " << ctime(&t_bms) << std::endl; + std::cout << " " << leafStr(est_mmapfile_wildcard) << " created on " << ctime(&t_mtx) << std::endl; + std::cout << " To readjust this network, re-run adjust using the " << RECREATE_STAGE_FILES << " option." << std::endl; cout_mutex.unlock(); return EXIT_FAILURE; } @@ -1245,35 +1245,35 @@ int main(int argc, char* argv[]) #ifdef MULTI_THREAD_ADJUST if (p.a.multi_thread) { - cout << endl << "+ Optimised for concurrent processing via multi-threading." << endl << endl; - cout << "+ The active CPU supports the execution of " << boost::thread::hardware_concurrency() << " concurrent threads."; + std::cout << std::endl << "+ Optimised for concurrent processing via multi-threading." << std::endl << std::endl; + std::cout << "+ The active CPU supports the execution of " << boost::thread::hardware_concurrency() << " concurrent threads."; } #endif - cout << endl; + std::cout << std::endl; break; case Phased_Block_1Mode: - cout << "+ Sequential phased adjustment resulting in rigorous estimates for Block 1 only" << endl; + std::cout << "+ Sequential phased adjustment resulting in rigorous estimates for Block 1 only" << std::endl; break; case SimulationMode: - cout << "+ Adjustment simulation only" << endl; + std::cout << "+ Adjustment simulation only" << std::endl; break; } - cout << endl; + std::cout << std::endl; if (p.a.report_mode) { - cout << "+ Report last adjustment results" << endl; + std::cout << "+ Report last adjustment results" << std::endl; // Has report mode been requested as well as an argument to recreate stage files? // If so, return an error message and exit as this will lead to reporting of // incorrect (zero!) results if (p.a.recreate_stage_files) { - cout << endl << - "- Error: The option --" << RECREATE_STAGE_FILES << " cannot be used in Report results mode" << endl << - " as it will erase the results from the latest adjustment and create new stage" << endl << - " files initialised to zero." << endl << endl; + std::cout << std::endl << + "- Error: The option --" << RECREATE_STAGE_FILES << " cannot be used in Report results mode" << std::endl << + " as it will erase the results from the latest adjustment and create new stage" << std::endl << + " files initialised to zero." << std::endl << std::endl; cout_mutex.unlock(); return EXIT_FAILURE; } @@ -1282,7 +1282,7 @@ int main(int argc, char* argv[]) cout_mutex.unlock(); } - milliseconds elapsed_time(milliseconds(0)); + boost::posix_time::milliseconds elapsed_time(boost::posix_time::milliseconds(0)); _ADJUST_STATUS_ adjustStatus; @@ -1290,7 +1290,7 @@ int main(int argc, char* argv[]) running = true; // adjust blocks using group thread - thread_group ui_adjust_threads; + boost::thread_group ui_adjust_threads; if (!p.g.quiet) ui_adjust_threads.create_thread(dna_adjust_progress_thread(&netAdjust, &p)); ui_adjust_threads.create_thread(dna_adjust_thread(&netAdjust, &p, &adjustStatus)); @@ -1356,14 +1356,14 @@ int main(int argc, char* argv[]) } catch (const NetAdjustException& e) { cout_mutex.lock(); - cout << endl << - "- Error: " << e.what() << endl; + std::cout << std::endl << + "- Error: " << e.what() << std::endl; cout_mutex.unlock(); return EXIT_FAILURE; } if (!p.g.quiet) - cout << endl << "+ Open " << leafStr(p.o._adj_file) << " to view the adjustment details." << endl << endl; + std::cout << std::endl << "+ Open " << leafStr(p.o._adj_file) << " to view the adjustment details." << std::endl << std::endl; if (!userSuppliedSegFile) p.a.seg_file = ""; @@ -1376,7 +1376,7 @@ int main(int argc, char* argv[]) // Update the import settings. // Print the project file. If it doesn't exist, it will be created. CDnaProjectFile projectFile; - if (exists(p.g.project_file)) + if (boost::filesystem::exists(p.g.project_file)) projectFile.LoadProjectFile(p.g.project_file); projectFile.UpdateSettingsAdjust(p); diff --git a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.hpp b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.hpp index a1c44b5e..fef16328 100644 --- a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.hpp +++ b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.hpp @@ -54,13 +54,6 @@ #include #include -using namespace std; -using namespace boost; -using namespace boost::filesystem; -using namespace boost::posix_time; -using namespace boost::program_options; -namespace po = boost::program_options; - using namespace dynadjust::networkadjust; using namespace dynadjust::exception; using namespace dynadjust::iostreams; diff --git a/dynadjust/dynadjust/dnageoid/bicubic_interpolation.hpp b/dynadjust/dynadjust/dnageoid/bicubic_interpolation.hpp index 3459211f..79f0997a 100644 --- a/dynadjust/dynadjust/dnageoid/bicubic_interpolation.hpp +++ b/dynadjust/dynadjust/dnageoid/bicubic_interpolation.hpp @@ -40,8 +40,6 @@ #include #include -using namespace std; - const int wt[16][16] = { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, diff --git a/dynadjust/dynadjust/dnageoid/dnageoid.cpp b/dynadjust/dynadjust/dnageoid/dnageoid.cpp index 30c5a07d..6bd62cb4 100644 --- a/dynadjust/dynadjust/dnageoid/dnageoid.cpp +++ b/dynadjust/dynadjust/dnageoid/dnageoid.cpp @@ -20,7 +20,6 @@ // Description : AusGeoid Grid File (NTv2) Interpolation library //============================================================================ - #include namespace dynadjust { namespace geoidinterpolation { @@ -78,31 +77,31 @@ void dna_geoid_interpolation::ApplyAusGeoidGrid(geoid_point *agCoord, const int& throw NetGeoidException(ErrorString(ERR_INTERPOLATION_TYPE), ERR_INTERPOLATION_TYPE); } -string dna_geoid_interpolation::ReturnBadStationRecords() +std::string dna_geoid_interpolation::ReturnBadStationRecords() { - stringstream ssPoints; + std::stringstream ssPoints; - ssPoints << setw(STATION) << left << "Station" << - setw(PAD2) << " " << - right << setw(LAT_EAST) << "Latitude" << - right << setw(LON_NORTH) << "Longitude" << - right << setw(LON_NORTH) << "Error code" << endl; + ssPoints << std::setw(STATION) << std::left << "Station" << + std::setw(PAD2) << " " << + std::right << std::setw(LAT_EAST) << "Latitude" << + std::right << std::setw(LON_NORTH) << "Longitude" << + std::right << std::setw(LON_NORTH) << "Error code" << std::endl; UINT32 i, j = STATION+PAD2+LAT_EAST+LON_NORTH+LON_NORTH; for (i=0; ifirst.stationName << - setw(PAD2) << " " << - right << setw(LAT_EAST) << FormatDmsString(RadtoDms(stn_it->first.currentLatitude), 7, true, false) << - right << setw(LON_NORTH) << FormatDmsString(RadtoDms(stn_it->first.currentLongitude), 7, true, false) << - right << setw(LON_NORTH) << stn_it->second << endl; + ssPoints << std::setw(STATION) << std::left << stn_it->first.stationName << + std::setw(PAD2) << " " << + std::right << std::setw(LAT_EAST) << FormatDmsString(RadtoDms(stn_it->first.currentLatitude), 7, true, false) << + std::right << std::setw(LON_NORTH) << FormatDmsString(RadtoDms(stn_it->first.currentLongitude), 7, true, false) << + std::right << std::setw(LON_NORTH) << stn_it->second << std::endl; } return ssPoints.str(); @@ -175,9 +174,9 @@ void dna_geoid_interpolation::ProcessCsvFile(std::ifstream* f_in, std::ofstream* double latitude, longitude, original_height; // calculate file length - f_in->seekg(0, ios::end); // set file pointer to end - streamoff lFileLen = f_in->tellg(); - f_in->seekg(0, ios::beg); // reset file pointer to beginning + f_in->seekg(0, std::ios::end); // set file pointer to end + std::streamoff lFileLen = f_in->tellg(); + f_in->seekg(0, std::ios::beg); // reset file pointer to beginning char cBuf[MAX_RECORD_LENGTH]; @@ -186,20 +185,20 @@ void dna_geoid_interpolation::ProcessCsvFile(std::ifstream* f_in, std::ofstream* bool iSuccess; int fieldCount; bool bheight_data; - string sBuf; + std::string sBuf; // Print header - *f_out << left << setw(11) << "Point" << "," << - setw(16) << right << "Latitude" << "," << - setw(16) << right << "Longitude" << "," << - setw(9) << right << "Orig. Ht" << ","; + *f_out << std::left << std::setw(11) << "Point" << "," << + std::setw(16) << std::right << "Latitude" << "," << + std::setw(16) << std::right << "Longitude" << "," << + std::setw(9) << std::right << "Orig. Ht" << ","; if (intEllipsoidtoOrtho == 1) - *f_out << setw(9) << right << trimstr(string(m_pGridfile->chSystem_t)) << ","; // "New Ht" + *f_out << std::setw(9) << std::right << trimstr(std::string(m_pGridfile->chSystem_t)) << ","; // "New Ht" else - *f_out << setw(9) << right << trimstr(string(m_pGridfile->chSystem_f)) << ","; // "New Ht" - *f_out << setw(9) << right << "N value" << "," << - setw(9) << right << "D.Merid" << "," << - setw(9) << right << "D.PrimeV" << endl; + *f_out << std::setw(9) << std::right << trimstr(std::string(m_pGridfile->chSystem_f)) << ","; // "New Ht" + *f_out << std::setw(9) << std::right << "N value" << "," << + std::setw(9) << std::right << "D.Merid" << "," << + std::setw(9) << std::right << "D.PrimeV" << std::endl; while (!f_in->eof()) // while EOF not found { @@ -240,31 +239,31 @@ void dna_geoid_interpolation::ProcessCsvFile(std::ifstream* f_in, std::ofstream* longitude < -180.0 || longitude > 180.0) { // Coordinates are invalid - *f_out << left << "ERROR (" << ERR_NUM_CSV_FIELDS << "): " << - ErrorString(ERR_NUM_CSV_FIELDS, sBuf) << endl; + *f_out << std::left << "ERROR (" << ERR_NUM_CSV_FIELDS << "): " << + ErrorString(ERR_NUM_CSV_FIELDS, sBuf) << std::endl; continue; } } } catch (...) { - *f_out << left << "ERROR (" << ERR_READING_DATA << "): " << - ErrorString(ERR_READING_DATA, cBuf) << endl; + *f_out << std::left << "ERROR (" << ERR_READING_DATA << "): " << + ErrorString(ERR_READING_DATA, cBuf) << std::endl; continue; } if (fabs(latitude) > UNRELIABLE || fabs(longitude) > UNRELIABLE) { // a comma was found, but no data - *f_out << left << "ERROR (" << ERR_NUM_CSV_FIELDS << "): " << - ErrorString(ERR_NUM_CSV_FIELDS, sBuf) << endl; + *f_out << std::left << "ERROR (" << ERR_NUM_CSV_FIELDS << "): " << + ErrorString(ERR_NUM_CSV_FIELDS, sBuf) << std::endl; continue; } if (fabs(latitude) > 90.0 || fabs(longitude) > 180.0) { // latitude or longitude invalid - *f_out << left << "ERROR (" << ERR_INVALID_INPUT << "): " << - ErrorString(ERR_INVALID_INPUT, sBuf) << endl; + *f_out << std::left << "ERROR (" << ERR_INVALID_INPUT << "): " << + ErrorString(ERR_INVALID_INPUT, sBuf) << std::endl; continue; } @@ -297,7 +296,7 @@ void dna_geoid_interpolation::ProcessCsvFile(std::ifstream* f_in, std::ofstream* iSuccess = true; } catch (const NetGeoidException& e) { - stringstream s(e.what()); + std::stringstream s(e.what()); iSuccess = false; } @@ -316,46 +315,46 @@ void dna_geoid_interpolation::ProcessCsvFile(std::ifstream* f_in, std::ofstream* apPt.cVar.dHeight = -UNRELIABLE; // Format error message using input coordinates - stringstream ss; + std::stringstream ss; strcpy(cBuf, sBuf.c_str()); char inputLatitude[50], inputLongitude[50]; GetFields(cBuf, ',', false, "sss", cPoint, inputLatitude, inputLongitude); - ss << trimstr(string(inputLatitude)) << ", " << trimstr(string(inputLongitude)); + ss << trimstr(std::string(inputLatitude)) << ", " << trimstr(std::string(inputLongitude)); // print dat - *f_out << left << "ERROR (" << apPt.cVar.IO_Status << "): " << - ErrorString(apPt.cVar.IO_Status, ss.str()) << endl; + *f_out << std::left << "ERROR (" << apPt.cVar.IO_Status << "): " << + ErrorString(apPt.cVar.IO_Status, ss.str()) << std::endl; continue; } // print csv // const char* const CSV_DDEG = "%-11s,%16.9f,%16.9f,%9.3f\n"; - *f_out << left << setw(11) << cPoint << "," << - setw(16) << setprecision(9) << fixed << right << latitude << "," << - setw(16) << setprecision(9) << fixed << right << longitude << ","; + *f_out << std::left << std::setw(11) << cPoint << "," << + std::setw(16) << std::setprecision(9) << std::fixed << std::right << latitude << "," << + std::setw(16) << std::setprecision(9) << std::fixed << std::right << longitude << ","; if (bheight_data) { // A height was supplied... // Print the 'original' height - *f_out << setw(9) << setprecision(3) << fixed << right << original_height << ","; + *f_out << std::setw(9) << std::setprecision(3) << std::fixed << std::right << original_height << ","; // Print the 'transformed' height - *f_out << setw(9) << setprecision(3) << fixed << right << apPt.cVar.dHeight << ","; + *f_out << std::setw(9) << std::setprecision(3) << std::fixed << std::right << apPt.cVar.dHeight << ","; } else { // no height was supplied, so print blanks for original height and derived heights - *f_out << setw(9) << right << " " << ","; - *f_out << setw(9) << right << " " << ","; + *f_out << std::setw(9) << std::right << " " << ","; + *f_out << std::setw(9) << std::right << " " << ","; } // As per Nick Brown's request, print the N value regardless of input height - *f_out << setw(9) << setprecision(3) << fixed << right << apPt.gVar.dN_value << ","; + *f_out << std::setw(9) << std::setprecision(3) << std::fixed << std::right << apPt.gVar.dN_value << ","; // Print the deflection values - *f_out << setw(9) << setprecision(3) << fixed << right << apPt.gVar.dDefl_meridian << "," << - setw(9) << setprecision(3) << fixed << right << apPt.gVar.dDefl_primev << endl; + *f_out << std::setw(9) << std::setprecision(3) << std::fixed << std::right << apPt.gVar.dDefl_meridian << "," << + std::setw(9) << std::setprecision(3) << std::fixed << std::right << apPt.gVar.dDefl_primev << std::endl; // write to dna geo file if (m_exportDNAGeoidFile) @@ -370,30 +369,30 @@ void dna_geoid_interpolation::ProcessDatFile(std::ifstream* f_in, std::ofstream* m_fileMode = true; // calculate file length - f_in->seekg(0, ios::end); // set file pointer to end - streamoff lFileLen = f_in->tellg(); - f_in->seekg(0, ios::beg); // reset file pointer to beginning + f_in->seekg(0, std::ios::end); // set file pointer to end + std::streamoff lFileLen = f_in->tellg(); + f_in->seekg(0, std::ios::beg); // reset file pointer to beginning char cBuf[MAX_RECORD_LENGTH]; geoid_point apPt; bool iSuccess; bool bheight_data; - string strBuf, station; + std::string strBuf, station; double original_height; // Print header - *f_out << left << setw(11) << "Point" << - setw(16) << right << "Latitude" << - setw(16) << right << "Longitude" << - setw(9) << right << "Orig. Ht"; + *f_out << std::left << std::setw(11) << "Point" << + std::setw(16) << std::right << "Latitude" << + std::setw(16) << std::right << "Longitude" << + std::setw(9) << std::right << "Orig. Ht"; if (intEllipsoidtoOrtho == 1) - *f_out << setw(9) << right << trimstr(string(m_pGridfile->chSystem_t)); // "New Ht" + *f_out << std::setw(9) << std::right << trimstr(std::string(m_pGridfile->chSystem_t)); // "New Ht" else - *f_out << setw(9) << right << trimstr(string(m_pGridfile->chSystem_f)); // "New Ht" - *f_out << setw(9) << right << "N value" << - setw(9) << right << "D.Merid" << - setw(9) << right << "D.PrimeV" << endl; + *f_out << std::setw(9) << std::right << trimstr(std::string(m_pGridfile->chSystem_f)); // "New Ht" + *f_out << std::setw(9) << std::right << "N value" << + std::setw(9) << std::right << "D.Merid" << + std::setw(9) << std::right << "D.PrimeV" << std::endl; do { @@ -424,12 +423,12 @@ void dna_geoid_interpolation::ProcessDatFile(std::ifstream* f_in, std::ofstream* if (strBuf.length() < 31) // 31 = 11 + 16 + 4 (4 is the minimum number of { // units required for longitude) // print dat - *f_out << left << "ERROR (" << ERR_LINE_TOO_SHORT << "): " << - ErrorString(ERR_LINE_TOO_SHORT, strBuf) << endl; + *f_out << std::left << "ERROR (" << ERR_LINE_TOO_SHORT << "): " << + ErrorString(ERR_LINE_TOO_SHORT, strBuf) << std::endl; continue; } - stringstream ssInput; + std::stringstream ssInput; ssInput << trimstr(strBuf.substr(11, 16)) << ", " << trimstr(strBuf.substr(27, 16)); SetInputCoordinates(ssInput.str()); @@ -465,7 +464,7 @@ void dna_geoid_interpolation::ProcessDatFile(std::ifstream* f_in, std::ofstream* // are there characters after the permitted height field? if (bheight_data) { - string height_str; + std::string height_str; if (strBuf.length() > 52) height_str = trimstr(strBuf.substr(43, 9)); else @@ -487,7 +486,7 @@ void dna_geoid_interpolation::ProcessDatFile(std::ifstream* f_in, std::ofstream* iSuccess = true; } catch (const NetGeoidException& e) { - stringstream s(e.what()); + std::stringstream s(e.what()); iSuccess = false; } @@ -506,12 +505,12 @@ void dna_geoid_interpolation::ProcessDatFile(std::ifstream* f_in, std::ofstream* apPt.cVar.dHeight = -UNRELIABLE; // Format error message using input coordinates - stringstream ss; + std::stringstream ss; ss << trimstr(strBuf.substr(11, 16)) << ", " << trimstr(strBuf.substr(27, 16)); // print dat - *f_out << left << "ERROR (" << apPt.cVar.IO_Status << "): " << - ErrorString(apPt.cVar.IO_Status, ss.str()) << endl; + *f_out << std::left << "ERROR (" << apPt.cVar.IO_Status << "): " << + ErrorString(apPt.cVar.IO_Status, ss.str()) << std::endl; continue; } @@ -521,37 +520,37 @@ void dna_geoid_interpolation::ProcessDatFile(std::ifstream* f_in, std::ofstream* apPt.cVar.dLongitude = DegtoDms(apPt.cVar.dLongitude); } - station = string(cBuf).substr(0, 11); + station = std::string(cBuf).substr(0, 11); // print dat - *f_out << left << setw(11) << station << - setw(16) << setprecision(9) << fixed << right << apPt.cVar.dLatitude << - setw(16) << setprecision(9) << fixed << right << apPt.cVar.dLongitude; + *f_out << std::left << std::setw(11) << station << + std::setw(16) << std::setprecision(9) << std::fixed << std::right << apPt.cVar.dLatitude << + std::setw(16) << std::setprecision(9) << std::fixed << std::right << apPt.cVar.dLongitude; if (bheight_data) { // A height was supplied... // Print the 'original' height - *f_out << setw(9) << setprecision(3) << fixed << right << original_height; + *f_out << std::setw(9) << std::setprecision(3) << std::fixed << std::right << original_height; // Print the 'transformed' height, unless there is no N value (-999.000) if (apPt.gVar.dN_value < -998.0) - *f_out << setw(9) << setprecision(3) << fixed << right << original_height; + *f_out << std::setw(9) << std::setprecision(3) << std::fixed << std::right << original_height; else - *f_out << setw(9) << setprecision(3) << fixed << right << apPt.cVar.dHeight; + *f_out << std::setw(9) << std::setprecision(3) << std::fixed << std::right << apPt.cVar.dHeight; } else { // no height was supplied, so print blanks for original height and derived heights - *f_out << setw(9) << right << " "; - *f_out << setw(9) << right << " "; + *f_out << std::setw(9) << std::right << " "; + *f_out << std::setw(9) << std::right << " "; } // As per Nick Brown's request, print the N value regardless of input height - *f_out << setw(9) << setprecision(3) << fixed << right << apPt.gVar.dN_value; + *f_out << std::setw(9) << std::setprecision(3) << std::fixed << std::right << apPt.gVar.dN_value; // Print the deflection values - *f_out << setw(9) << setprecision(3) << fixed << right << apPt.gVar.dDefl_meridian << - setw(9) << setprecision(3) << fixed << right << apPt.gVar.dDefl_primev << endl; + *f_out << std::setw(9) << std::setprecision(3) << std::fixed << std::right << apPt.gVar.dDefl_meridian << + std::setw(9) << std::setprecision(3) << std::fixed << std::right << apPt.gVar.dDefl_primev << std::endl; // write to dna geo file if (m_exportDNAGeoidFile) @@ -572,7 +571,7 @@ void dna_geoid_interpolation::FileTransformation(const char* fileIn, const char* m_pointsInterpolated = m_pointsNotInterpolated = 0; - //const char* ext = strrchr(trimstr(fileIn).c_str(), '.'); + //const char* ext = strrchr(trimstr(fileIn).c_str(), '.'); const char* ext = strrchr(fileIn, '.'); int iF_inType(TYPE_ASC); @@ -585,11 +584,11 @@ void dna_geoid_interpolation::FileTransformation(const char* fileIn, const char* std::ifstream f_in; try { // open input file. Throws runtime_error on failure. - file_opener(f_in, trimstr(fileIn).c_str(), ios::in, ascii, true); + file_opener(f_in, trimstr(fileIn).c_str(), std::ios::in, ascii, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ClearGridFileMemory(); - stringstream ss; + std::stringstream ss; ss << ErrorString(ERR_INFILE_READ) << "\n" << " " << e.what(); throw NetGeoidException(ss.str(), ERR_INFILE_READ); @@ -598,11 +597,11 @@ void dna_geoid_interpolation::FileTransformation(const char* fileIn, const char* std::ofstream f_out; try { // Create input file. Throws runtime_error on failure. - file_opener(f_out, trimstr(fileOut).c_str()); + file_opener(f_out, trimstr(fileOut).c_str()); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ClearGridFileMemory(); - stringstream ss; + std::stringstream ss; ss << ErrorString(ERR_OUTFILE_WRITE) << "\n" << " " << e.what(); throw NetGeoidException(ss.str(), ERR_OUTFILE_WRITE); @@ -614,19 +613,19 @@ void dna_geoid_interpolation::FileTransformation(const char* fileIn, const char* std::ofstream f_dnageo; if (m_exportDNAGeoidFile) { - string geofileOut; + std::string geofileOut; if (geoFile != NULL) geofileOut = geoFile; else { - geofileOut = trimstr(fileOut); + geofileOut = trimstr(fileOut); - string searchstr(ext); - string replacestr(".geo"); + std::string searchstr(ext); + std::string replacestr(".geo"); size_t pos = 0; - if ((pos = geofileOut.find(searchstr, pos)) != string::npos) + if ((pos = geofileOut.find(searchstr, pos)) != std::string::npos) geofileOut.replace(pos, replacestr.size(), replacestr); else geofileOut += ".geo"; @@ -636,9 +635,9 @@ void dna_geoid_interpolation::FileTransformation(const char* fileIn, const char* // Create geoid file. Throws runtime_error on failure. file_opener(f_dnageo, geofileOut); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ClearGridFileMemory(); - stringstream ss; + std::stringstream ss; ss << ErrorString(ERR_OUTFILE_WRITE) << "\n" << " " << e.what(); throw NetGeoidException(ss.str(), ERR_OUTFILE_WRITE); @@ -648,10 +647,10 @@ void dna_geoid_interpolation::FileTransformation(const char* fileIn, const char* // As per Nick Brown's request, print Grid file version to file f_out << "Derived "; if (intEllipsoidtoOrtho == 1) - f_out << trimstr(string(m_pGridfile->chSystem_t)); + f_out << trimstr(std::string(m_pGridfile->chSystem_t)); else - f_out << trimstr(string(m_pGridfile->chSystem_f)); - f_out << " values obtained from " << left << m_pGridfile->filename << ", Version " << trimstr(string(m_pGridfile->chVersion)) << endl; + f_out << trimstr(std::string(m_pGridfile->chSystem_f)); + f_out << " values obtained from " << std::left << m_pGridfile->filename << ", Version " << trimstr(std::string(m_pGridfile->chVersion)) << std::endl; switch (iF_inType) { @@ -671,7 +670,7 @@ void dna_geoid_interpolation::FileTransformation(const char* fileIn, const char* f_dnageo.close(); } -void dna_geoid_interpolation::PopulateBinaryStationFile(const string& bstnFile, const int& method, +void dna_geoid_interpolation::PopulateBinaryStationFile(const std::string& bstnFile, const int& method, bool convertHeights, bool exportDnaGeoidFile, const char* geoFile) { if (!m_pGridfile) @@ -689,13 +688,13 @@ void dna_geoid_interpolation::PopulateBinaryStationFile(const string& bstnFile, { if (geoFile == NULL) { - string geofileOut(bstnFile); + std::string geofileOut(bstnFile); // Export data to DNA geoid file? - string searchstr(".bst"), replacestr(".geo"); + std::string searchstr(".bst"), replacestr(".geo"); size_t pos = 0; - if ((pos = geofileOut.find(searchstr, pos)) != string::npos) + if ((pos = geofileOut.find(searchstr, pos)) != std::string::npos) geofileOut.replace(pos, replacestr.size(), replacestr); else geofileOut += ".geo"; @@ -707,16 +706,16 @@ void dna_geoid_interpolation::PopulateBinaryStationFile(const string& bstnFile, } } -void dna_geoid_interpolation::LoadBinaryStationFile(const string& bstnfileName) +void dna_geoid_interpolation::LoadBinaryStationFile(const std::string& bstnfileName) { try { // Load binary stations data. Throws runtime_error on failure. dna_io_bst bst; bst.load_bst_file(bstnfileName, &bstBinaryRecords_, bst_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ClearGridFileMemory(); - stringstream ss; + std::stringstream ss; ss << ErrorString(ERR_INFILE_READ) << "\n" << " " << e.what(); throw NetGeoidException(ss.str(), ERR_INFILE_READ); @@ -724,7 +723,7 @@ void dna_geoid_interpolation::LoadBinaryStationFile(const string& bstnfileName) } -void dna_geoid_interpolation::WriteBinaryStationFile(const string& bstnfileName) +void dna_geoid_interpolation::WriteBinaryStationFile(const std::string& bstnfileName) { sprintf(bst_meta_.modifiedBy, "%s", __BINARY_NAME__); bst_meta_.geoid = true; @@ -734,26 +733,26 @@ void dna_geoid_interpolation::WriteBinaryStationFile(const string& bstnfileName) dna_io_bst bst; bst.write_bst_file(bstnfileName, &bstBinaryRecords_, bst_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ClearGridFileMemory(); - stringstream ss; - ss << ErrorString(ERR_OUTFILE_WRITE) << endl << + std::stringstream ss; + ss << ErrorString(ERR_OUTFILE_WRITE) << std::endl << " " << e.what(); throw NetGeoidException(ss.str(), ERR_OUTFILE_WRITE); } } -void dna_geoid_interpolation::WriteDNA1GeoidFile(const string& geofileName) +void dna_geoid_interpolation::WriteDNA1GeoidFile(const std::string& geofileName) { std::ofstream f_dnageo; try { // Create geoid file. Throws runtime_error on failure. file_opener(f_dnageo, geofileName); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ClearGridFileMemory(); - stringstream ss; + std::stringstream ss; ss << ErrorString(ERR_OUTFILE_WRITE) << "\n" << " " << e.what(); throw NetGeoidException(ss.str(), ERR_OUTFILE_WRITE); @@ -764,7 +763,7 @@ void dna_geoid_interpolation::WriteDNA1GeoidFile(const string& geofileName) // Write header line dnaproj_header(f_dnageo, "DNA geoid file"); - f_dnageo << endl; + f_dnageo << std::endl; it_vstn_t _it_stn(bstBinaryRecords_.begin()); @@ -785,9 +784,9 @@ void dna_geoid_interpolation::WriteDNA1GeoidFile(const string& geofileName) Seconds(_it_stn->verticalDef)); } } - catch (const ios_base::failure& f) { - stringstream ss; - ss << "WriteDNA1GeoidFile(): An error was encountered when writing to " << geofileName << "." << endl << f.what(); + catch (const std::ios_base::failure& f) { + std::stringstream ss; + ss << "WriteDNA1GeoidFile(): An error was encountered when writing to " << geofileName << "." << std::endl << f.what(); throw NetGeoidException(ss.str(), ERR_INFILE_READ); } @@ -796,12 +795,12 @@ void dna_geoid_interpolation::WriteDNA1GeoidFile(const string& geofileName) } -void dna_geoid_interpolation::PrintDNA1GeoidRecord(std::ofstream& f_out, const string& station, const double& nValue, const double& meridianDef, const double& verticalDef) +void dna_geoid_interpolation::PrintDNA1GeoidRecord(std::ofstream& f_out, const std::string& station, const double& nValue, const double& meridianDef, const double& verticalDef) { - f_out << setw(41) << left << station << - setw(9) << right << fixed << setprecision(3) << nValue << - setw(19) << right << setprecision(3) << meridianDef << - setw(10) << right << setprecision(3) << verticalDef << endl; + f_out << std::setw(41) << std::left << station << + std::setw(9) << std::right << std::fixed << std::setprecision(3) << nValue << + std::setw(19) << std::right << std::setprecision(3) << meridianDef << + std::setw(10) << std::right << std::setprecision(3) << verticalDef << std::endl; } @@ -925,7 +924,7 @@ void dna_geoid_interpolation::CreateGridIndex(const char* fileName, const char* } } // a new filename or filetype? - else if (!iequals(m_pGridfile->filename, fileName)) + else if (!boost::iequals(m_pGridfile->filename, fileName)) { ClearGridFileMemory(); if ((m_Grid_Success = OpenGridFile(fileName, fileType, @@ -1032,11 +1031,11 @@ void dna_geoid_interpolation::CreateNTv2File(const char* datFile, const n_file_p std::ifstream f_in; try { // open dat file. Throws runtime_error on failure. - file_opener(f_in, datFile, ios::in, ascii, true); + file_opener(f_in, datFile, std::ios::in, ascii, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ClearGridFileMemory(); - stringstream ss; + std::stringstream ss; ss << ErrorString(ERR_INFILE_READ) << "\n" << " " << e.what(); throw NetGeoidException(ss.str(), ERR_INFILE_READ); @@ -1045,20 +1044,20 @@ void dna_geoid_interpolation::CreateNTv2File(const char* datFile, const n_file_p std::ofstream f_out; try { // open binary gsb output. Throws runtime_error on failure. - file_opener(f_out, grid->filename, ios::out | ios::binary, binary, false); + file_opener(f_out, grid->filename, std::ios::out | std::ios::binary, binary, false); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ClearGridFileMemory(); - stringstream ss; + std::stringstream ss; ss << ErrorString(ERR_OUTFILE_WRITE) << "\n" << " " << e.what(); throw NetGeoidException(ss.str(), ERR_OUTFILE_WRITE); } // calculate file length - f_in.seekg(0, ios::end); // set file pointer to end - streamoff lFileLen = f_in.tellg(); - f_in.seekg(0, ios::beg); // reset file pointer to beginning + f_in.seekg(0, std::ios::end); // set file pointer to end + std::streamoff lFileLen = f_in.tellg(); + f_in.seekg(0, std::ios::beg); // reset file pointer to beginning char szLine[MAX_RECORD_LENGTH]; @@ -1071,7 +1070,7 @@ void dna_geoid_interpolation::CreateNTv2File(const char* datFile, const n_file_p f_in.getline(szLine, MAX_RECORD_LENGTH); if (strncmp(szLine, "GEO", 3) == 0) - f_in.seekg(0, ios::beg); // put file pointer back to beginning + f_in.seekg(0, std::ios::beg); // put file pointer back to beginning // AusGeoid file prints upper lat to lower lat. NTv2 file format prints lower lat to upper lat // So, read data to the end of the file to determine grid file limits and record count, then @@ -1079,7 +1078,7 @@ void dna_geoid_interpolation::CreateNTv2File(const char* datFile, const n_file_p double lat, lon, min_lat(90.), max_lat(-90.), min_lon(180.), max_lon(-180.); double init_lat(0.), lat_inc(60.), lon_inc(60.); - cout << endl << "+ Reading contents of WINTER DAT file... "; + std::cout << std::endl << "+ Reading contents of WINTER DAT file... "; m_isReading = true; m_isWriting = false; @@ -1127,7 +1126,7 @@ void dna_geoid_interpolation::CreateNTv2File(const char* datFile, const n_file_p } } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if (!f_in.eof()) throw NetGeoidException(ErrorString(ERR_GRIDFILE_READ) + "\n " + f.what(), ERR_GRIDFILE_READ); } @@ -1151,17 +1150,17 @@ void dna_geoid_interpolation::CreateNTv2File(const char* datFile, const n_file_p if (lExpectedNodes != lNodeRead) { - stringstream ss; - ss << endl << "Expected number of rows is " << lExpectedLatIncrements << endl; - ss << endl << "Expected number of cols is " << lExpectedLonIncrements << endl; - ss << endl << "Expected number of nodes is " << lExpectedNodes << ", but read " << lNodeRead; + std::stringstream ss; + ss << std::endl << "Expected number of rows is " << lExpectedLatIncrements << std::endl; + ss << std::endl << "Expected number of cols is " << lExpectedLonIncrements << std::endl; + ss << std::endl << "Expected number of nodes is " << lExpectedNodes << ", but read " << lNodeRead; throw NetGeoidException(ErrorString(ERR_GRID_PARAMETERS) + ss.str(), ERR_GRID_PARAMETERS); } m_iBytesRead = 0; - cout << "done." << endl << "+ WINTER DAT file structure appears OK." << endl; - cout << "+ Creating NTv2 gsb file... "; + std::cout << "done." << std::endl << "+ WINTER DAT file structure appears OK." << std::endl; + std::cout << "+ Creating NTv2 gsb file... "; geoid_values* ag_data = new geoid_values[lNodeRead]; // Update header record @@ -1174,8 +1173,8 @@ void dna_geoid_interpolation::CreateNTv2File(const char* datFile, const n_file_p // Default option is to create a geoid grid file in seconds. // Change to Radians if required geoidConversion conversionType(geoidConversion::Same); - string shiftType(grid->chGs_type); - if (iequals(trimstr(shiftType), "radians")) + std::string shiftType(grid->chGs_type); + if (boost::iequals(trimstr(shiftType), "radians")) conversionType = SecondsToRadians; // Print default header block and subgrid header block information. @@ -1184,12 +1183,12 @@ void dna_geoid_interpolation::CreateNTv2File(const char* datFile, const n_file_p // put file pointer back to beginning f_in.clear(); - f_in.seekg(0, ios::beg); + f_in.seekg(0, std::ios::beg); // Read the first line and test for a comment line f_in.getline(szLine, MAX_RECORD_LENGTH); if (strncmp(szLine, "GEO", 3) == 0) - f_in.seekg(0, ios::beg); // put file pointer back to beginning + f_in.seekg(0, std::ios::beg); // put file pointer back to beginning // read first line of dat file and scan in values f_in.getline(szLine, MAX_RECORD_LENGTH); @@ -1231,7 +1230,7 @@ void dna_geoid_interpolation::CreateNTv2File(const char* datFile, const n_file_p f_in.getline(szLine, MAX_RECORD_LENGTH); } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if (!f_in.eof()) throw NetGeoidException(ErrorString(ERR_GRIDFILE_READ) + "\n " + f.what(), ERR_GRIDFILE_READ); } @@ -1256,7 +1255,7 @@ void dna_geoid_interpolation::CreateNTv2File(const char* datFile, const n_file_p f_out.close(); f_in.close(); - cout << "done." << endl; + std::cout << "done." << std::endl; } @@ -1278,7 +1277,7 @@ void dna_geoid_interpolation::ExportToAscii(const char *gridFile, const char *gr m_Grid_Success = OpenGridFile(gridFile, gridType, m_pGridfile, false); // A new grid file specified? - if (!iequals(m_pGridfile->filename, gridFile)) + if (!boost::iequals(m_pGridfile->filename, gridFile)) { ClearGridFileMemory(); m_Grid_Success = OpenGridFile(gridFile, gridType, m_pGridfile, false); @@ -1299,9 +1298,9 @@ void dna_geoid_interpolation::ExportToAscii(const char *gridFile, const char *gr // Create geoid grid file. Throws runtime_error on failure. file_opener(f_out, OutputGrid); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ClearGridFileMemory(); - stringstream ss; + std::stringstream ss; ss << ErrorString(ERR_OUTFILE_WRITE) << "\n" << " " << e.what(); throw NetGeoidException(ss.str(), ERR_OUTFILE_WRITE); @@ -1309,18 +1308,18 @@ void dna_geoid_interpolation::ExportToAscii(const char *gridFile, const char *gr *IO_Status = ERR_TRANS_SUCCESS; - string shiftTypeFrom(m_pGridfile->chGs_type); - string shiftTypeTo(shiftType); + std::string shiftTypeFrom(m_pGridfile->chGs_type); + std::string shiftTypeTo(shiftType); shiftTypeFrom = trimstr(shiftTypeFrom); shiftTypeTo = trimstr(shiftTypeTo); geoidConversion conversionType; - if (iequals(shiftTypeFrom, "seconds") && - iequals(shiftTypeTo, "radians")) + if (boost::iequals(shiftTypeFrom, "seconds") && + boost::iequals(shiftTypeTo, "radians")) conversionType = SecondsToRadians; - else if (iequals(shiftTypeFrom, "radians") && - iequals(shiftTypeTo, "seconds")) + else if (boost::iequals(shiftTypeFrom, "radians") && + boost::iequals(shiftTypeTo, "seconds")) conversionType = RadiansToSeconds; else conversionType = Same; @@ -1360,33 +1359,33 @@ void dna_geoid_interpolation::ExportToAscii(const char *gridFile, const char *gr throw NetGeoidException(ErrorString(ERR_READ_BIN_SHIFT, m_pGridfile->filename), ERR_GRIDFILE_READ); // Write N value - f_out << setw(10) << fixed << setprecision(6) << fValue1; + f_out << std::setw(10) << std::fixed << std::setprecision(6) << fValue1; // Write deflections (check type first) switch (conversionType) { case SecondsToRadians: // convert seconds values to radians - f_out << setw(10) << scientific << setprecision(3) << fValue2 / RAD_TO_SEC; - f_out << setw(10) << scientific << setprecision(3) << fValue3 / RAD_TO_SEC; + f_out << std::setw(10) << std::scientific << std::setprecision(3) << fValue2 / RAD_TO_SEC; + f_out << std::setw(10) << std::scientific << std::setprecision(3) << fValue3 / RAD_TO_SEC; break; case RadiansToSeconds: // convert radians values to seconds - f_out << setw(10) << setprecision(6) << fValue2 * RAD_TO_SEC; - f_out << setw(10) << setprecision(6) << fValue3 * RAD_TO_SEC; + f_out << std::setw(10) << std::setprecision(6) << fValue2 * RAD_TO_SEC; + f_out << std::setw(10) << std::setprecision(6) << fValue3 * RAD_TO_SEC; break; case Same: default: // as-is, so cater for precision - if (iequals(shiftTypeTo, "radians")) - f_out << scientific << setprecision(3); - f_out << setw(10) << setprecision(6) << fValue2; - f_out << setw(10) << setprecision(6) << fValue3; + if (boost::iequals(shiftTypeTo, "radians")) + f_out << std::scientific << std::setprecision(3); + f_out << std::setw(10) << std::setprecision(6) << fValue2; + f_out << std::setw(10) << std::setprecision(6) << fValue3; break; } // Write blank value (not used for NTv2 geoid grid files) - f_out << setw(10) << fixed << setprecision(6) << fValue4 << endl; + f_out << std::setw(10) << std::fixed << std::setprecision(6) << fValue4 << std::endl; m_dPercentComplete = (double)(m_pGfileptr.tellg()) / (double)m_pGridfile->iGfilelength * 100.0; } @@ -1402,7 +1401,7 @@ void dna_geoid_interpolation::ExportToAscii(const char *gridFile, const char *gr m_dPercentComplete = 0.0; // print end of file record - f_out << "END " << setw(10) << right << setprecision(2) << scientific << 3.33E+32 << endl; + f_out << "END " << std::setw(10) << std::right << std::setprecision(2) << std::scientific << 3.33E+32 << std::endl; // Finished! f_out.close(); @@ -1427,7 +1426,7 @@ void dna_geoid_interpolation::ExportToBinary(const char *gridFile, const char *g m_Grid_Success = OpenGridFile(gridFile, gridType, m_pGridfile, false); // A new grid file specified? - if (!iequals(m_pGridfile->filename, gridFile)) + if (!boost::iequals(m_pGridfile->filename, gridFile)) { ClearGridFileMemory(); m_Grid_Success = OpenGridFile(gridFile, gridType, m_pGridfile, false); @@ -1446,29 +1445,29 @@ void dna_geoid_interpolation::ExportToBinary(const char *gridFile, const char *g *IO_Status = ERR_OUTFILE_WRITE; try { // open distortion grid file. Throws runtime_error on failure. - file_opener(f_out, OutputGrid, ios::out | ios::binary, binary); + file_opener(f_out, OutputGrid, std::ios::out | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ClearGridFileMemory(); - stringstream ss; + std::stringstream ss; ss << ErrorString(ERR_OUTFILE_WRITE) << "\n" << " " << e.what(); throw NetGeoidException(ss.str(), ERR_OUTFILE_WRITE); } *IO_Status = ERR_TRANS_SUCCESS; - string shiftTypeFrom(m_pGridfile->chGs_type); - string shiftTypeTo(shiftType); + std::string shiftTypeFrom(m_pGridfile->chGs_type); + std::string shiftTypeTo(shiftType); shiftTypeFrom = trimstr(shiftTypeFrom); shiftTypeTo = trimstr(shiftTypeTo); geoidConversion conversionType; - if (iequals(shiftTypeFrom, "seconds") && - iequals(shiftTypeTo, "radians")) + if (boost::iequals(shiftTypeFrom, "seconds") && + boost::iequals(shiftTypeTo, "radians")) conversionType = SecondsToRadians; - else if (iequals(shiftTypeFrom, "radians") && - iequals(shiftTypeTo, "seconds")) + else if (boost::iequals(shiftTypeFrom, "radians") && + boost::iequals(shiftTypeTo, "seconds")) conversionType = RadiansToSeconds; else conversionType = Same; @@ -1737,15 +1736,15 @@ bool dna_geoid_interpolation::IsWithinLowerLongitudeGridInterval(n_gridfileindex int dna_geoid_interpolation::DetermineFileType(const char *cType) { // case insensitive - if (iequals(cType, ASC)) // asc "ASCII" file + if (boost::iequals(cType, ASC)) // asc "ASCII" file return TYPE_ASC; - else if (iequals(cType, GSB)) // gsb "Binary" file + else if (boost::iequals(cType, GSB)) // gsb "Binary" file return TYPE_GSB; - else if (iequals(cType, TXT) || // dat/txt/prn file - iequals(cType, DAT) || // .. - iequals(cType, PRN)) // .. + else if (boost::iequals(cType, TXT) || // dat/txt/prn file + boost::iequals(cType, DAT) || // .. + boost::iequals(cType, PRN)) // .. return TYPE_DAT; - else if (iequals(cType, CSV)) // csv file + else if (boost::iequals(cType, CSV)) // csv file return TYPE_CSV; else return -1; // Unsupported filetype @@ -2243,7 +2242,7 @@ int dna_geoid_interpolation::InterpolateNvalue_BiCubic(geoid_point *dInterpPoint &m_pGridfile->ptrIndex[m_pGridfile->iTheGrid].dLatinc, &(dInterpPoint->gVar.dN_value)); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw NetGeoidException(e.what(), 0); } @@ -2277,7 +2276,7 @@ int dna_geoid_interpolation::InterpolateNvalue_BiCubic(geoid_point *dInterpPoint &(dInterpPoint->gVar.dDefl_meridian)); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw NetGeoidException(e.what(), 0); } @@ -2310,7 +2309,7 @@ int dna_geoid_interpolation::InterpolateNvalue_BiCubic(geoid_point *dInterpPoint &m_pGridfile->ptrIndex[m_pGridfile->iTheGrid].dLatinc, &(dInterpPoint->gVar.dDefl_primev)); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw NetGeoidException(e.what(), 0); } @@ -2445,8 +2444,8 @@ int dna_geoid_interpolation::OpenGridFile(const char *filename, const char *file if (ptheGrid->ptrIndex != NULL) delete [] ptheGrid->ptrIndex; - strcpy(ptheGrid->filename, trimstr(filename).c_str()); - strcpy(ptheGrid->filetype, trimstr(filetype).c_str()); + strcpy(ptheGrid->filename, trimstr(filename).c_str()); + strcpy(ptheGrid->filetype, trimstr(filetype).c_str()); int iLineLength = 4 * sizeof(float); ptheGrid->Can_Format = true; // assume file will be in Canadian format @@ -2458,17 +2457,17 @@ int dna_geoid_interpolation::OpenGridFile(const char *filename, const char *file try { if (gridType == TYPE_ASC) // open in ascii mode and go to end of file - file_opener(pgrid_ifs, ptheGrid->filename, ios::in | ios::ate, ascii, true); + file_opener(pgrid_ifs, ptheGrid->filename, std::ios::in | std::ios::ate, ascii, true); else if (gridType == TYPE_GSB) // open in binary mode and go to end of file - file_opener(pgrid_ifs, ptheGrid->filename, ios::in | ios::binary | ios::ate, binary, true); + file_opener(pgrid_ifs, ptheGrid->filename, std::ios::in | std::ios::binary | std::ios::ate, binary, true); else // unknown file type, so throw an exception throw NetGeoidException(ErrorString(ERR_GRIDFILE_TYPE), ERR_GRIDFILE_TYPE); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ClearGridFileMemory(); - stringstream ss; + std::stringstream ss; ss << ErrorString(ERR_GRIDFILE_READ) << "\n" << " " << e.what(); throw NetGeoidException(ss.str(), ERR_GRIDFILE_READ); @@ -2476,23 +2475,23 @@ int dna_geoid_interpolation::OpenGridFile(const char *filename, const char *file // calculate file length ptheGrid->iGfilelength = (int)pgrid_ifs->tellg(); - pgrid_ifs->seekg(0, ios::beg); + pgrid_ifs->seekg(0, std::ios::beg); char identifier[IDENT_BUF + 1]; - string sBuf; + std::string sBuf; try { // read in all Overview Header information if (gridType == TYPE_ASC) // ascii { getline(*pgrid_ifs, sBuf); - ptheGrid->iH_info = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->iH_info = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); - ptheGrid->iSubH_info = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->iSubH_info = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); - ptheGrid->iNumsubgrids = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->iNumsubgrids = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); strcpy(ptheGrid->chGs_type, trimstr(sBuf.substr(OVERVIEW_RECS)).c_str()); @@ -2507,16 +2506,16 @@ int dna_geoid_interpolation::OpenGridFile(const char *filename, const char *file strcpy(ptheGrid->chSystem_t, trimstr(sBuf.substr(OVERVIEW_RECS)).c_str()); getline(*pgrid_ifs, sBuf); - ptheGrid->daf = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->daf = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); - ptheGrid->dbf = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->dbf = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); - ptheGrid->dat = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->dat = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); - ptheGrid->dbt = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->dbt = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); } else // binary { @@ -2584,8 +2583,8 @@ int dna_geoid_interpolation::OpenGridFile(const char *filename, const char *file // fills the new elements with default values ptheGrid->ptrIndex = new n_gridfileindex[ptheGrid->iNumsubgrids]; - string shiftType(ptheGrid->chGs_type); - if (iequals(trimstr(shiftType), "radians")) + std::string shiftType(ptheGrid->chGs_type); + if (boost::iequals(trimstr(shiftType), "radians")) m_isRadians = true; else m_isRadians = false; @@ -2607,25 +2606,25 @@ int dna_geoid_interpolation::OpenGridFile(const char *filename, const char *file strcpy(ptheGrid->ptrIndex[i].chUpdated, trimstr(sBuf.substr(OVERVIEW_RECS)).c_str()); getline(*pgrid_ifs, sBuf); - ptheGrid->ptrIndex[i].dSlat = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->ptrIndex[i].dSlat = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); - ptheGrid->ptrIndex[i].dNlat = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->ptrIndex[i].dNlat = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); - ptheGrid->ptrIndex[i].dElong = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->ptrIndex[i].dElong = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); - ptheGrid->ptrIndex[i].dWlong = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->ptrIndex[i].dWlong = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); - ptheGrid->ptrIndex[i].dLatinc = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->ptrIndex[i].dLatinc = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); - ptheGrid->ptrIndex[i].dLonginc = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->ptrIndex[i].dLonginc = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); - ptheGrid->ptrIndex[i].lGscount = lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->ptrIndex[i].lGscount = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); // Save ASCII position in grid file for first record of lat & long shifts ptheGrid->ptrIndex[i].iGridPos = (int)pgrid_ifs->tellg(); @@ -2675,7 +2674,7 @@ int dna_geoid_interpolation::OpenGridFile(const char *filename, const char *file ptheGrid->ptrIndex[i].iGridPos = (int)pgrid_ifs->tellg(); // End of file encountered first??? - pgrid_ifs->seekg(ptheGrid->ptrIndex[i].lGscount * iLineLength, ios::cur); + pgrid_ifs->seekg(ptheGrid->ptrIndex[i].lGscount * iLineLength, std::ios::cur); } } @@ -2686,17 +2685,17 @@ int dna_geoid_interpolation::OpenGridFile(const char *filename, const char *file void dna_geoid_interpolation::PrintGridHeaderInfoAscii(std::ofstream* f_out) { // print header block information - *f_out << "NUM_OREC" << setw(8) << right << m_pGridfile->iH_info << endl; // Number of header identifiers (NUM_OREC) - *f_out << "NUM_SREC" << setw(8) << right << m_pGridfile->iSubH_info << endl; // Number of sub-header idents (NUM_SREC) - *f_out << "NUM_FILE" << setw(8) << right << m_pGridfile->iNumsubgrids << endl; // number of subgrids in file (NUM_FILE) - *f_out << "GS_TYPE " << setw(8) << right << m_pGridfile->chGs_type << endl; // grid shift type (GS_TYPE) - *f_out << "VERSION " << setw(8) << right << m_pGridfile->chVersion << endl; // grid file version (VERSION) - *f_out << "SYSTEM_F" << setw(8) << right << m_pGridfile->chSystem_f << endl; // reference system (SYSTEM_F) - *f_out << "SYSTEM_T" << setw(8) << right << m_pGridfile->chSystem_t << endl; // reference system (SYSTEM_T) - *f_out << "MAJOR_F " << setw(15) << right << fixed << setprecision(3) << m_pGridfile->daf << endl; // semi major of from system (MAJOR_F) - *f_out << "MINOR_F " << setw(15) << right << fixed << setprecision(3) << m_pGridfile->dbf << endl; // semi minor of from system (MINOR_F) - *f_out << "MAJOR_T " << setw(15) << right << fixed << setprecision(3) << m_pGridfile->dat << endl; // semi major of to system (MAJOR_T) - *f_out << "MINOR_T " << setw(15) << right << fixed << setprecision(3) << m_pGridfile->dbt << endl; // semi minor of to system (MINOR_T) + *f_out << "NUM_OREC" << std::setw(8) << std::right << m_pGridfile->iH_info << std::endl; // Number of header identifiers (NUM_OREC) + *f_out << "NUM_SREC" << std::setw(8) << std::right << m_pGridfile->iSubH_info << std::endl; // Number of sub-header idents (NUM_SREC) + *f_out << "NUM_FILE" << std::setw(8) << std::right << m_pGridfile->iNumsubgrids << std::endl; // number of subgrids in file (NUM_FILE) + *f_out << "GS_TYPE " << std::setw(8) << std::right << m_pGridfile->chGs_type << std::endl; // grid shift type (GS_TYPE) + *f_out << "VERSION " << std::setw(8) << std::right << m_pGridfile->chVersion << std::endl; // grid file version (VERSION) + *f_out << "SYSTEM_F" << std::setw(8) << std::right << m_pGridfile->chSystem_f << std::endl; // reference system (SYSTEM_F) + *f_out << "SYSTEM_T" << std::setw(8) << std::right << m_pGridfile->chSystem_t << std::endl; // reference system (SYSTEM_T) + *f_out << "MAJOR_F " << std::setw(15) << std::right << std::fixed << std::setprecision(3) << m_pGridfile->daf << std::endl; // semi major of from system (MAJOR_F) + *f_out << "MINOR_F " << std::setw(15) << std::right << std::fixed << std::setprecision(3) << m_pGridfile->dbf << std::endl; // semi minor of from system (MINOR_F) + *f_out << "MAJOR_T " << std::setw(15) << std::right << std::fixed << std::setprecision(3) << m_pGridfile->dat << std::endl; // semi major of to system (MAJOR_T) + *f_out << "MINOR_T " << std::setw(15) << std::right << std::fixed << std::setprecision(3) << m_pGridfile->dbt << std::endl; // semi minor of to system (MINOR_T) } @@ -2747,22 +2746,22 @@ void dna_geoid_interpolation::PrintGridHeaderInfoBinary(std::ofstream* f_out, n_ void dna_geoid_interpolation::PrintSubGridHeaderInfoAscii(std::ofstream* f_out, n_gridfileindex* gfIndex) { // Print header info for sub-grid - *f_out << "SUB_NAME" << setw(8) << right << gfIndex->chSubname << endl; - *f_out << "PARENT " << setw(8) << right << gfIndex->chParent << endl; - *f_out << "CREATED " << setw(8) << right << gfIndex->chCreated << endl; - *f_out << "UPDATED " << setw(8) << right << gfIndex->chUpdated << endl; + *f_out << "SUB_NAME" << std::setw(8) << std::right << gfIndex->chSubname << std::endl; + *f_out << "PARENT " << std::setw(8) << std::right << gfIndex->chParent << std::endl; + *f_out << "CREATED " << std::setw(8) << std::right << gfIndex->chCreated << std::endl; + *f_out << "UPDATED " << std::setw(8) << std::right << gfIndex->chUpdated << std::endl; // Output all values in seconds, irrespective of whether shifts are in radians or not. // NTv2 simply doesn't afford enough width for these fields to provide sufficient // precision for values in radians. - *f_out << "S_LAT " << setw(15) << right << setprecision(6) << gfIndex->dSlat << endl; - *f_out << "N_LAT " << setw(15) << right << setprecision(6) << gfIndex->dNlat << endl; - *f_out << "E_LONG " << setw(15) << right << setprecision(6) << gfIndex->dElong << endl; - *f_out << "W_LONG " << setw(15) << right << setprecision(6) << gfIndex->dWlong << endl; - *f_out << "LAT_INC " << setw(15) << right << setprecision(6) << gfIndex->dLatinc << endl; - *f_out << "LONG_INC" << setw(15) << right << setprecision(6) << gfIndex->dLonginc << endl; - - *f_out << "GS_COUNT" << setw(6) << right << gfIndex->lGscount << endl; + *f_out << "S_LAT " << std::setw(15) << std::right << std::setprecision(6) << gfIndex->dSlat << std::endl; + *f_out << "N_LAT " << std::setw(15) << std::right << std::setprecision(6) << gfIndex->dNlat << std::endl; + *f_out << "E_LONG " << std::setw(15) << std::right << std::setprecision(6) << gfIndex->dElong << std::endl; + *f_out << "W_LONG " << std::setw(15) << std::right << std::setprecision(6) << gfIndex->dWlong << std::endl; + *f_out << "LAT_INC " << std::setw(15) << std::right << std::setprecision(6) << gfIndex->dLatinc << std::endl; + *f_out << "LONG_INC" << std::setw(15) << std::right << std::setprecision(6) << gfIndex->dLonginc << std::endl; + + *f_out << "GS_COUNT" << std::setw(6) << std::right << gfIndex->lGscount << std::endl; } @@ -2868,7 +2867,7 @@ void dna_geoid_interpolation::ScanNodeLocations(char* szLine, double* latitude, } -string dna_geoid_interpolation::ErrorString(const int& error, const string& data) +std::string dna_geoid_interpolation::ErrorString(const int& error, const std::string& data) { switch(error) { @@ -2885,10 +2884,10 @@ string dna_geoid_interpolation::ErrorString(const int& error, const string& data case ERR_GRIDFILE_READ: // 1 return "The specified grid file could not be opened."; case ERR_GRIDFILE_TYPE: // 2 - return string(__BINARY_NAME__) + " cannot read this type of grid file."; + return std::string(__BINARY_NAME__) + " cannot read this type of grid file."; case ERR_GRID_CORRUPT: // 3 case ERR_GRIDFILE_ERROR: // 14 - return string(__BINARY_NAME__) + " found an unrecoverable error in the specified grid file:\n\n " + + return std::string(__BINARY_NAME__) + " found an unrecoverable error in the specified grid file:\n\n " + data + "\n\nIt is likely that this file was downloaded or produced incorrectly.\nPlease select a new grid file."; case ERR_INFILE_READ: // 4 return "Could not read from the specified input file."; @@ -2922,7 +2921,7 @@ string dna_geoid_interpolation::ErrorString(const int& error, const string& data } } -string dna_geoid_interpolation::ErrorCaption(const int& error) +std::string dna_geoid_interpolation::ErrorCaption(const int& error) { switch(error) { diff --git a/dynadjust/dynadjust/dnageoid/dnageoid.hpp b/dynadjust/dynadjust/dnageoid/dnageoid.hpp index 91fcc786..ae5a938f 100644 --- a/dynadjust/dynadjust/dnageoid/dnageoid.hpp +++ b/dynadjust/dynadjust/dnageoid/dnageoid.hpp @@ -79,10 +79,6 @@ #include #include -using namespace std; - -using namespace boost::filesystem; - using namespace dynadjust::measurements; using namespace dynadjust::exception; using namespace dynadjust::iostreams; @@ -150,7 +146,7 @@ class dna_geoid_interpolation { const int& intEllipsoidtoOrtho, const int& intDmsFlag, bool exportDnaGeoidFile, const char* geoFile=NULL); - void PopulateBinaryStationFile(const string& bstnFile, const int& method, + void PopulateBinaryStationFile(const std::string& bstnFile, const int& method, bool convertHeights, bool exportDnaGeoidFile, const char* geoFile=NULL); @@ -190,12 +186,12 @@ class dna_geoid_interpolation { inline int PointsInterpolated() const { return m_pointsInterpolated; } inline int PointsNotInterpolated() const { return m_pointsNotInterpolated; } - string ErrorString(const int& error, const string& data=""); - string ErrorCaption(const int& error); + std::string ErrorString(const int& error, const std::string& data=""); + std::string ErrorCaption(const int& error); - inline void SetInputCoordinates(const string& inputCoordinates) { m_inputCoordinates = inputCoordinates; } + inline void SetInputCoordinates(const std::string& inputCoordinates) { m_inputCoordinates = inputCoordinates; } - string ReturnBadStationRecords(); + std::string ReturnBadStationRecords(); private: @@ -227,17 +223,17 @@ class dna_geoid_interpolation { bool ReadAsciiShifts(geoid_values* pNShifts[], int iNodeIndex, long lNode); bool ReadBinaryShifts(geoid_values* pNShifts[], int iNodeIndex, long lNode); - void LoadBinaryStationFile(const string& bstnfileName); - void WriteBinaryStationFile(const string& bstnfileName); + void LoadBinaryStationFile(const std::string& bstnfileName); + void WriteBinaryStationFile(const std::string& bstnfileName); void PopulateStationRecords(const int& method, bool convertHeights); - void WriteDNA1GeoidFile(const string& geofileName); - void PrintDNA1GeoidRecord(std::ofstream& f_out, const string& station, const double& nValue, const double& meridianDef, const double& verticalDef); + void WriteDNA1GeoidFile(const std::string& geofileName); + void PrintDNA1GeoidRecord(std::ofstream& f_out, const std::string& station, const double& nValue, const double& meridianDef, const double& verticalDef); void ProcessCsvFile(std::ifstream* f_in, std::ofstream* f_out, std::ofstream* f_dnageo, const int& method, const int& intEllipsoidtoOrtho, const int& intDmsFlag); void ProcessDatFile(std::ifstream* f_in, std::ofstream* f_out, std::ofstream* f_dnageo, const int& method, const int& intEllipsoidtoOrtho, const int& intDmsFlag); - //void OpenOutFile(std::ofstream& f_out, const string& fileOut, ios::open_mode mode, const string callingFunc); + //void OpenOutFile(std::ofstream& f_out, const std::string& fileOut, std::ios::open_mode mode, const std::string callingFunc); bool m_isReading; bool m_isWriting; @@ -262,7 +258,7 @@ class dna_geoid_interpolation { bool m_fileMode; - string m_inputCoordinates; + std::string m_inputCoordinates; bool m_isRadians; diff --git a/dynadjust/dynadjust/dnageoidint/FileProc.cpp b/dynadjust/dynadjust/dnageoidint/FileProc.cpp index e9ca512f..ebaeaf1f 100644 --- a/dynadjust/dynadjust/dnageoidint/FileProc.cpp +++ b/dynadjust/dynadjust/dnageoidint/FileProc.cpp @@ -50,7 +50,7 @@ CFileProc::~CFileProc() ClearFileArrayMemory(); } -void CFileProc::BuildFileArray(const char* filedir, const vector& filetypes, const int& no_filetypes) +void CFileProc::BuildFileArray(const char* filedir, const std::vector& filetypes, const int& no_filetypes) { char chFilter[_MAX_PATH]; struct _finddata_t _fFile; diff --git a/dynadjust/dynadjust/dnageoidint/FileProc.h b/dynadjust/dynadjust/dnageoidint/FileProc.h index 76e6c422..d1e7f8b5 100644 --- a/dynadjust/dynadjust/dnageoidint/FileProc.h +++ b/dynadjust/dynadjust/dnageoidint/FileProc.h @@ -15,8 +15,6 @@ struct _fileindex { int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData); -using namespace std; - #define PATH_ERROR -1 #define PATH_NOT_FOUND 0 #define PATH_IS_FILE 1 diff --git a/dynadjust/dynadjust/dnageoidint/dnageoidintDlg.cpp b/dynadjust/dynadjust/dnageoidint/dnageoidintDlg.cpp index 607c5d10..9a0e6d17 100644 --- a/dynadjust/dynadjust/dnageoidint/dnageoidintDlg.cpp +++ b/dynadjust/dynadjust/dnageoidint/dnageoidintDlg.cpp @@ -368,8 +368,8 @@ void CdnageoidintDlg::CreateGridIndex() char version[21]; m_dnaGeoid.ReportGridVersion(version); - stringstream ss; - ss << "Opened Grid file " << left << tUserSettings.GridFile << ", Version " << version << endl << endl; + std::stringstream ss; + ss << "Opened Grid file " << std::left << tUserSettings.GridFile << ", Version " << version << std::endl << std::endl; PrintLogFileMessage(ss.str().c_str()); } catch (const NetGeoidException& e) { @@ -394,15 +394,15 @@ void CdnageoidintDlg::CreateGridIndex() int CdnageoidintDlg::DetermineFileType(const char *cType) { // case insensitive - if (iequals(cType, ASC)) // asc "ASCII" file + if (boost::iequals(cType, ASC)) // asc "ASCII" file return TYPE_ASC; - else if (iequals(cType, GSB)) // gsb "Binary" file + else if (boost::iequals(cType, GSB)) // gsb "Binary" file return TYPE_GSB; - else if (iequals(cType, TXT) || // dat/txt/prn file - iequals(cType, DAT) || // .. - iequals(cType, PRN)) // .. + else if (boost::iequals(cType, TXT) || // dat/txt/prn file + boost::iequals(cType, DAT) || // .. + boost::iequals(cType, PRN)) // .. return TYPE_DAT; - else if (iequals(cType, CSV)) // csv file + else if (boost::iequals(cType, CSV)) // csv file return TYPE_CSV; else return -1; // Unsupported filetype @@ -604,7 +604,7 @@ void CdnageoidintDlg::OnTransform() strcpy(chDirectory, m_strDataFile); - vector file_type_array; + std::vector file_type_array; file_type_array.push_back("dat"); file_type_array.push_back("csv"); @@ -838,8 +838,8 @@ LRESULT CdnageoidintDlg::OnInterpolateInputCoords(WPARAM wParam, LPARAM lParam) // agCoord_.cVar.dLongitude = DmintoDeg(m_InputCoordDlg->GetLongitudeInput()); // break; case DDEG: - agCoord_.cVar.dLatitude = m_InputCoordDlg->GetLatitudeInput(); // S 12° 14' 55.92960" - agCoord_.cVar.dLongitude = m_InputCoordDlg->GetLongitudeInput(); // E 142° 03' 36.18000" + agCoord_.cVar.dLatitude = m_InputCoordDlg->GetLatitudeInput(); // S 12� 14' 55.92960" + agCoord_.cVar.dLongitude = m_InputCoordDlg->GetLongitudeInput(); // E 142� 03' 36.18000" break; } @@ -855,8 +855,8 @@ LRESULT CdnageoidintDlg::OnInterpolateInputCoords(WPARAM wParam, LPARAM lParam) agCoord_.cVar.IO_Status == ERR_PT_OUTSIDE_GRID) { // 13: Point is outside limits of the grid - stringstream ss; - ss << ">> " << fixed << setprecision(9) << agCoord_.cVar.dLatitude << ", " << fixed << setprecision(9) << agCoord_.cVar.dLongitude << endl << endl; + std::stringstream ss; + ss << ">> " << std::fixed << std::setprecision(9) << agCoord_.cVar.dLatitude << ", " << std::fixed << std::setprecision(9) << agCoord_.cVar.dLongitude << std::endl << std::endl; PrintLogFileMessage(ss.str().c_str()); } @@ -951,7 +951,7 @@ void CdnageoidintDlg::PrintLogFileMessage(const char* szMessage) void CdnageoidintDlg::DeleteLogFile(void) { CFileProc fileProc; - vector file_type_array; + std::vector file_type_array; file_type_array.push_back("log"); char chDirectory[MAX_PATH]; diff --git a/dynadjust/dynadjust/dnageoidint/precompile.h b/dynadjust/dynadjust/dnageoidint/precompile.h index 2e346d93..c8d51116 100644 --- a/dynadjust/dynadjust/dnageoidint/precompile.h +++ b/dynadjust/dynadjust/dnageoidint/precompile.h @@ -47,12 +47,6 @@ #include -using namespace std; - - - - - #ifdef _UNICODE #if defined _M_IX86 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") diff --git a/dynadjust/dynadjust/dnageoidint/stdafx.h b/dynadjust/dynadjust/dnageoidint/stdafx.h index defe7c3c..1a992b1e 100644 --- a/dynadjust/dynadjust/dnageoidint/stdafx.h +++ b/dynadjust/dynadjust/dnageoidint/stdafx.h @@ -45,12 +45,6 @@ #include -using namespace std; - - - - - #ifdef _UNICODE #if defined _M_IX86 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") diff --git a/dynadjust/dynadjust/dnageoidwrapper/dnageoidwrapper.cpp b/dynadjust/dynadjust/dnageoidwrapper/dnageoidwrapper.cpp index 79a69b09..9c6fc464 100644 --- a/dynadjust/dynadjust/dnageoidwrapper/dnageoidwrapper.cpp +++ b/dynadjust/dynadjust/dnageoidwrapper/dnageoidwrapper.cpp @@ -30,16 +30,16 @@ bool CreateNTv2Grid(dna_geoid_interpolation* g, const char* dat_gridfilePath, co // geoid -d ausgeoid09_gda94_v1.01_clip_1x1.dat -c -g ausgeoid_clip_1.0.1.0.gsb --grid-shift radians --grid-version 1.0.1.0 --system-fr ___GDA94 --system-to ___AHD71 --sub-grid-n 1D-grid --creation 21.04.2021 --update 22.04.2021 // - cout << "+ Creating NTv2 geoid grid file from WINTER DAT file format..." << endl; + std::cout << "+ Creating NTv2 geoid grid file from WINTER DAT file format..." << std::endl; try { g->CreateNTv2File(dat_gridfilePath, grid); } catch (const NetGeoidException& e) { - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; return false; } - cout << endl; + std::cout << std::endl; // Open the new grid file and print its properties if (!reportGridProperties(g, grid->filename, grid->filetype)) @@ -55,22 +55,22 @@ bool ExportNTv2GridToAscii(dna_geoid_interpolation* g, const char* dat_gridfileP // geoid -g ausgeoid_clip_1.0.1.0.gsb --grid-shift radians --export-ntv2-asc // - path asciiGridFile(dat_gridfilePath); - string outfile = asciiGridFile.filename().string() + "." + exportfileType; + boost::filesystem::path asciiGridFile(dat_gridfilePath); + std::string outfile = asciiGridFile.filename().string() + "." + exportfileType; int ioStatus; - cout << endl << "+ Exporting NTv2 geoid grid file to " << leafStr(outfile) << "... "; + std::cout << std::endl << "+ Exporting NTv2 geoid grid file to " << leafStr(outfile) << "... "; try { g->ExportToAscii(dat_gridfilePath, gridfileType, gridshiftType, outfile.c_str(), &ioStatus); } catch (const NetGeoidException& e) { - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; return false; } - cout << "done." << endl << endl; + std::cout << "done." << std::endl << std::endl; // Open the new grid file and print its properties if (!reportGridProperties(g, outfile.c_str(), exportfileType)) @@ -83,22 +83,22 @@ bool ExportNTv2GridToAscii(dna_geoid_interpolation* g, const char* dat_gridfileP bool ExportNTv2GridToBinary(dna_geoid_interpolation* g, const char* dat_gridfilePath, const char* gridfileType, const char* gridshiftType, const char* exportfileType) { - path asciiGridFile(dat_gridfilePath); - string outfile = asciiGridFile.filename().string() + "." + exportfileType; + boost::filesystem::path asciiGridFile(dat_gridfilePath); + std::string outfile = asciiGridFile.filename().string() + "." + exportfileType; int ioStatus; - cout << endl << "+ Exporting geoid file to " << leafStr(outfile) << "... "; + std::cout << std::endl << "+ Exporting geoid file to " << leafStr(outfile) << "... "; try { g->ExportToBinary(dat_gridfilePath, gridfileType, gridshiftType, outfile.c_str(), &ioStatus); } catch (const NetGeoidException& e) { - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; return false; } - cout << "done." << endl << endl; + std::cout << "done." << std::endl << std::endl; // Open the grid file and print its properties if (!reportGridProperties(g, outfile.c_str(), exportfileType)) @@ -109,64 +109,64 @@ bool ExportNTv2GridToBinary(dna_geoid_interpolation* g, const char* dat_gridfile void ReturnBadStationRecords(dna_geoid_interpolation* g, project_settings& p) { - string records, filename(p.g.network_name); - string badpointsPath(formPath(p.g.output_folder, filename, "int")); - stringstream ss; + std::string records, filename(p.g.network_name); + std::string badpointsPath(formPath(p.g.output_folder, filename, "int")); + std::stringstream ss; std::ofstream badpoints_log; - ss << "- Error: Could not open " << filename << " for writing." << endl; + ss << "- Error: Could not open " << filename << " for writing." << std::endl; try { // Create dynadjust log file. Throws runtime_error on failure. file_opener(badpoints_log, badpointsPath); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } // Print formatted header print_file_header(badpoints_log, "DYNADJUST GEOID INTERPOLATION LOG FILE"); - badpoints_log << setw(PRINT_VAR_PAD) << left << "File name:" << badpointsPath << endl << endl; + badpoints_log << std::setw(PRINT_VAR_PAD) << std::left << "File name:" << badpointsPath << std::endl << std::endl; - badpoints_log << setw(PRINT_VAR_PAD) << left << "Command line arguments: "; - badpoints_log << p.n.command_line_arguments << endl << endl; - - badpoints_log << setw(PRINT_VAR_PAD) << left << "Network name:" << p.g.network_name << endl; - badpoints_log << setw(PRINT_VAR_PAD) << left << "Stations file:" << system_complete(p.n.bst_file).string() << endl; - badpoints_log << setw(PRINT_VAR_PAD) << left << "Geoid model: " << system_complete(p.n.ntv2_geoid_file).string() << endl << endl; - badpoints_log << setw(PRINT_VAR_PAD) << left << "Stations not interpolated:" << g->PointsNotInterpolated() << endl; - badpoints_log << OUTPUTLINE << endl << endl; + badpoints_log << std::setw(PRINT_VAR_PAD) << std::left << "Command line arguments: "; + badpoints_log << p.n.command_line_arguments << std::endl << std::endl; + + badpoints_log << std::setw(PRINT_VAR_PAD) << std::left << "Network name:" << p.g.network_name << std::endl; + badpoints_log << std::setw(PRINT_VAR_PAD) << std::left << "Stations file:" << boost::filesystem::system_complete(p.n.bst_file).string() << std::endl; + badpoints_log << std::setw(PRINT_VAR_PAD) << std::left << "Geoid model: " << boost::filesystem::system_complete(p.n.ntv2_geoid_file).string() << std::endl << std::endl; + badpoints_log << std::setw(PRINT_VAR_PAD) << std::left << "Stations not interpolated:" << g->PointsNotInterpolated() << std::endl; + badpoints_log << OUTPUTLINE << std::endl << std::endl; records = g->ReturnBadStationRecords(); - badpoints_log << records << endl; + badpoints_log << records << std::endl; if (p.g.verbose > 1) { - string data(""); - badpoints_log << endl << endl << - "DYNADJUST GEOID INTERPOLARION ERROR CODES" << endl << endl << - setw(PAD) << "Code" << "Description (short and long)" << endl << - "------------------------------------------------------" << endl; + std::string data(""); + badpoints_log << std::endl << std::endl << + "DYNADJUST GEOID INTERPOLARION ERROR CODES" << std::endl << std::endl << + std::setw(PAD) << "Code" << "Description (short and long)" << std::endl << + "------------------------------------------------------" << std::endl; for (int i=ERR_AUS_BINARY; i<=ERR_INTERPOLATION_TYPE; ++i) { badpoints_log << - setw(PAD) << i << - setw(ZONE) << "Short: " << g->ErrorCaption(i) << endl << - setw(PAD) << " " << - setw(ZONE) << "Long: " << g->ErrorString(i, data) << endl; + std::setw(PAD) << i << + std::setw(ZONE) << "Short: " << g->ErrorCaption(i) << std::endl << + std::setw(PAD) << " " << + std::setw(ZONE) << "Long: " << g->ErrorString(i, data) << std::endl; } } badpoints_log.close(); - cout << endl << " See " << badpointsPath << " to view the list of stations for which an" << endl << - " N-value could not be interpolated." << endl; + std::cout << std::endl << " See " << badpointsPath << " to view the list of stations for which an" << std::endl << + " N-value could not be interpolated." << std::endl; } @@ -175,17 +175,17 @@ void ReturnBadStationRecords(dna_geoid_interpolation* g, project_settings& p) bool createGridIndex(dna_geoid_interpolation* g, const char* gridfilePath, const char* gridfileType, const int& quiet) { if (!quiet) - cout << "+ Opening grid file... "; + std::cout << "+ Opening grid file... "; try { g->CreateGridIndex(gridfilePath, gridfileType); } catch (const NetGeoidException& e) { - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; return false; } if (!quiet) - cout << "done." << endl; + std::cout << "done." << std::endl; return true; } @@ -199,72 +199,72 @@ bool reportGridProperties(dna_geoid_interpolation* g, const char* gridfilePath, g->ReportGridProperties(gridfilePath, gridfileType, &grid_properties); } catch (const NetGeoidException& e) { - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; return false; } bool isRadians(false); - string shiftType(grid_properties.chGs_type); - if (iequals(trimstr(shiftType), "radians")) + std::string shiftType(grid_properties.chGs_type); + if (boost::iequals(trimstr(shiftType), "radians")) isRadians = true; - string formattedLimit; - - cout << "+ Grid properties for " << gridfilePath << ":" << endl; - cout << " - GS_TYPE = " << grid_properties.chGs_type << endl; // grid shift type (GS_TYPE) - cout << " - VERSION = " << grid_properties.chVersion << endl; // grid file version (VERSION) - cout << " - SYSTEM_F = " << grid_properties.chSystem_f << endl; // reference system (SYSTEM_F) - cout << " - SYSTEM_T = " << grid_properties.chSystem_t << endl; // reference system (SYSTEM_T) - cout << " - MAJOR_F = " << setprecision(3) << fixed << grid_properties.daf << endl; // semi major of from system (MAJOR_F) - cout << " - MAJOR_T = " << setprecision(3) << fixed << grid_properties.dat << endl; // semi major of to system (MAJOR_T) - cout << " - MINOR_F = " << setprecision(3) << fixed << grid_properties.dbf << endl; // semi minor of from system (MINOR_F) - cout << " - MINOR_T = " << setprecision(3) << fixed << grid_properties.dbt << endl; // semi minor of to system (MINOR_T) - cout << " - NUM_OREC = " << grid_properties.iH_info << endl; // Number of header identifiers (NUM_OREC) - cout << " - NUM_SREC = " << grid_properties.iSubH_info << endl; // Number of sub-header idents (NUM_SREC) - cout << " - NUM_FILE = " << grid_properties.iNumsubgrids << endl; // number of subgrids in file (NUM_FILE) + std::string formattedLimit; + + std::cout << "+ Grid properties for " << gridfilePath << ":" << std::endl; + std::cout << " - GS_TYPE = " << grid_properties.chGs_type << std::endl; // grid shift type (GS_TYPE) + std::cout << " - VERSION = " << grid_properties.chVersion << std::endl; // grid file version (VERSION) + std::cout << " - SYSTEM_F = " << grid_properties.chSystem_f << std::endl; // reference system (SYSTEM_F) + std::cout << " - SYSTEM_T = " << grid_properties.chSystem_t << std::endl; // reference system (SYSTEM_T) + std::cout << " - MAJOR_F = " << std::setprecision(3) << std::fixed << grid_properties.daf << std::endl; // semi major of from system (MAJOR_F) + std::cout << " - MAJOR_T = " << std::setprecision(3) << std::fixed << grid_properties.dat << std::endl; // semi major of to system (MAJOR_T) + std::cout << " - MINOR_F = " << std::setprecision(3) << std::fixed << grid_properties.dbf << std::endl; // semi minor of from system (MINOR_F) + std::cout << " - MINOR_T = " << std::setprecision(3) << std::fixed << grid_properties.dbt << std::endl; // semi minor of to system (MINOR_T) + std::cout << " - NUM_OREC = " << grid_properties.iH_info << std::endl; // Number of header identifiers (NUM_OREC) + std::cout << " - NUM_SREC = " << grid_properties.iSubH_info << std::endl; // Number of sub-header idents (NUM_SREC) + std::cout << " - NUM_FILE = " << grid_properties.iNumsubgrids << std::endl; // number of subgrids in file (NUM_FILE) for (int i=0; icVar.IO_Status != ERR_TRANS_SUCCESS) return false; - cout << "+ Interpolation results for "; - cout << inputLatitude << ", " << inputLongitude; + std::cout << "+ Interpolation results for "; + std::cout << inputLatitude << ", " << inputLongitude; if (coordinate_format == DMS) - //cout << fixed << setprecision(6) << DegtoDms(apInterpolant->cVar.dLatitude) << ", " << DegtoDms(apInterpolant->cVar.dLongitude) << " (ddd.mmssss):" << endl; - cout << " (ddd.mmssss):" << endl; + //cout << std::fixed << std::setprecision(6) << DegtoDms(apInterpolant->cVar.dLatitude) << ", " << DegtoDms(apInterpolant->cVar.dLongitude) << " (ddd.mmssss):" << std::endl; + std::cout << " (ddd.mmssss):" << std::endl; else - //cout << fixed << setprecision(6) << apInterpolant->cVar.dLatitude << ", " << apInterpolant->cVar.dLongitude << " (ddd.dddddd):" << endl; - cout << " (ddd.dddddd):" << endl; + //cout << std::fixed << std::setprecision(6) << apInterpolant->cVar.dLatitude << ", " << apInterpolant->cVar.dLongitude << " (ddd.dddddd):" << std::endl; + std::cout << " (ddd.dddddd):" << std::endl; - cout << endl; - - cout << " N value = " << setw(6) << - right << setprecision(3) << apInterpolant->gVar.dN_value << " metres" << endl; // N value - cout << " Deflections:" << endl; - cout << " - Prime meridian = " << setw(6) << - right << fixed << setprecision(2) << apInterpolant->gVar.dDefl_meridian << " seconds" << endl; // N value - cout << " - Prime vertical = " << setw(6) << - right << apInterpolant->gVar.dDefl_primev << " seconds" << endl; // N value - cout << endl; + std::cout << std::endl; + + std::cout << " N value = " << std::setw(6) << + std::right << std::setprecision(3) << apInterpolant->gVar.dN_value << " metres" << std::endl; // N value + std::cout << " Deflections:" << std::endl; + std::cout << " - Prime meridian = " << std::setw(6) << + std::right << std::fixed << std::setprecision(2) << apInterpolant->gVar.dDefl_meridian << " seconds" << std::endl; // N value + std::cout << " - Prime vertical = " << std::setw(6) << + std::right << apInterpolant->gVar.dDefl_primev << " seconds" << std::endl; // N value + std::cout << std::endl; return true; } // InterpolateGridPoint @@ -306,9 +306,9 @@ bool InterpolateGridPoint(dna_geoid_interpolation* g, geoid_point* apInterpolant bool InterpolateGridPointFile(dna_geoid_interpolation* g, const char* inputfilePath, const int& method, const int EllipsoidtoOrtho, const int& coordinate_format, - bool exportDnaGeoidFile, const char* dnageofilePath, string& outputfilePath) + bool exportDnaGeoidFile, const char* dnageofilePath, std::string& outputfilePath) { - path inputFile(inputfilePath); + boost::filesystem::path inputFile(inputfilePath); if (inputFile.has_extension()) outputfilePath = inputFile.stem().string() + "_out" + inputFile.extension().string(); else @@ -326,7 +326,7 @@ bool InterpolateGridPointFile(dna_geoid_interpolation* g, const char* inputfileP exportDnaGeoidFile, dnageofilePath); } catch (const NetGeoidException& e) { - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; return false; } @@ -335,7 +335,7 @@ bool InterpolateGridPointFile(dna_geoid_interpolation* g, const char* inputfileP } // InterpolateGridPointFile -bool InterpolateGridBinaryStationFile(dna_geoid_interpolation* g, const string& bstnfilePath, +bool InterpolateGridBinaryStationFile(dna_geoid_interpolation* g, const std::string& bstnfilePath, const int& method, bool convertHeights, bool exportDnaGeoidFile, const char* dnageofilePath) { @@ -344,7 +344,7 @@ bool InterpolateGridBinaryStationFile(dna_geoid_interpolation* g, const string& exportDnaGeoidFile, dnageofilePath); } catch (const NetGeoidException& e) { - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; return false; } @@ -353,16 +353,16 @@ bool InterpolateGridBinaryStationFile(dna_geoid_interpolation* g, const string& } // InterpolateGridBinaryStationFile -string GetFileType(const string inputfilePath) +std::string GetFileType(const std::string inputfilePath) { - path inputFile(inputfilePath); + boost::filesystem::path inputFile(inputfilePath); if (inputFile.has_extension()) return inputFile.extension().string(); else return ""; } -int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& vm, project_settings& p) +int ParseCommandLineOptions(const int& argc, char* argv[], const boost::program_options::variables_map& vm, project_settings& p) { // capture command line arguments for (int cmd_arg(0); cmd_arg(p.g.output_folder, p.g.network_name, "dnaproj"); + p.g.project_file = formPath(p.g.output_folder, p.g.network_name, "dnaproj"); // define bst file name - p.n.bst_file = formPath(p.g.input_folder, p.g.network_name, "bst"); + p.n.bst_file = formPath(p.g.input_folder, p.g.network_name, "bst"); p.n.file_mode = 1; - if (!exists(p.n.bst_file)) + if (!boost::filesystem::exists(p.n.bst_file)) { // Look for it in the input folder - p.n.bst_file = formPath(p.g.input_folder, leafStr(p.n.bst_file)); + p.n.bst_file = formPath(p.g.input_folder, leafStr(p.n.bst_file)); - if (!exists(p.n.bst_file)) + if (!boost::filesystem::exists(p.n.bst_file)) { - cout << endl << "- Error: "; - cout << "Binary station file " << p.n.bst_file << " does not exist." << endl << endl; + std::cout << std::endl << "- Error: "; + std::cout << "Binary station file " << p.n.bst_file << " does not exist." << std::endl << std::endl; return EXIT_FAILURE; } } @@ -472,15 +472,15 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& // Geoid DAT grid file file location (input) if (vm.count(DAT_FILEPATH)) { - if (!exists(p.n.rdat_geoid_file)) + if (!boost::filesystem::exists(p.n.rdat_geoid_file)) { // Look for it in the input folder - p.n.rdat_geoid_file = formPath(p.g.input_folder, leafStr(p.n.rdat_geoid_file)); + p.n.rdat_geoid_file = formPath(p.g.input_folder, leafStr(p.n.rdat_geoid_file)); - if (!exists(p.n.rdat_geoid_file)) + if (!boost::filesystem::exists(p.n.rdat_geoid_file)) { - cout << endl << "- Error: "; - cout << "WINTER DAT grid file " << p.n.rdat_geoid_file << " does not exist." << endl << endl; + std::cout << std::endl << "- Error: "; + std::cout << "WINTER DAT grid file " << p.n.rdat_geoid_file << " does not exist." << std::endl << std::endl; return EXIT_FAILURE; } } @@ -492,15 +492,15 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& p.n.file_mode = 1; // Geoid DAT grid file file location (input) - if (!exists(p.n.input_file)) + if (!boost::filesystem::exists(p.n.input_file)) { // Look for it in the input folder - p.n.input_file = formPath(p.g.input_folder, leafStr(p.n.input_file)); + p.n.input_file = formPath(p.g.input_folder, leafStr(p.n.input_file)); - if (!exists(p.n.input_file)) + if (!boost::filesystem::exists(p.n.input_file)) { - cout << endl << "- Error: "; - cout << "Input coordinates text file " << leafStr(p.n.input_file) << " does not exist." << endl << endl; + std::cout << std::endl << "- Error: "; + std::cout << "Input coordinates text file " << leafStr(p.n.input_file) << " does not exist." << std::endl << std::endl; return EXIT_FAILURE; } } @@ -509,7 +509,7 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (vm.count(EXPORT_GEO_FILE)) { if (vm.count(NETWORK_NAME)) - p.n.geo_file = formPath(p.g.output_folder, p.g.network_name, "geo"); // dna geoid file + p.n.geo_file = formPath(p.g.output_folder, p.g.network_name, "geo"); // dna geoid file p.n.export_dna_geo_file = 1; } @@ -528,20 +528,20 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& int main(int argc, char* argv[]) { - variables_map vm; - positional_options_description positional_options; + boost::program_options::variables_map vm; + boost::program_options::positional_options_description positional_options; - options_description standard_options("+ " + string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description ntv2_options("+ " + string(GEOID_MODULE_NTV2), PROGRAM_OPTIONS_LINE_LENGTH); - options_description interpolate_options("+ " + string(GEOID_MODULE_INTERPOLATE), PROGRAM_OPTIONS_LINE_LENGTH); - options_description interactive_options("+ " + string(GEOID_MODULE_INTERACTIVE), PROGRAM_OPTIONS_LINE_LENGTH); - options_description file_interpolate_options("+ " + string(GEOID_MODULE_FILE), PROGRAM_OPTIONS_LINE_LENGTH); - options_description export_options("+ " + string(ALL_MODULE_EXPORT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description generic_options("+ " + string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); - - string cmd_line_usage("+ "); + boost::program_options::options_description standard_options("+ " + std::string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description ntv2_options("+ " + std::string(GEOID_MODULE_NTV2), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description interpolate_options("+ " + std::string(GEOID_MODULE_INTERPOLATE), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description interactive_options("+ " + std::string(GEOID_MODULE_INTERACTIVE), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description file_interpolate_options("+ " + std::string(GEOID_MODULE_FILE), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description export_options("+ " + std::string(ALL_MODULE_EXPORT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description generic_options("+ " + std::string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); + + std::string cmd_line_usage("+ "); cmd_line_usage.append(__BINARY_NAME__).append(" usage: ").append(__BINARY_NAME__).append(" [options]"); - options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); n_file_par ntv2; ntv2.ptrIndex = new n_gridfileindex[1]; @@ -549,10 +549,10 @@ int main(int argc, char* argv[]) project_settings p; - string cmd_line_banner, gs_type("seconds"), version("1.0.0.0"), system_f("GDA94 "), system_t("AHD_1971"); - string subgridname("AUSGEOID"), parent(""), created(""), updated(""); + std::string cmd_line_banner, gs_type("seconds"), version("1.0.0.0"), system_f("GDA94 "), system_t("AHD_1971"); + std::string subgridname("AUSGEOID"), parent(""), created(""), updated(""); - string inputLatitude, inputLongitude; + std::string inputLatitude, inputLongitude; fileproc_help_header(&cmd_line_banner); p.g.project_file = ""; @@ -561,30 +561,30 @@ int main(int argc, char* argv[]) // Declare a group of options that will be // allowed only on command line standard_options.add_options() - (PROJECT_FILE_P, value(&p.g.project_file), + (PROJECT_FILE_P, boost::program_options::value(&p.g.project_file), "Project file name. Full path to project file. If none specified, a new file is created using input-folder and network-name.") - (NETWORK_NAME_N, value(&p.g.network_name), - string("Network name. If [" + string(NETWORK_NAME) + "].bst exists, all records within the binary station file will be populated with N value and deflections of the vertical.").c_str()) - (INPUT_FOLDER_I, value(&p.g.input_folder), + (NETWORK_NAME_N, boost::program_options::value(&p.g.network_name), + std::string("Network name. If [" + std::string(NETWORK_NAME) + "].bst exists, all records within the binary station file will be populated with N value and deflections of the vertical.").c_str()) + (INPUT_FOLDER_I, boost::program_options::value(&p.g.input_folder), "Path containing all input files.") - (OUTPUT_FOLDER_O, value(&p.g.output_folder), // default is ./, + (OUTPUT_FOLDER_O, boost::program_options::value(&p.g.output_folder), // default is ./, "Path for all output files.") ; interpolate_options.add_options() (INTERACTIVE_E, "Interpolate geoid information using coordinates provided on the command line.") - (INPUT_FILE_T, value(&p.n.input_file), + (INPUT_FILE_T, boost::program_options::value(&p.n.input_file), "Interpolate geoid information using coordinates contained in a text file. " "arg is the path of the input text file. " "The supported text file formats include formatted text (*.txt) and comma separated values (*.csv) files. " "Refer to the User's Guide for file format information.") - (METHOD_M, value(&p.n.interpolation_method), + (METHOD_M, boost::program_options::value(&p.n.interpolation_method), "Interpolation method.\n 0 Bi-linear\n 1 Bi-cubic (default)") (CONVERT_BST_HT, "DEPRECATED. If a user-supplied height in the binary file is orthometric, the height will be converted to ellipsoidal automatically.") (DDEG_FORMAT, "Specify input coordinates in decimal degrees (dd.dddddd). Default is degrees, minutes and seconds (dd.mmssss).") (CREATE_NTV2_C, "Create NTv2 grid file from standard DAT file.") - (NTV2_FILEPATH_G, value(&p.n.ntv2_geoid_file), "Full file path of the NTv2 grid file.") + (NTV2_FILEPATH_G, boost::program_options::value(&p.n.ntv2_geoid_file), "Full file path of the NTv2 grid file.") (SUMMARY_U, "Print a summary of the grid file.") ; @@ -592,41 +592,41 @@ int main(int argc, char* argv[]) // allowed both on command line and in // config file ntv2_options.add_options() - (DAT_FILEPATH_D, value(&p.n.rdat_geoid_file), + (DAT_FILEPATH_D, boost::program_options::value(&p.n.rdat_geoid_file), "File path of the WINTER DAT grid file.") - (NTV2_GS_TYPE, value(&gs_type), + (NTV2_GS_TYPE, boost::program_options::value(&gs_type), "Units in which the grid parameters and deflections of the vertical will be stored. arg is either 'seconds' or 'radians'. Default is seconds.") - (NTV2_VERSION, value(&version), + (NTV2_VERSION, boost::program_options::value(&version), "Grid file version. Default is 1.0.0.0.") - (NTV2_SYSTEM_F, value(&system_f), + (NTV2_SYSTEM_F, boost::program_options::value(&system_f), "The 'From' reference system. Default is GDA94.") - (NTV2_SYSTEM_T, value(&system_t), + (NTV2_SYSTEM_T, boost::program_options::value(&system_t), "The 'To' reference system. Default is AHD_1971") - (NTV2_MAJOR_F, value(&ntv2.daf), + (NTV2_MAJOR_F, boost::program_options::value(&ntv2.daf), "Semi major of 'From' system. Default is 6378137.000") - (NTV2_MAJOR_T, value(&ntv2.dat), + (NTV2_MAJOR_T, boost::program_options::value(&ntv2.dat), "Semi major of 'To' system. Default is 6378137.000") - (NTV2_MINOR_F, value(&ntv2.dbf), + (NTV2_MINOR_F, boost::program_options::value(&ntv2.dbf), "Semi minor of 'From' system. Default is 6356752.314") - (NTV2_MINOR_T, value(&ntv2.dbt), + (NTV2_MINOR_T, boost::program_options::value(&ntv2.dbt), "Semi minor of 'To' system. Default is 6356752.314") - (NTV2_SUB_NAME, value(&subgridname), + (NTV2_SUB_NAME, boost::program_options::value(&subgridname), "The name of the sub-grid. Default is AUSGEOID") - (NTV2_CREATED, value(&created), + (NTV2_CREATED, boost::program_options::value(&created), "Date of geoid model creation. arg is a dot delimited string \"dd.mm.yyyy\". Default is today's date if no value is supplied.") - (NTV2_UPDATED, value(&updated), + (NTV2_UPDATED, boost::program_options::value(&updated), "Date of last file update. arg is a dot delimited string \"dd.mm.yyyy\". Default is today's date if no value is supplied.") ; interactive_options.add_options() - (LATITUDE, value(&inputLatitude), + (LATITUDE, boost::program_options::value(&inputLatitude), "Latitude of the interpolant. Default is degrees, minutes and seconds (dd.mmssss).") - (LONGITUDE, value(&inputLongitude), + (LONGITUDE, boost::program_options::value(&inputLongitude), "Longitude of the interpolant. Default is degrees, minutes and seconds (dd.mmssss).") ; file_interpolate_options.add_options() - (DIRECTION_R, value(&p.n.ellipsoid_to_ortho), + (DIRECTION_R, boost::program_options::value(&p.n.ellipsoid_to_ortho), "Conversion of heights:\n 0 Orthometric to ellipsoid (default)\n 1 Ellipsoid to orthometric") ; @@ -643,13 +643,13 @@ int main(int argc, char* argv[]) ; generic_options.add_options() - (VERBOSE, value(&p.g.verbose), - string("When importing geoid information into a project, print the stations for which an N-value could not be interpolated to a log (*.int) file.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information").c_str()) + (VERBOSE, boost::program_options::value(&p.g.verbose), + std::string("When importing geoid information into a project, print the stations for which an N-value could not be interpolated to a log (*.int) file.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information").c_str()) (QUIET, - string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) + std::string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) (VERSION_V, "Display the current program version") (HELP_H, "Show this help message") - (HELP_MODULE_H, value(), + (HELP_MODULE_H, boost::program_options::value(), "Provide help for a specific help category.") ; @@ -658,70 +658,70 @@ int main(int argc, char* argv[]) // add "positional options" to handle command line tokens which have no option name positional_options.add(NETWORK_NAME, -1); - command_line_parser parser(argc, argv); + boost::program_options::command_line_parser parser(argc, argv); store(parser.options(allowable_options).positional(positional_options).run(), vm); notify(vm); } catch (const std::exception& e) { - cout << endl << "- Error: " << e.what() << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } catch (...) { - cout << endl << "- Exception of unknown type!\n"; + std::cout << std::endl << "- Exception of unknown type!\n"; return EXIT_FAILURE; } if (argc < 2) { - cout << endl << "- Nothing to do - no options provided. " << endl << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << std::endl << "- Nothing to do - no options provided. " << std::endl << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } if (vm.count(VERSION)) { - cout << cmd_line_banner << endl; + std::cout << cmd_line_banner << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP)) { - cout << cmd_line_banner << allowable_options << endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP_MODULE)) { - cout << cmd_line_banner; - string original_text = vm[HELP_MODULE].as(); - string help_text = str_upper(original_text); + std::cout << cmd_line_banner; + std::string original_text = vm[HELP_MODULE].as(); + std::string help_text = str_upper(original_text); - if (str_upper(ALL_MODULE_STDOPT).find(help_text) != string::npos) { - cout << standard_options << endl; + if (str_upper(ALL_MODULE_STDOPT).find(help_text) != std::string::npos) { + std::cout << standard_options << std::endl; } - else if (str_upper(GEOID_MODULE_NTV2).find(help_text) != string::npos) { - cout << ntv2_options << endl; + else if (str_upper(GEOID_MODULE_NTV2).find(help_text) != std::string::npos) { + std::cout << ntv2_options << std::endl; } - else if (str_upper(GEOID_MODULE_INTERPOLATE).find(help_text) != string::npos) { - cout << interpolate_options << endl; + else if (str_upper(GEOID_MODULE_INTERPOLATE).find(help_text) != std::string::npos) { + std::cout << interpolate_options << std::endl; } - else if (str_upper(GEOID_MODULE_INTERACTIVE).find(help_text) != string::npos) { - cout << interactive_options << endl; + else if (str_upper(GEOID_MODULE_INTERACTIVE).find(help_text) != std::string::npos) { + std::cout << interactive_options << std::endl; } - else if (str_upper(GEOID_MODULE_FILE).find(help_text) != string::npos) { - cout << file_interpolate_options << endl; + else if (str_upper(GEOID_MODULE_FILE).find(help_text) != std::string::npos) { + std::cout << file_interpolate_options << std::endl; } - else if (str_upper(ALL_MODULE_EXPORT).find(help_text) != string::npos) { - cout << export_options << endl; + else if (str_upper(ALL_MODULE_EXPORT).find(help_text) != std::string::npos) { + std::cout << export_options << std::endl; } - else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != string::npos) { - cout << generic_options << endl; + else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != std::string::npos) { + std::cout << generic_options << std::endl; } else { - cout << endl << "- Error: Help module '" << - original_text << "' is not in the list of options." << endl; + std::cout << std::endl << "- Error: Help module '" << + original_text << "' is not in the list of options." << std::endl; return EXIT_FAILURE; } @@ -740,39 +740,39 @@ int main(int argc, char* argv[]) // grid file path not supplied. Generate name from dat file if (p.n.ntv2_geoid_file.empty()) { - path gsbFile(p.n.rdat_geoid_file); + boost::filesystem::path gsbFile(p.n.rdat_geoid_file); p.n.ntv2_geoid_file = gsbFile.stem().string() + gsbFile.extension().string() + ".gsb"; strcpy(ntv2.filename, p.n.ntv2_geoid_file.c_str()); strcpy(ntv2.filetype, GSB); } else { - string extension(GetFileType(p.n.ntv2_geoid_file)); + std::string extension(GetFileType(p.n.ntv2_geoid_file)); if (extension.empty()) { - cout << endl << "- Error: NTv2 grid file type cannot be determined from a file without a file extension. " << endl << endl; + std::cout << std::endl << "- Error: NTv2 grid file type cannot be determined from a file without a file extension. " << std::endl << std::endl; return EXIT_FAILURE; } - if (!iequals(extension.substr(1), GSB) && - !iequals(extension.substr(1), ASC)) + if (!boost::iequals(extension.substr(1), GSB) && + !boost::iequals(extension.substr(1), ASC)) { - cout << endl << "- Error: NTv2 grid file type cannot be determined from file extension \"" << extension << "\"." << endl << - " Supported types are ." << GSB << " and ." << ASC << " only." << endl << endl; + std::cout << std::endl << "- Error: NTv2 grid file type cannot be determined from file extension \"" << extension << "\"." << std::endl << + " Supported types are ." << GSB << " and ." << ASC << " only." << std::endl << std::endl; return EXIT_FAILURE; } if (vm.count(EXPORT_NTV2_ASCII_FILE) && - iequals(extension.substr(1), ASC)) + boost::iequals(extension.substr(1), ASC)) { - cout << endl << "- Error: Export to ASCII NTv2 grid file option only supported for " << GSB " grid files." << endl << endl; + std::cout << std::endl << "- Error: Export to ASCII NTv2 grid file option only supported for " << GSB " grid files." << std::endl << std::endl; return EXIT_FAILURE; } if (vm.count(EXPORT_NTV2_BINARY_FILE) && - iequals(extension.substr(1), GSB)) + boost::iequals(extension.substr(1), GSB)) { - cout << endl << "- Error: Export to Binary NTv2 grid file option only supported for " << ASC " grid files." << endl << endl; + std::cout << std::endl << "- Error: Export to Binary NTv2 grid file option only supported for " << ASC " grid files." << std::endl << std::endl; return EXIT_FAILURE; } @@ -787,145 +787,145 @@ int main(int argc, char* argv[]) { gs_type = trimstr(gs_type); // Unknown type? - if (!iequals(gs_type, "seconds") && !iequals(gs_type, "radians")) + if (!boost::iequals(gs_type, "seconds") && !boost::iequals(gs_type, "radians")) gs_type = "seconds"; str_toupper(gs_type); } if (!p.g.quiet) { - cout << endl << cmd_line_banner; + std::cout << std::endl << cmd_line_banner; - cout << "+ Options:" << endl; + std::cout << "+ Options:" << std::endl; if (vm.count(NETWORK_NAME)) - cout << setw(PRINT_VAR_PAD) << left << " Network name: " << p.g.network_name << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Network name: " << p.g.network_name << std::endl; if (p.n.file_mode || vm.count(CREATE_NTV2)) { - cout << setw(PRINT_VAR_PAD) << left << " Input folder: " << p.g.input_folder << endl; - cout << setw(PRINT_VAR_PAD) << left << " Output folder: " << p.g.output_folder << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Input folder: " << p.g.input_folder << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Output folder: " << p.g.output_folder << std::endl; if (!p.n.bst_file.empty()) { - cout << setw(PRINT_VAR_PAD) << left << " Binary station file: " << p.n.bst_file << endl; - //cout << setw(PRINT_VAR_PAD) << left << " Convert orthometric heights: "; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Binary station file: " << p.n.bst_file << std::endl; + //cout << std::setw(PRINT_VAR_PAD) << std::left << " Convert orthometric heights: "; //if (p.n.convert_heights) - // cout << "Yes" << endl; + // std::cout << "Yes" << std::endl; //else - // cout << "No" << endl; + // std::cout << "No" << std::endl; } if (!p.n.input_file.empty()) - cout << setw(PRINT_VAR_PAD) << left << " ASCII file: " << p.n.input_file << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " ASCII file: " << p.n.input_file << std::endl; } - cout << setw(PRINT_VAR_PAD) << left << " Geoid grid file: " << ntv2.filename << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Geoid grid file: " << ntv2.filename << std::endl; // Not applicable for project file use if (vm.count(CREATE_NTV2)) { - cout << setw(PRINT_VAR_PAD) << left << " WINTER DAT file: " << leafStr(p.n.rdat_geoid_file) << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " WINTER DAT file: " << leafStr(p.n.rdat_geoid_file) << std::endl; if (vm.count(NTV2_GS_TYPE)) - cout << setw(PRINT_VAR_PAD) << left << " Grid shift type: " << gs_type.c_str() << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Grid shift type: " << gs_type.c_str() << std::endl; if (vm.count(NTV2_VERSION)) - cout << setw(PRINT_VAR_PAD) << left << " Grid file version: " << version.c_str() << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Grid file version: " << version.c_str() << std::endl; if (vm.count(NTV2_SYSTEM_F)) - cout << setw(PRINT_VAR_PAD) << left << " From reference system: " << system_f.c_str() << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " From reference system: " << system_f.c_str() << std::endl; if (vm.count(NTV2_SYSTEM_T)) - cout << setw(PRINT_VAR_PAD) << left << " To reference system: " << system_t.c_str() << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " To reference system: " << system_t.c_str() << std::endl; if (vm.count(NTV2_MAJOR_F)) - cout << setw(PRINT_VAR_PAD) << left << " From semi-major: " << fixed << setprecision(3) << ntv2.daf << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " From semi-major: " << std::fixed << std::setprecision(3) << ntv2.daf << std::endl; if (vm.count(NTV2_MAJOR_T)) - cout << setw(PRINT_VAR_PAD) << left << " To semi-major: " << ntv2.dat << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " To semi-major: " << ntv2.dat << std::endl; if (vm.count(NTV2_MINOR_F)) - cout << setw(PRINT_VAR_PAD) << left << " From semi-minor: " << ntv2.dbf << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " From semi-minor: " << ntv2.dbf << std::endl; if (vm.count(NTV2_MINOR_T)) - cout << setw(PRINT_VAR_PAD) << left << " To semi-minor: " << ntv2.dbt << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " To semi-minor: " << ntv2.dbt << std::endl; if (vm.count(NTV2_SUB_NAME)) - cout << setw(PRINT_VAR_PAD) << left << " Sub-grid name: " << subgridname.c_str() << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Sub-grid name: " << subgridname.c_str() << std::endl; - date creationDate, updateDate; + boost::gregorian::date creationDate, updateDate; if (created.empty()) created = "today"; if (updated.empty()) updated = "today"; - creationDate = dateFromString(created); - updateDate = dateFromString(updated); + creationDate = dateFromString(created); + updateDate = dateFromString(updated); // Print dates by default //if (vm.count(NTV2_CREATED)) - cout << setw(PRINT_VAR_PAD) << left << " Date of file creation: " << - stringFromDate(creationDate, "%d %B %Y") << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Date of file creation: " << + stringFromDate(creationDate, "%d %B %Y") << std::endl; //if (vm.count(NTV2_UPDATED)) - cout << setw(PRINT_VAR_PAD) << left << " Date of file update: " << - stringFromDate(updateDate, "%d %B %Y") << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Date of file update: " << + stringFromDate(updateDate, "%d %B %Y") << std::endl; - created = stringFromDate(creationDate, "%d%m%Y"); - updated = stringFromDate(updateDate, "%d%m%Y"); + created = stringFromDate(creationDate, "%d%m%Y"); + updated = stringFromDate(updateDate, "%d%m%Y"); } if (vm.count(EXPORT_NTV2_ASCII_FILE) || vm.count(EXPORT_NTV2_BINARY_FILE)) { - cout << setw(PRINT_VAR_PAD) << left << " Export NTv2 grid file to: "; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Export NTv2 grid file to: "; if (vm.count(EXPORT_NTV2_ASCII_FILE)) - cout << "ASCII (." << ASC << ")" << endl; + std::cout << "ASCII (." << ASC << ")" << std::endl; if (vm.count(EXPORT_NTV2_BINARY_FILE)) - cout << "Binary (." << GSB << ")" << endl; + std::cout << "Binary (." << GSB << ")" << std::endl; if (vm.count(NTV2_GS_TYPE)) - cout << setw(PRINT_VAR_PAD) << left << " Grid shift type: " << gs_type.c_str() << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Grid shift type: " << gs_type.c_str() << std::endl; } if (p.n.file_mode || vm.count(INTERACTIVE)) { - cout << setw(PRINT_VAR_PAD) << left << " Interpolation method: "; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Interpolation method: "; if (p.n.interpolation_method == BICUBIC) - cout << "Bi-cubic" << endl; + std::cout << "Bi-cubic" << std::endl; else - cout << "Bi-linear" << endl; + std::cout << "Bi-linear" << std::endl; - cout << setw(PRINT_VAR_PAD) << left << " Input coordinate format: "; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Input coordinate format: "; if (p.n.coordinate_format == DDEG) - cout << "Decimal degrees" << endl; + std::cout << "Decimal degrees" << std::endl; else - cout << "Degrees minutes seconds" << endl; + std::cout << "Degrees minutes seconds" << std::endl; if (!vm.count(INTERACTIVE)) { - cout << setw(PRINT_VAR_PAD) << left << " Transformation direction: "; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Transformation direction: "; if (p.n.ellipsoid_to_ortho == 0) - cout << "Orthometric to ellipsoid" << endl; + std::cout << "Orthometric to ellipsoid" << std::endl; else - cout << "Ellipsoid to orthometric" << endl; + std::cout << "Ellipsoid to orthometric" << std::endl; } } if (p.n.export_dna_geo_file) - cout << setw(PRINT_VAR_PAD) << left << " Export to DNA geoid file: " << "Yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Export to DNA geoid file: " << "Yes" << std::endl; - cout << endl; + std::cout << std::endl; if (vm.count(CONVERT_BST_HT)) - cout << "- Warning: The '--" << CONVERT_BST_HT << "' option has been deprecated. Orthometric" << endl << - " heights in the binary file will be converted to ellipsoidal by default, " << endl << - " unless the transformation direction has been modified by supplying the " << endl << - " '--" << DIRECTION << "' option with an argument of 1." << endl; + std::cout << "- Warning: The '--" << CONVERT_BST_HT << "' option has been deprecated. Orthometric" << std::endl << + " heights in the binary file will be converted to ellipsoidal by default, " << std::endl << + " unless the transformation direction has been modified by supplying the " << std::endl << + " '--" << DIRECTION << "' option with an argument of 1." << std::endl; - cout << endl; + std::cout << std::endl; // File interpolation mode... if (p.n.file_mode) { if (!p.n.bst_file.empty()) - cout << "+ Binary station file interpolation mode." << endl << endl; + std::cout << "+ Binary station file interpolation mode." << std::endl << std::endl; else - cout << "+ ASCII file interpolation mode." << endl << endl; + std::cout << "+ ASCII file interpolation mode." << std::endl << std::endl; } } @@ -961,7 +961,7 @@ int main(int argc, char* argv[]) if (ntv2.ptrIndex) delete [] ntv2.ptrIndex; - cout << endl << "+ Geoid file creation completed successfully." << endl << endl; + std::cout << std::endl << "+ Geoid file creation completed successfully." << std::endl << std::endl; return EXIT_SUCCESS; } @@ -969,7 +969,7 @@ int main(int argc, char* argv[]) { if (p.n.ntv2_geoid_file.empty()) { - cout << endl << "- Error: No NTv2 grid file specified. " << endl << endl; + std::cout << std::endl << "- Error: No NTv2 grid file specified. " << std::endl << std::endl; return EXIT_FAILURE; } @@ -979,7 +979,7 @@ int main(int argc, char* argv[]) if (!ExportNTv2GridToAscii(&g, ntv2.filename, ntv2.filetype, ntv2.chGs_type, ASC)) return EXIT_FAILURE; - cout << "+ Geoid file creation completed successfully." << endl << endl; + std::cout << "+ Geoid file creation completed successfully." << std::endl << std::endl; return EXIT_SUCCESS; } @@ -987,7 +987,7 @@ int main(int argc, char* argv[]) { if (p.n.ntv2_geoid_file.empty()) { - cout << endl << "- Error: No NTv2 grid file specified. " << endl << endl; + std::cout << std::endl << "- Error: No NTv2 grid file specified. " << std::endl << std::endl; return EXIT_FAILURE; } @@ -997,7 +997,7 @@ int main(int argc, char* argv[]) if (!ExportNTv2GridToBinary(&g, ntv2.filename, ntv2.filetype, ntv2.chGs_type, GSB)) return EXIT_FAILURE; - cout << "+ Geoid file creation completed successfully." << endl << endl; + std::cout << "+ Geoid file creation completed successfully." << std::endl << std::endl; return EXIT_SUCCESS; } @@ -1018,7 +1018,7 @@ int main(int argc, char* argv[]) apInterpolant.cVar.dLatitude = DoubleFromString(inputLatitude); apInterpolant.cVar.dLongitude = DoubleFromString(inputLongitude); - stringstream ssInput; + std::stringstream ssInput; ssInput << inputLatitude << ", " << inputLongitude; g.SetInputCoordinates(ssInput.str()); @@ -1035,7 +1035,7 @@ int main(int argc, char* argv[]) if (!InterpolateGridPoint(&g, &apInterpolant, p.n.interpolation_method, p.n.coordinate_format, inputLatitude, inputLongitude)) { - cout << endl; + std::cout << std::endl; if (apInterpolant.cVar.IO_Status == ERR_FINDSUBGRID_OUTSIDE) reportGridProperties(&g, ntv2.filename, ntv2.filetype); @@ -1054,19 +1054,19 @@ int main(int argc, char* argv[]) if (!p.g.quiet) { - cout << "+ Interpolating geoid components"; + std::cout << "+ Interpolating geoid components"; if (!p.n.bst_file.empty() && p.n.convert_heights) - cout << " and reducing" << endl << + std::cout << " and reducing" << std::endl << " heights to the ellipsoid"; - cout << "... "; + std::cout << "... "; } - cpu_timer time; + boost::timer::cpu_timer time; char dnageoFile[601], *geoFileptr; geoFileptr = NULL; memset(dnageoFile, '\0', sizeof(dnageoFile)); - string outputfilePath; + std::string outputfilePath; if (!p.n.geo_file.empty()) { @@ -1096,52 +1096,52 @@ int main(int argc, char* argv[]) if (!p.g.quiet) { - cout << "done." << endl; - cout << "+ Interpolated data for " << g.PointsInterpolated(); + std::cout << "done." << std::endl; + std::cout << "+ Interpolated data for " << g.PointsInterpolated(); if (g.PointsInterpolated() == 1) - cout << " point." << endl; + std::cout << " point." << std::endl; else - cout << " points." << endl; + std::cout << " points." << std::endl; if (g.PointsNotInterpolated() > 0) { - cout << "- Warning: Data for " << g.PointsNotInterpolated(); + std::cout << "- Warning: Data for " << g.PointsNotInterpolated(); // Is this wrapper being called to update DynAdjust station file? if (!p.n.bst_file.empty()) { if (g.PointsNotInterpolated() == 1) - cout << " station"; + std::cout << " station"; else - cout << " stations"; + std::cout << " stations"; - cout << " could not be interpolated. "; + std::cout << " could not be interpolated. "; if (p.g.verbose > 0) { try { ReturnBadStationRecords(&g, p); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { // print error message, and continue - cout << "- Error: " << e.what() << endl; + std::cout << "- Error: " << e.what() << std::endl; } } else - cout << "To view the list of stations " << endl << - " for which an N-value could not be interpolated, call " << __BINARY_NAME__ << " with --verbose-level 1." << endl; + std::cout << "To view the list of stations " << std::endl << + " for which an N-value could not be interpolated, call " << __BINARY_NAME__ << " with --verbose-level 1." << std::endl; } // If this point is reached, then this wrapper must have been called // to interpolate points in interactive mode. else //if (!p.n.input_file.empty()) { if (g.PointsNotInterpolated() == 1) - cout << " point"; + std::cout << " point"; else - cout << " points"; + std::cout << " points"; - cout << " could not be interpolated." << endl; - cout << " See " << outputfilePath << " for more information." << endl; + std::cout << " could not be interpolated." << std::endl; + std::cout << " See " << outputfilePath << " for more information." << std::endl; } } } @@ -1151,7 +1151,7 @@ int main(int argc, char* argv[]) if (userSuppliedProjectFile) { CDnaProjectFile projectFile; - if (exists(p.g.project_file)) + if (boost::filesystem::exists(p.g.project_file)) projectFile.LoadProjectFile(p.g.project_file); // Print the project file. If it doesn't exist, it will be created. @@ -1163,9 +1163,9 @@ int main(int argc, char* argv[]) return EXIT_SUCCESS; // wall time is in nanoseconds - // cout << time.elapsed().wall << endl << endl; - milliseconds elapsed_time(milliseconds(time.elapsed().wall/MILLI_TO_NANO)); - cout << endl << formatedElapsedTime(&elapsed_time, "+ Geoid file interpolation took ") << endl << endl; + // cout << time.elapsed().wall << std::endl << std::endl; + boost::posix_time::milliseconds elapsed_time(boost::posix_time::milliseconds(time.elapsed().wall/MILLI_TO_NANO)); + std::cout << std::endl << formatedElapsedTime(&elapsed_time, "+ Geoid file interpolation took ") << std::endl << std::endl; return EXIT_SUCCESS; } \ No newline at end of file diff --git a/dynadjust/dynadjust/dnageoidwrapper/dnageoidwrapper.hpp b/dynadjust/dynadjust/dnageoidwrapper/dnageoidwrapper.hpp index 63be2258..d963e91b 100644 --- a/dynadjust/dynadjust/dnageoidwrapper/dnageoidwrapper.hpp +++ b/dynadjust/dynadjust/dnageoidwrapper/dnageoidwrapper.hpp @@ -69,27 +69,18 @@ #include -using namespace std; -using namespace boost; -using namespace boost::filesystem; -using namespace boost::timer; -using namespace boost::posix_time; -using namespace boost::gregorian; -using namespace boost::program_options; -namespace po = boost::program_options; - using namespace dynadjust::geoidinterpolation; bool CreateNTv2Grid(dna_geoid_interpolation* g, const char* dat_gridfilePath, const n_file_par* grid); bool createGridIndex(dna_geoid_interpolation* g, const char* gridfilePath, const char* gridfileType, const int& quiet); bool reportGridProperties(dna_geoid_interpolation* g, const char* gridfilePath, const char* gridfileType); bool InterpolateGridPoint(dna_geoid_interpolation* g, const char* gridfilePath, geoid_point* apInterpolant, - const int& method, const int& coordinate_format, const string& inputLatitude, const string& inputLongitude); + const int& method, const int& coordinate_format, const std::string& inputLatitude, const std::string& inputLongitude); bool InterpolateGridPointFile(dna_geoid_interpolation* g, const char* inputfilePath, const int& method, const int EllipsoidtoOrtho, const int& coordinate_format, - bool exportDnaGeoidFile, const char* dnageofilePath, string& outputfilePath); -bool InterpolateGridBinaryStationFile(dna_geoid_interpolation* g, const string& bstnfilePath, + bool exportDnaGeoidFile, const char* dnageofilePath, std::string& outputfilePath); +bool InterpolateGridBinaryStationFile(dna_geoid_interpolation* g, const std::string& bstnfilePath, const int& method, bool convertHeights, bool exportDnaGeoidFile, const char* dnageofilePath); -int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& vm, project_settings& p); +int ParseCommandLineOptions(const int& argc, char* argv[], const boost::program_options::variables_map& vm, project_settings& p); #endif \ No newline at end of file diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index e6625cb4..fe7b9001 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -28,8 +28,6 @@ #include using namespace dynadjust::epsg; -using namespace boost::gregorian; -using namespace boost::posix_time; MsrTally g_map_tally; MsrTally g_parsemsr_tally; @@ -128,15 +126,15 @@ void dna_import::DetermineBoundingBox() bbox_lowerLon_ = DmstoRad(bbox_lowerLon_); } -void dna_import::BuildExtractStationsList(const string& stnList, pvstring vstnList) +void dna_import::BuildExtractStationsList(const std::string& stnList, pvstring vstnList) { // Extract stations from comma delimited string try { - SplitDelimitedString(stnList, string(","), vstnList); + SplitDelimitedString(stnList, std::string(","), vstnList); } catch (...) { - stringstream ss; - ss << "BuildExtractStationsList(): An error was encountered when parsing " << stnList << "." << endl; + std::stringstream ss; + ss << "BuildExtractStationsList(): An error was encountered when parsing " << stnList << "." << std::endl; SignalExceptionParse(ss.str(), 0); } @@ -150,7 +148,7 @@ void dna_import::BuildExtractStationsList(const string& stnList, pvstring vstnLi it_string_pair _it_discont_ren; _it_vstr _it_stn; - string station_name; + std::string station_name; vstring renamed_stations; // loop through all station names in vstnList @@ -164,7 +162,7 @@ void dna_import::BuildExtractStationsList(const string& stnList, pvstring vstnLi // Advance through _it_discont_ren for all occurrences of station_name while ((_it_discont_ren = lower_bound(_it_discont_ren, stn_renamed_.end(), - station_name, ComparePairFirst())) != stn_renamed_.end()) + station_name, ComparePairFirst())) != stn_renamed_.end()) { // found a station that has been renamed. // add the discontinuity name to the list @@ -182,7 +180,7 @@ void dna_import::BuildExtractStationsList(const string& stnList, pvstring vstnLi } -void dna_import::InitialiseDatum(const string& reference_frame, const string epoch) +void dna_import::InitialiseDatum(const std::string& reference_frame, const std::string epoch) { try { // Take the default reference frame, set either by the user or @@ -190,10 +188,10 @@ void dna_import::InitialiseDatum(const string& reference_frame, const string epo // reference frame (indicated by "") datum_.SetDatumFromName(reference_frame, epoch); } - catch (const runtime_error& e) { - stringstream ss; - ss << "InitialiseDatum(): An error occurred while initialising " << endl << " the default reference frame. Details:" << endl << - " " << e.what() << endl; + catch (const std::runtime_error& e) { + std::stringstream ss; + ss << "InitialiseDatum(): An error occurred while initialising " << std::endl << " the default reference frame. Details:" << std::endl << + " " << e.what() << std::endl; SignalExceptionParse(ss.str(), 0); } @@ -201,7 +199,7 @@ void dna_import::InitialiseDatum(const string& reference_frame, const string epo m_strProjectDefaultEpsg = datum_.GetEpsgCode_s(); m_strProjectDefaultEpoch = datum_.GetEpoch_s(); - if (datum_.GetEpoch() == timeImmemorial()) + if (datum_.GetEpoch() == timeImmemorial()) m_strProjectDefaultEpoch = ""; // Update binary file meta @@ -221,10 +219,10 @@ void dna_import::InitialiseDatum(const string& reference_frame, const string epo } -_PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, +_PARSE_STATUS_ dna_import::ParseInputFile(const std::string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, input_file_meta_t* input_file_meta, bool firstFile, - string* success_msg, project_settings* p) + std::string* success_msg, project_settings* p) { projectSettings_ = *p; *success_msg = ""; @@ -234,7 +232,7 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS percentComplete_ = -99.0; isProcessing_ = true; _filespecifiedreferenceframe = false; - stringstream ss; + std::stringstream ss; try { @@ -250,30 +248,30 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS ifsInputFILE_ = new std::ifstream; // Open and seek to end immediately after opening. - file_opener(ifsInputFILE_, fileName, ios::in | ios::ate, ascii, true); + file_opener(ifsInputFILE_, fileName, std::ios::in | std::ios::ate, ascii, true); // get file size and return to start sifsFileSize_ = (size_t)ifsInputFILE_->tellg(); - ifsInputFILE_->seekg(0, ios::beg); + ifsInputFILE_->seekg(0, std::ios::beg); // release file pointer mutex import_file_mutex.unlock(); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss.str(""); - ss << "ParseInputFile(): An error was encountered when opening " << fileName << "." << endl << " " << f.what() << endl << " Check that the file exists and that the file is not already opened."; + ss << "ParseInputFile(): An error was encountered when opening " << fileName << "." << std::endl << " " << f.what() << std::endl << " Check that the file exists and that the file is not already opened."; SignalExceptionParse(ss.str(), 0); } catch (...) { ss.str(""); - ss << "ParseInputFile(): An error was encountered when opening " << fileName << "." << endl << " Check that the file exists and that the file is not already opened."; + ss << "ParseInputFile(): An error was encountered when opening " << fileName << "." << std::endl << " Check that the file exists and that the file is not already opened."; SignalExceptionParse(ss.str(), 0); } // Firstly, see what type of file this is, then decide what to do with it char first_chars[PRINT_LINE_LENGTH+1]; - string fileEpsg, fileEpoch; + std::string fileEpsg, fileEpoch; fileEpsg = ""; try @@ -282,14 +280,14 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS import_file_mutex.lock(); ifsInputFILE_->get(first_chars, PRINT_LINE_LENGTH, '\n'); - ifsInputFILE_->seekg(0, ios::beg); // put back to beginning + ifsInputFILE_->seekg(0, std::ios::beg); // put back to beginning // release file pointer mutex import_file_mutex.unlock(); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss.str(""); - ss << "ParseInputFile(): An error was encountered when reading " << fileName << "." << endl << " " << f.what() << endl; + ss << "ParseInputFile(): An error was encountered when reading " << fileName << "." << std::endl << " " << f.what() << std::endl; SignalExceptionParse(ss.str(), 0); } @@ -342,8 +340,8 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS else if ( // use boost::algorithm::ifind_first, which is a case insensitive implementation of the find first algorithm. strncmp(first_chars, "!#=DNA", 6) == 0 || // dna file? - ifind_first(fileName, ".stn") || // dna station file - ifind_first(fileName, ".msr")) // dna measurement file + boost::ifind_first(fileName, ".stn") || // dna station file + boost::ifind_first(fileName, ".msr")) // dna measurement file { // Set the file type input_file_meta->filetype = dna; @@ -365,7 +363,7 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS { //throw XMLInteropException("ParseInputFile(): Could not deduce file type from extension or contents.", 0); ss.str(""); - ss << "ParseInputFile(): " << leafStr(fileName) << " is not a recognised station or" << endl << + ss << "ParseInputFile(): " << leafStr(fileName) << " is not a recognised station or" << std::endl << " measurement input file."; (*success_msg) = ss.str(); //SignalExceptionParse(ss.str(), 0); @@ -394,9 +392,9 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const string& fileName, vdnaStnPtr* vS return parseStatus_; } -void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, +void dna_import::ParseXML(const std::string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, - string& fileEpsg, string& fileEpoch, bool firstFile, string* success_msg) + std::string& fileEpsg, std::string& fileEpoch, bool firstFile, std::string* success_msg) { parseStatus_ = PARSE_SUCCESS; @@ -408,8 +406,8 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 // A hack to circumvent the problem caused by importing DynaML files in // different directories to where import is run from, causing errors // because DynaML.xsd cannot be found. - path currentPath(current_path()); - current_path(path(projectSettings_.g.input_folder)); + boost::filesystem::path currentPath(boost::filesystem::current_path()); + boost::filesystem::current_path(boost::filesystem::path(projectSettings_.g.input_folder)); // Instantiate individual parsers. DnaXmlFormat_pimpl DnaXmlFormat_p(ifsInputFILE_, // pass file stream to enable progress to be calculated @@ -500,7 +498,7 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 if (fileEpoch.empty()) { // Get the epoch of the nominated epsg (whether default or from the file) - fileEpoch = referenceepochFromEpsgString(fileEpsg); + fileEpoch = referenceepochFromEpsgString(fileEpsg); } // Has the user supplied a reference frame on the command line (--reference-frame)? @@ -527,7 +525,7 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 // If the datum field is blank in the first file, the default will be used. if (firstFile) { - projectSettings_.i.reference_frame = datumFromEpsgString(fileEpsg); + projectSettings_.i.reference_frame = datumFromEpsgString(fileEpsg); projectSettings_.r.reference_frame = projectSettings_.i.reference_frame; m_strProjectDefaultEpsg = fileEpsg; @@ -542,9 +540,9 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 } catch (...) { - stringstream ss; + std::stringstream ss; ss << "The default input file reference frame \"" << referenceframe_p.str() << "\" is not recognised."; - SignalExceptionParse(static_cast(ss.str()), 0); + SignalExceptionParse(static_cast(ss.str()), 0); } if (!vStations->empty() && !vMeasurements->empty()) @@ -556,7 +554,7 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 current_path(currentPath); } - catch (const ios_base::failure& f) + catch (const std::ios_base::failure& f) { if (ifsInputFILE_->eof()) { @@ -570,9 +568,9 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 import_file_mutex.unlock(); return; } - stringstream ss; - ss << "ParseXML(): An ios_base failure was encountered while parsing " << fileName << "." << endl << " " << f.what(); - SignalExceptionParse(static_cast(ss.str()), 0); + std::stringstream ss; + ss << "ParseXML(): An std::ios_base failure was encountered while parsing " << fileName << "." << std::endl << " " << f.what(); + SignalExceptionParse(static_cast(ss.str()), 0); } catch (const std::system_error& e) { @@ -588,55 +586,55 @@ void dna_import::ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 import_file_mutex.unlock(); return; } - stringstream ss; - ss << "ParseXML(): An ios_base failure was encountered while parsing " << fileName << "." << endl << " " << e.what(); - SignalExceptionParse(static_cast(ss.str()), 0); + std::stringstream ss; + ss << "ParseXML(): An std::ios_base failure was encountered while parsing " << fileName << "." << std::endl << " " << e.what(); + SignalExceptionParse(static_cast(ss.str()), 0); } catch (const XMLInteropException& e) { - stringstream ss; - ss << "ParseXML(): An exception was encountered while parsing " << fileName << "." << endl << " " << e.what(); - SignalExceptionParse(static_cast(ss.str()), 0); + std::stringstream ss; + ss << "ParseXML(): An exception was encountered while parsing " << fileName << "." << std::endl << " " << e.what(); + SignalExceptionParse(static_cast(ss.str()), 0); } catch (const ::xml_schema::parsing& e) { - stringstream ss(""); + std::stringstream ss(""); ss << e.what(); ::xsd::cxx::parser::diagnostics::const_iterator _it; for (_it=e.diagnostics().begin(); _it!=e.diagnostics().end(); _it++) { - ss << endl; + ss << std::endl; ss << " - line " << _it->line(); ss << ", column " << _it->column(); - ss << ", severity " << _it->severity() << endl; + ss << ", severity " << _it->severity() << std::endl; ss << " - " << _it->message(); } SignalExceptionParse(ss.str(), 0); } catch (const ::xml_schema::exception& e) { - stringstream ss; - ss << "ParseXML(): An xml_schema exception was encountered while parsing " << fileName << "." << endl << " " << e.what(); - SignalExceptionParse(static_cast(ss.str()), 0); + std::stringstream ss; + ss << "ParseXML(): An xml_schema exception was encountered while parsing " << fileName << "." << std::endl << " " << e.what(); + SignalExceptionParse(static_cast(ss.str()), 0); } catch (...) { - stringstream ss; - ss << "ParseXML(): An unknown error was encountered while parsing " << fileName << "." << endl; + std::stringstream ss; + ss << "ParseXML(): An unknown error was encountered while parsing " << fileName << "." << std::endl; SignalExceptionParse(ss.str(), 0); } if (parseStatus_ != PARSE_SUCCESS) { - stringstream ss(""); + std::stringstream ss(""); ss.str(""); - ss << "- Warning: Parse success code = " << PARSE_SUCCESS << "." << endl; + ss << "- Warning: Parse success code = " << PARSE_SUCCESS << "." << std::endl; (*success_msg) += ss.str(); } } -void dna_import::ParseSNX(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, +void dna_import::ParseSNX(const std::string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID) { try { @@ -647,21 +645,21 @@ void dna_import::ParseSNX(const string& fileName, vdnaStnPtr* vStations, PUINT32 datum_, projectSettings_.i.apply_discontinuities==1, &stn_discontinuities_, m_discontsSortedbyName, m_lineNo, m_columnNo, parseStatus_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionParse(e.what(), 0); } } // Parse discontinuities and create discontinuity tuple -void dna_import::ParseDiscontinuities(const string& fileName) +void dna_import::ParseDiscontinuities(const std::string& fileName) { std::ifstream discont_file; try { // Open discontinuity file. Throws runtime_error on failure. file_opener(discont_file, fileName, - ios::in, ascii, true); + std::ios::in, ascii, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } @@ -673,7 +671,7 @@ void dna_import::ParseDiscontinuities(const string& fileName) &stn_discontinuities_, m_discontsSortedbyName, m_lineNo, m_columnNo, parseStatus_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionParse(e.what(), 0); } @@ -690,12 +688,12 @@ void dna_import::AddDiscontinuityStations(vdnaStnPtr* vStations) it_string_pair stn_renames_it(stn_renamed_.begin()); dnaStnPtr stn_ptr; - string stationName; + std::string stationName; UINT32 i, station_count(static_cast(vStations->size())); UINT32 station_index(station_count); - sort(vStations->begin(), vStations->end(), CompareStationName()); + std::sort(vStations->begin(), vStations->end(), CompareStationName()); for (i=0; ibegin(), vStations->end(), CompareStationName()); + std::sort(vStations->begin(), vStations->end(), CompareStationName()); _it_vdnastnptr _it_stn_newend = unique(vStations->begin(), vStations->end(), EqualStationName()); if (_it_stn_newend != vStations->end()) vStations->resize(_it_stn_newend - vStations->begin()); @@ -743,7 +741,7 @@ void dna_import::ApplyDiscontinuities(vdnaMsrPtr* vMeasurements) if (!m_discontsSortedbyName) { - sort(stn_discontinuities_.begin(), stn_discontinuities_.end(), + std::sort(stn_discontinuities_.begin(), stn_discontinuities_.end(), CompareSiteTuplesByName()); m_discontsSortedbyName = true; } @@ -763,12 +761,12 @@ void dna_import::ApplyDiscontinuities(vdnaMsrPtr* vMeasurements) ApplyDiscontinuitiesMeasurements(vMeasurements); } -void dna_import::TrackDiscontinuitySite(const string& site, const string& site_renamed) +void dna_import::TrackDiscontinuitySite(const std::string& site, const std::string& site_renamed) { - if (!binary_search(stn_renamed_.begin(), stn_renamed_.end(), site_renamed, ComparePairSecond())) + if (!binary_search(stn_renamed_.begin(), stn_renamed_.end(), site_renamed, ComparePairSecond())) { stn_renamed_.push_back(string_string_pair(site, site_renamed)); - sort(stn_renamed_.begin(), stn_renamed_.end(), ComparePairFirst()); + std::sort(stn_renamed_.begin(), stn_renamed_.end(), ComparePairFirst()); } } @@ -780,13 +778,13 @@ void dna_import::ApplyDiscontinuitiesMeasurements(vdnaMsrPtr* vMeasurements) { _it_vdiscontinuity_tuple _it_discont(stn_discontinuities_.begin()); - string site_renamed, stn1, stn2, stn3; + std::string site_renamed, stn1, stn2, stn3; - date site_date; + boost::gregorian::date site_date; - vector* vdirns; - vector* vgpsBsls; - vector* vgpsPnts; + std::vector* vdirns; + std::vector* vgpsBsls; + std::vector* vgpsPnts; _it_vdnamsrptr _it_msr(vMeasurements->begin()); @@ -812,7 +810,7 @@ void dna_import::ApplyDiscontinuitiesMeasurements(vdnaMsrPtr* vMeasurements) continue; // Capture the epoch of the measurement - site_date = dateFromString(_it_msr->get()->GetEpoch()); + site_date = dateFromString(_it_msr->get()->GetEpoch()); // 2. Handle 'first' station for every measurement type stn1 = _it_msr->get()->GetFirst(); @@ -908,19 +906,19 @@ void dna_import::ApplyDiscontinuitiesMeasurements(vdnaMsrPtr* vMeasurements) } -void dna_import::ApplyDiscontinuitiesMeasurements_GX(vector* vGpsBaselines) +void dna_import::ApplyDiscontinuitiesMeasurements_GX(std::vector* vGpsBaselines) { - vector< CDnaGpsBaseline >::iterator _it_msr(vGpsBaselines->begin()); + std::vector< CDnaGpsBaseline >::iterator _it_msr(vGpsBaselines->begin()); _it_vdiscontinuity_tuple _it_discont(stn_discontinuities_.begin()); - string site_renamed, stn1, stn2, stn3; - date site_date; + std::string site_renamed, stn1, stn2, stn3; + boost::gregorian::date site_date; for (_it_msr = vGpsBaselines->begin(); _it_msr != vGpsBaselines->end(); _it_msr++) { // Capture the start date of the site - site_date = dateFromString(_it_msr->GetEpoch()); + site_date = dateFromString(_it_msr->GetEpoch()); // Station 1 stn1 = _it_msr->GetFirst(); @@ -961,19 +959,19 @@ void dna_import::ApplyDiscontinuitiesMeasurements_GX(vector* vG } -void dna_import::ApplyDiscontinuitiesMeasurements_Y(vector* vGpsPoints) +void dna_import::ApplyDiscontinuitiesMeasurements_Y(std::vector* vGpsPoints) { - vector< CDnaGpsPoint >::iterator _it_msr(vGpsPoints->begin()); + std::vector< CDnaGpsPoint >::iterator _it_msr(vGpsPoints->begin()); _it_vdiscontinuity_tuple _it_discont(stn_discontinuities_.begin()); - string site_renamed, stn1, stn2, stn3; - date site_date; + std::string site_renamed, stn1, stn2, stn3; + boost::gregorian::date site_date; for (_it_msr = vGpsPoints->begin(); _it_msr != vGpsPoints->end(); _it_msr++) { // Capture the start date of the site - site_date = dateFromString(_it_msr->GetEpoch()); + site_date = dateFromString(_it_msr->GetEpoch()); // Station 1 stn1 = _it_msr->GetFirst(); @@ -996,11 +994,11 @@ void dna_import::ApplyDiscontinuitiesMeasurements_Y(vector* vGpsPo } -void dna_import::ApplyDiscontinuitiesMeasurements_D(vector* vDirections, const date& site_date) +void dna_import::ApplyDiscontinuitiesMeasurements_D(std::vector* vDirections, const boost::gregorian::date& site_date) { - vector< CDnaDirection >::iterator _it_msr(vDirections->begin()); + std::vector< CDnaDirection >::iterator _it_msr(vDirections->begin()); _it_vdiscontinuity_tuple _it_discont(stn_discontinuities_.begin()); - string site_renamed, stn1, stn2, stn3; + std::string site_renamed, stn1, stn2, stn3; for (_it_msr = vDirections->begin(); _it_msr != vDirections->end(); @@ -1045,9 +1043,9 @@ void dna_import::ApplyDiscontinuitiesMeasurements_D(vector* vDire } -void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, +void dna_import::ParseDNA(const std::string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, - string& fileEpsg, string& fileEpoch, bool firstFile) + std::string& fileEpsg, std::string& fileEpoch, bool firstFile) { parseStatus_ = PARSE_SUCCESS; @@ -1056,8 +1054,8 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 g_parsestn_tally.initialise(); g_parsemsr_tally.initialise(); - string stn_file_type(".stn"), msr_file_type(".msr"); - string version, geoversion; + std::string stn_file_type(".stn"), msr_file_type(".msr"); + std::string version, geoversion; INPUT_DATA_TYPE idt; UINT32 count; @@ -1083,7 +1081,7 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 // release file pointer mutex import_file_mutex.unlock(); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { import_file_mutex.unlock(); throw XMLInteropException(e.what(), 0); } @@ -1113,7 +1111,7 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 // dnaFile.read_dna_header(..) for details. if (firstFile) { - projectSettings_.i.reference_frame = datumFromEpsgString(fileEpsg); + projectSettings_.i.reference_frame = datumFromEpsgString(fileEpsg); projectSettings_.r.reference_frame = projectSettings_.i.reference_frame; m_strProjectDefaultEpsg = fileEpsg; @@ -1132,7 +1130,7 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 // Station file if (idt == stn_data || - (pos = fileName.find(stn_file_type, 0)) != string::npos) + (pos = fileName.find(stn_file_type, 0)) != std::string::npos) { // set the column positions and widths (using version obtained from the header) dsl_ = dnaFile.dna_stn_positions(); @@ -1147,25 +1145,25 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 ParseDNASTN(vStations, stnCount, fileEpsg, fileEpoch); m_idt = stn_data; } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if (ifsInputFILE_->eof()) { // release file pointer mutex import_file_mutex.unlock(); return; } - stringstream ss; - ss << "ParseDNA(): An ios_base failure was encountered when attempting to read stations file " << fileName << "." << endl << " " << f.what(); + std::stringstream ss; + ss << "ParseDNA(): An std::ios_base failure was encountered when attempting to read stations file " << fileName << "." << std::endl << " " << f.what(); throw XMLInteropException(ss.str(), 0); } catch (const XMLInteropException& f) { - stringstream ss; - ss << "ParseInputFile(): An exception was encountered while parsing " << fileName << "." << endl; + std::stringstream ss; + ss << "ParseInputFile(): An exception was encountered while parsing " << fileName << "." << std::endl; ss << " - line " << m_lineNo; - ss << ", column " << m_columnNo << endl; + ss << ", column " << m_columnNo << std::endl; ss << " - " << f.what(); - SignalExceptionParse(static_cast(ss.str()), 0); + SignalExceptionParse(static_cast(ss.str()), 0); } catch (...) { if (ifsInputFILE_->eof()) @@ -1174,13 +1172,13 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 import_file_mutex.unlock(); return; } - stringstream ss; + std::stringstream ss; ss << "ParseDNA(): An error was encountered when attempting to read stations file " << fileName << "."; throw XMLInteropException(ss.str(), 0); } } else if (idt == msr_data || - (pos = fileName.find(msr_file_type, 0)) != string::npos) + (pos = fileName.find(msr_file_type, 0)) != std::string::npos) { // Determine the file format version //ParseDNAVersion(msr_data); @@ -1194,25 +1192,25 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 ParseDNAMSR(vMeasurements, msrCount, clusterID, fileEpsg, fileEpoch); m_idt = msr_data; } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if (ifsInputFILE_->eof()) { // release file pointer mutex import_file_mutex.unlock(); return; } - stringstream ss; - ss << "ParseDNA(): An ios_base failure was encountered when attempting to read measurements file " << fileName << "." << endl << " " << f.what(); + std::stringstream ss; + ss << "ParseDNA(): An std::ios_base failure was encountered when attempting to read measurements file " << fileName << "." << std::endl << " " << f.what(); throw XMLInteropException(ss.str(), 0); } catch (const XMLInteropException& f) { - stringstream ss; - ss << "ParseInputFile(): An exception was encountered while parsing " << fileName << "." << endl; + std::stringstream ss; + ss << "ParseInputFile(): An exception was encountered while parsing " << fileName << "." << std::endl; ss << " - line " << m_lineNo; - ss << ", column " << m_columnNo << endl; + ss << ", column " << m_columnNo << std::endl; ss << " - " << f.what(); - SignalExceptionParse(static_cast(ss.str()), 0); + SignalExceptionParse(static_cast(ss.str()), 0); } catch (...) { if (ifsInputFILE_->eof()) @@ -1221,18 +1219,18 @@ void dna_import::ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 import_file_mutex.unlock(); return; } - stringstream ss; - ss << "ParseDNA(): An error was encountered when attempting to read measurements file " << fileName << "." << endl; + std::stringstream ss; + ss << "ParseDNA(): An error was encountered when attempting to read measurements file " << fileName << "." << std::endl; ss << " - line " << m_lineNo; - ss << ", column " << m_columnNo << endl; + ss << ", column " << m_columnNo << std::endl; throw XMLInteropException(ss.str(), 0); } } } -void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const string& epsg, const string& epoch) +void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const std::string& epsg, const std::string& epoch) { - string sBuf, tmp; + std::string sBuf, tmp; dnaStnPtr stn_ptr; vStations->clear(); @@ -1262,8 +1260,8 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri import_file_mutex.unlock(); return; } - stringstream ss; - ss << "ParseDNASTN(): Could not read from the station file." << endl; + std::stringstream ss; + ss << "ParseDNASTN(): Could not read from the station file." << std::endl; m_columnNo = 0; throw XMLInteropException(ss.str(), m_lineNo); } @@ -1284,7 +1282,7 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri continue; // initialise new station - stn_ptr.reset(new CDnaStation(datumFromEpsgString(epsg), epoch)); + stn_ptr.reset(new CDnaStation(datumFromEpsgString(epsg), epoch)); stn_ptr->SetfileOrder(g_fileOrder++); @@ -1294,8 +1292,8 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri stn_ptr->SetName(tmp); } catch (...) { - stringstream ss; - ss << "ParseDNASTN(): Could not extract station name from the record: " << endl << " " << sBuf << endl; + std::stringstream ss; + ss << "ParseDNASTN(): Could not extract station name from the record: " << std::endl << " " << sBuf << std::endl; m_columnNo = dsl_.stn_name+1; throw XMLInteropException(ss.str(), m_lineNo); } @@ -1307,8 +1305,8 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri g_parsestn_tally.addstation(tmp); } catch (...) { - stringstream ss; - ss << "ParseDNASTN(): Could not extract station constraints from the record: " << endl << " " << sBuf << endl; + std::stringstream ss; + ss << "ParseDNASTN(): Could not extract station constraints from the record: " << std::endl << " " << sBuf << std::endl; m_columnNo = dsl_.stn_const+1; throw XMLInteropException(ss.str(), m_lineNo); } @@ -1319,8 +1317,8 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri stn_ptr->SetCoordType(tmp); } catch (...) { - stringstream ss; - ss << "ParseDNASTN(): Could not extract coordinate type from the record: " << endl << " " << sBuf << endl; + std::stringstream ss; + ss << "ParseDNASTN(): Could not extract coordinate type from the record: " << std::endl << " " << sBuf << std::endl; m_columnNo = dsl_.stn_type+1; throw XMLInteropException(ss.str(), m_lineNo); } @@ -1331,7 +1329,7 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri stn_ptr->SetXAxis(tmp); } catch (...) { - stringstream ss; + std::stringstream ss; ss << "ParseDNASTN(): Could not extract station "; switch (stn_ptr.get()->GetMyCoordTypeC()) { @@ -1348,7 +1346,7 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri default: break; } - ss << " value from the record: " << endl << " " << sBuf << endl; + ss << " value from the record: " << std::endl << " " << sBuf << std::endl; m_columnNo = dsl_.stn_e_phi_x+1; throw XMLInteropException(ss.str(), m_lineNo); } @@ -1358,7 +1356,7 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri stn_ptr->SetYAxis(tmp); } catch (...) { - stringstream ss; + std::stringstream ss; ss << "ParseDNASTN(): Could not extract station "; switch (stn_ptr->GetMyCoordTypeC()) { @@ -1375,7 +1373,7 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri default: break; } - ss << " value from the record: " << endl << " " << sBuf << endl; + ss << " value from the record: " << std::endl << " " << sBuf << std::endl; m_columnNo = dsl_.stn_n_lam_y+1; throw XMLInteropException(ss.str(), m_lineNo); } @@ -1388,7 +1386,7 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri stn_ptr->SetHeight(tmp); } catch (...) { - stringstream ss; + std::stringstream ss; ss << "ParseDNASTN(): Could not extract station "; switch (stn_ptr->GetMyCoordTypeC()) { @@ -1403,7 +1401,7 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri default: break; } - ss << " value from the record: " << endl << " " << sBuf << endl; + ss << " value from the record: " << std::endl << " " << sBuf << std::endl; m_columnNo = dsl_.stn_ht_z+1; throw XMLInteropException(ss.str(), m_lineNo); } @@ -1424,8 +1422,8 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri case XYZ_type_i: break; case UTM_type_i: // Hemisphere and zone is only essential for UTM types - stringstream ss; - ss << "ParseDNASTN(): Could not extract station hemisphere and zone from the record: " << endl << " " << sBuf << endl; + std::stringstream ss; + ss << "ParseDNASTN(): Could not extract station hemisphere and zone from the record: " << std::endl << " " << sBuf << std::endl; m_columnNo = dsl_.stn_hemi_zo+1; throw XMLInteropException(ss.str(), m_lineNo); } @@ -1449,9 +1447,9 @@ void dna_import::ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, const stri } -void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT32 clusterID, const string& fileEpsg, const string& fileEpoch) +void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT32 clusterID, const std::string& fileEpsg, const std::string& fileEpoch) { - string sBuf, tmp; + std::string sBuf, tmp; dnaMsrPtr msr_ptr; vMeasurements->clear(); @@ -1487,8 +1485,8 @@ void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT3 import_file_mutex.unlock(); return; } - stringstream ss; - ss << "ParseDNAMSR(): Could not read from the measurement file." << endl; + std::stringstream ss; + ss << "ParseDNAMSR(): Could not read from the measurement file." << std::endl; m_columnNo = 0; throw XMLInteropException(ss.str(), m_lineNo); } @@ -1534,13 +1532,13 @@ void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT3 cType = static_cast(toupper(cType)); } catch (...) { - stringstream ss; - ss << "ParseDNAMSR(): Could not extract measurement type from the record: " << endl << " " << sBuf << endl; + std::stringstream ss; + ss << "ParseDNAMSR(): Could not extract measurement type from the record: " << std::endl << " " << sBuf << std::endl; m_columnNo = dml_.msr_type+1; throw XMLInteropException(ss.str(), m_lineNo); } - ignoreMsr = iequals("*", sBuf.substr(dml_.msr_ignore, dmw_.msr_ignore)); + ignoreMsr = boost::iequals("*", sBuf.substr(dml_.msr_ignore, dmw_.msr_ignore)); switch (cType) { @@ -1580,7 +1578,7 @@ void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT3 case 'G': // GPS Baseline (treat as single-baseline cluster) case 'X': // GPS Baseline cluster // Default to the fileEpsg and fileEpoch (see read_dna_header(..) in ParseDNA) - msr_ptr.reset(new CDnaGpsBaselineCluster(++(*clusterID), datumFromEpsgString(fileEpsg), fileEpoch)); + msr_ptr.reset(new CDnaGpsBaselineCluster(++(*clusterID), datumFromEpsgString(fileEpsg), fileEpoch)); ParseDNAMSRGPSBaselines(sBuf, msr_ptr, ignoreMsr); (*msrCount) += static_cast(msr_ptr->GetBaselines_ptr()->size() * 3); break; @@ -1652,7 +1650,7 @@ void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT3 break; case 'Y': // GPS point cluster // Default to the fileEpsg and fileEpoch (see read_dna_header(..) in ParseDNA) - msr_ptr.reset(new CDnaGpsPointCluster(++(*clusterID), datumFromEpsgString(fileEpsg), fileEpoch)); + msr_ptr.reset(new CDnaGpsPointCluster(++(*clusterID), datumFromEpsgString(fileEpsg), fileEpoch)); ParseDNAMSRGPSPoints(sBuf, msr_ptr, ignoreMsr); (*msrCount) += static_cast(msr_ptr->GetPoints_ptr()->size() * 3); break; @@ -1663,8 +1661,8 @@ void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT3 (*msrCount) += 1; break; default: - stringstream ss; - ss << "ParseDNAMSR(): Unknown measurement type: " << cType << endl; + std::stringstream ss; + ss << "ParseDNAMSR(): Unknown measurement type: " << cType << std::endl; throw XMLInteropException(ss.str(), m_lineNo); } @@ -1678,7 +1676,7 @@ void dna_import::ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT3 } } -void dna_import::ParseDNAMSRLinear(const string& sBuf, dnaMsrPtr& msr_ptr) +void dna_import::ParseDNAMSRLinear(const std::string& sBuf, dnaMsrPtr& msr_ptr) { // Measurement type try { @@ -1707,7 +1705,7 @@ void dna_import::ParseDNAMSRLinear(const string& sBuf, dnaMsrPtr& msr_ptr) // Value msr_ptr->SetValue(ParseLinearValue(sBuf, - measurement_name(msr_ptr->GetTypeC()), "ParseDNAMSRLinear")); + measurement_name(msr_ptr->GetTypeC()), "ParseDNAMSRLinear")); // Standard deviation msr_ptr->SetStdDev(ParseStdDevValue(sBuf, "ParseDNAMSRLinear")); @@ -1749,7 +1747,7 @@ void dna_import::ParseDNAMSRLinear(const string& sBuf, dnaMsrPtr& msr_ptr) } -void dna_import::ParseDNAMSRCoordinate(const string& sBuf, dnaMsrPtr& msr_ptr) +void dna_import::ParseDNAMSRCoordinate(const std::string& sBuf, dnaMsrPtr& msr_ptr) { // Measurement type try { @@ -1774,7 +1772,7 @@ void dna_import::ParseDNAMSRCoordinate(const string& sBuf, dnaMsrPtr& msr_ptr) // Value msr_ptr->SetValue(ParseLinearValue(sBuf, - measurement_name(msr_ptr->GetTypeC()), "ParseDNAMSRCoordinate")); + measurement_name(msr_ptr->GetTypeC()), "ParseDNAMSRCoordinate")); // Standard deviation msr_ptr->SetStdDev(ParseStdDevValue(sBuf, "ParseDNAMSRCoordinate")); @@ -1789,7 +1787,7 @@ void dna_import::ParseDNAMSRCoordinate(const string& sBuf, dnaMsrPtr& msr_ptr) } -void dna_import::ParseDNAMSRGPSBaselines(string& sBuf, dnaMsrPtr& msr_ptr, bool ignoreMsr) +void dna_import::ParseDNAMSRGPSBaselines(std::string& sBuf, dnaMsrPtr& msr_ptr, bool ignoreMsr) { CDnaGpsBaseline bslTmp; CDnaCovariance covTmp; @@ -1798,7 +1796,7 @@ void dna_import::ParseDNAMSRGPSBaselines(string& sBuf, dnaMsrPtr& msr_ptr, bool bslTmp.SetEpoch(msr_ptr->GetEpoch()); // Measurement type - string tmp; + std::string tmp; try { tmp = trimstr(sBuf.substr(dml_.msr_type, dmw_.msr_type)); } @@ -1833,13 +1831,13 @@ void dna_import::ParseDNAMSRGPSBaselines(string& sBuf, dnaMsrPtr& msr_ptr, bool // Number of baselines UINT32 bslCount(1); - if (iequals(msr_ptr->GetType(), "X")) + if (boost::iequals(msr_ptr->GetType(), "X")) msr_ptr->SetTotal(ParseMsrCountValue(sBuf, bslCount, "ParseDNAMSRGPSBaselines")); msr_ptr->SetRecordedTotal(bslCount); bslTmp.SetRecordedTotal(bslCount); msr_ptr->GetBaselines_ptr()->reserve(bslCount); - if (iequals(msr_ptr->GetType(), "X")) + if (boost::iequals(msr_ptr->GetType(), "X")) g_parsemsr_tally.X += bslCount * 3; else g_parsemsr_tally.G += bslCount * 3; @@ -1890,9 +1888,9 @@ void dna_import::ParseDNAMSRGPSBaselines(string& sBuf, dnaMsrPtr& msr_ptr, bool bslTmp.SetReferenceFrame(tmp); } } - catch (runtime_error& e) { - stringstream ss; - ss << "ParseDNAMSRGPSBaselines(): Error parsing reference frame: " << endl << + catch (std::runtime_error& e) { + std::stringstream ss; + ss << "ParseDNAMSRGPSBaselines(): Error parsing reference frame: " << std::endl << " " << e.what(); SignalExceptionParseDNA(ss.str(), "", dml_.msr_gps_reframe); } @@ -1903,7 +1901,7 @@ void dna_import::ParseDNAMSRGPSBaselines(string& sBuf, dnaMsrPtr& msr_ptr, bool if (tmp.empty()) { - if (isEpsgWGS84Ensemble(epsgCodeFromName(msr_ptr->GetReferenceFrame()))) + if (isEpsgWGS84Ensemble(epsgCodeFromName(msr_ptr->GetReferenceFrame()))) { // Set the cluster epoch msr_ptr->SetEpoch(""); @@ -1919,10 +1917,10 @@ void dna_import::ParseDNAMSRGPSBaselines(string& sBuf, dnaMsrPtr& msr_ptr, bool bslTmp.SetEpoch(tmp); } } - catch (runtime_error& e) { - stringstream ss; + catch (std::runtime_error& e) { + std::stringstream ss; ss << "ParseDNAMSRGPSBaselines(): Error parsing epoch: " << - endl << " " << e.what(); + std::endl << " " << e.what(); SignalExceptionParseDNA(ss.str(), "", dml_.msr_gps_epoch); } } @@ -2010,7 +2008,7 @@ void dna_import::ParseDNAMSRGPSBaselines(string& sBuf, dnaMsrPtr& msr_ptr, bool } } -void dna_import::ParseDNAMSRGPSPoints(string& sBuf, dnaMsrPtr& msr_ptr, bool ignoreMsr) +void dna_import::ParseDNAMSRGPSPoints(std::string& sBuf, dnaMsrPtr& msr_ptr, bool ignoreMsr) { CDnaGpsPoint pntTmp; CDnaCovariance covTmp; @@ -2019,7 +2017,7 @@ void dna_import::ParseDNAMSRGPSPoints(string& sBuf, dnaMsrPtr& msr_ptr, bool ign pntTmp.SetEpoch(msr_ptr->GetEpoch()); // Measurement type - string tmp; + std::string tmp; try { tmp = trimstr(sBuf.substr(dml_.msr_type, dmw_.msr_type)); } @@ -2065,8 +2063,8 @@ void dna_import::ParseDNAMSRGPSPoints(string& sBuf, dnaMsrPtr& msr_ptr, bool ign msr_ptr->SetCoordType(tmp); pntTmp.SetCoordType(msr_ptr->GetCoordType()); } - catch (runtime_error& e) { - SignalExceptionParseDNA("ParseDNAMSRGPSPoints(): " + string(e.what()), + catch (std::runtime_error& e) { + SignalExceptionParseDNA("ParseDNAMSRGPSPoints(): " + std::string(e.what()), "", dml_.msr_targ1); } @@ -2126,9 +2124,9 @@ void dna_import::ParseDNAMSRGPSPoints(string& sBuf, dnaMsrPtr& msr_ptr, bool ign pntTmp.SetReferenceFrame(tmp); } } - catch (runtime_error& e) { - stringstream ss; - ss << "ParseDNAMSRGPSPoints(): Error parsing reference frame: " << endl << + catch (std::runtime_error& e) { + std::stringstream ss; + ss << "ParseDNAMSRGPSPoints(): Error parsing reference frame: " << std::endl << " " << e.what(); SignalExceptionParseDNA(ss.str(), "", dml_.msr_gps_reframe); } @@ -2139,7 +2137,7 @@ void dna_import::ParseDNAMSRGPSPoints(string& sBuf, dnaMsrPtr& msr_ptr, bool ign if (tmp.empty()) { - if (isEpsgWGS84Ensemble(epsgCodeFromName(msr_ptr->GetReferenceFrame()))) + if (isEpsgWGS84Ensemble(epsgCodeFromName(msr_ptr->GetReferenceFrame()))) { // Set the cluster epoch msr_ptr->SetEpoch(""); @@ -2155,9 +2153,9 @@ void dna_import::ParseDNAMSRGPSPoints(string& sBuf, dnaMsrPtr& msr_ptr, bool ign pntTmp.SetEpoch(tmp); } } - catch (runtime_error& e) { - stringstream ss; - ss << "ParseDNAMSRGPSPoints(): Error parsing epoch: " << endl << + catch (std::runtime_error& e) { + std::stringstream ss; + ss << "ParseDNAMSRGPSPoints(): Error parsing epoch: " << std::endl << " " << e.what(); SignalExceptionParseDNA(ss.str(), "", dml_.msr_gps_epoch); } @@ -2244,7 +2242,7 @@ void dna_import::ParseDNAMSRGPSPoints(string& sBuf, dnaMsrPtr& msr_ptr, bool ign void dna_import::ParseDNAMSRCovariance(CDnaCovariance& cov) { - string sBuf; + std::string sBuf; m_lineNo++; // Obtain exclusive use of the input file pointer @@ -2284,7 +2282,7 @@ void dna_import::ParseDNAMSRCovariance(CDnaCovariance& cov) } -void dna_import::ParseDatabaseIds(const string& sBuf, const string& calling_function, const char msrType) +void dna_import::ParseDatabaseIds(const std::string& sBuf, const std::string& calling_function, const char msrType) { m_msr_db_map.is_msr_id_set = false; m_msr_db_map.is_cls_id_set = false; @@ -2317,51 +2315,51 @@ void dna_import::ParseDatabaseIds(const string& sBuf, const string& calling_func } -void dna_import::ParseDatabaseClusterId(const string& sBuf, const string& calling_function) +void dna_import::ParseDatabaseClusterId(const std::string& sBuf, const std::string& calling_function) { - string parsed_value; + std::string parsed_value; // Cluster ID try { parsed_value = trimstr(sBuf.substr(dml_.msr_id_cluster, dmw_.msr_id_cluster)); if (!parsed_value.empty()) { - m_msr_db_map.cluster_id = val_uint(parsed_value); + m_msr_db_map.cluster_id = val_uint(parsed_value); m_msr_db_map.is_cls_id_set = true; } } - catch (runtime_error& e) { - stringstream ss; + catch (std::runtime_error& e) { + std::stringstream ss; ss << calling_function << "(): Could not extract database cluster id from the record: " << - endl << " " << e.what(); + std::endl << " " << e.what(); SignalExceptionParseDNA(ss.str(), sBuf, dml_.msr_id_msr); } } -void dna_import::ParseDatabaseMsrId(const string& sBuf, const string& calling_function) +void dna_import::ParseDatabaseMsrId(const std::string& sBuf, const std::string& calling_function) { - string parsed_value; + std::string parsed_value; // Measurement ID try { parsed_value = trimstr(sBuf.substr(dml_.msr_id_msr, dmw_.msr_id_msr)); if (!parsed_value.empty()) { - m_msr_db_map.msr_id = val_uint(parsed_value); + m_msr_db_map.msr_id = val_uint(parsed_value); m_msr_db_map.is_msr_id_set = true; } } - catch (runtime_error& e) { - stringstream ss; + catch (std::runtime_error& e) { + std::stringstream ss; ss << calling_function << "(): Could not extract database msr id from the record: " << - endl << " " << e.what(); + std::endl << " " << e.what(); SignalExceptionParseDNA(ss.str(), sBuf, dml_.msr_id_msr); } } -string dna_import::ParseAngularValue(const string& sBuf, const string& calling_function) +std::string dna_import::ParseAngularValue(const std::string& sBuf, const std::string& calling_function) { - string parsed_value, tmp; + std::string parsed_value, tmp; double d; UINT32 u; @@ -2394,7 +2392,7 @@ string dna_import::ParseAngularValue(const string& sBuf, const string& calling_f d = DoubleFromString(tmp); if (d < 10 && tmp.at(0) != '0') parsed_value.append("0"); - if ((pos = tmp.find(".", pos)) != string::npos) + if ((pos = tmp.find(".", pos)) != std::string::npos) parsed_value.append(tmp.substr(0, pos) + tmp.substr(pos+1)); else parsed_value.append(tmp); @@ -2406,7 +2404,7 @@ string dna_import::ParseAngularValue(const string& sBuf, const string& calling_f return parsed_value; } -string dna_import::ParseLinearValue(const string& sBuf, const string& msrName, const string& calling_function) +std::string dna_import::ParseLinearValue(const std::string& sBuf, const std::string& msrName, const std::string& calling_function) { try { return trimstr(sBuf.substr(dml_.msr_linear, dmw_.msr_linear)); // coordinate value @@ -2418,12 +2416,12 @@ string dna_import::ParseLinearValue(const string& sBuf, const string& msrName, c return ""; } -string dna_import::ParseInstrumentValue(const string& sBuf, const string& calling_function) +std::string dna_import::ParseInstrumentValue(const std::string& sBuf, const std::string& calling_function) { try { // Capture string from the designated columns; throws on failure - string stn = trimstr(sBuf.substr(dml_.msr_inst, dmw_.msr_inst)); // instrument station + std::string stn = trimstr(sBuf.substr(dml_.msr_inst, dmw_.msr_inst)); // instrument station // No value supplied? if (stn.empty()) @@ -2439,11 +2437,11 @@ string dna_import::ParseInstrumentValue(const string& sBuf, const string& callin return ""; } -string dna_import::ParseTargetValue(const string& sBuf, const string& calling_function) +std::string dna_import::ParseTargetValue(const std::string& sBuf, const std::string& calling_function) { try { // Capture string from the designated columns; throws on failure - string stn = trimstr(sBuf.substr(dml_.msr_targ1, dmw_.msr_targ1)); // first target station + std::string stn = trimstr(sBuf.substr(dml_.msr_targ1, dmw_.msr_targ1)); // first target station // No value supplied? if (stn.empty()) @@ -2459,11 +2457,11 @@ string dna_import::ParseTargetValue(const string& sBuf, const string& calling_fu return ""; } -string dna_import::ParseTarget2Value(const string& sBuf, const string& calling_function) +std::string dna_import::ParseTarget2Value(const std::string& sBuf, const std::string& calling_function) { try { // Capture string from the designated columns; throws on failure - string stn = trimstr(sBuf.substr(dml_.msr_targ2, dmw_.msr_targ2)); // second target station + std::string stn = trimstr(sBuf.substr(dml_.msr_targ2, dmw_.msr_targ2)); // second target station // No value supplied? if (stn.empty()) @@ -2479,9 +2477,9 @@ string dna_import::ParseTarget2Value(const string& sBuf, const string& calling_f return ""; } -string dna_import::ParseStdDevValue(const string& sBuf, const string& calling_function) +std::string dna_import::ParseStdDevValue(const std::string& sBuf, const std::string& calling_function) { - string tmp; + std::string tmp; try { tmp = trimstr(sBuf.substr(dml_.msr_stddev, dmw_.msr_stddev)); // standard deviation } @@ -2496,7 +2494,7 @@ string dna_import::ParseStdDevValue(const string& sBuf, const string& calling_fu return tmp; } -string dna_import::ParseInstHeightValue(const string& sBuf, const string& calling_function) +std::string dna_import::ParseInstHeightValue(const std::string& sBuf, const std::string& calling_function) { try { if (sBuf.length() > dml_.msr_targ_ht) @@ -2511,10 +2509,10 @@ string dna_import::ParseInstHeightValue(const string& sBuf, const string& callin return ""; } -string dna_import::ParseTargHeightValue(const string& sBuf, const string& calling_function) +std::string dna_import::ParseTargHeightValue(const std::string& sBuf, const std::string& calling_function) { try { - if (sBuf.length() > static_cast(dml_.msr_targ_ht + 1 + dmw_.msr_targ_ht)) + if (sBuf.length() > static_cast(dml_.msr_targ_ht + 1 + dmw_.msr_targ_ht)) return trimstr(sBuf.substr(dml_.msr_targ_ht, dmw_.msr_targ_ht)); // target height else return trimstr(sBuf.substr(dml_.msr_targ_ht)); @@ -2526,10 +2524,10 @@ string dna_import::ParseTargHeightValue(const string& sBuf, const string& callin return ""; } -string dna_import::ParseMsrCountValue(const string& sBuf, UINT32& msrCount, const string& calling_function) +std::string dna_import::ParseMsrCountValue(const std::string& sBuf, UINT32& msrCount, const std::string& calling_function) { try { - string count(trimstr(sBuf.substr(dml_.msr_targ2, dmw_.msr_targ2))); // number of measurements + std::string count(trimstr(sBuf.substr(dml_.msr_targ2, dmw_.msr_targ2))); // number of measurements if (count.empty()) SignalExceptionParseDNA(calling_function + "(): Could not extract number of measurements from the record: ", sBuf, dml_.msr_targ2); @@ -2543,12 +2541,12 @@ string dna_import::ParseMsrCountValue(const string& sBuf, UINT32& msrCount, cons return ""; } -string dna_import::ParseScaleVValue(const string& sBuf, const string& calling_function) +std::string dna_import::ParseScaleVValue(const std::string& sBuf, const std::string& calling_function) { if (sBuf.length() <= dml_.msr_gps_vscale) return "1"; - string scalar; + std::string scalar; try { if (sBuf.length() > dml_.msr_gps_pscale) scalar = trimstr(sBuf.substr(dml_.msr_gps_vscale, dmw_.msr_gps_vscale)); // v-scale @@ -2566,12 +2564,12 @@ string dna_import::ParseScaleVValue(const string& sBuf, const string& calling_fu return scalar; } -string dna_import::ParseScalePValue(const string& sBuf, const string& calling_function) +std::string dna_import::ParseScalePValue(const std::string& sBuf, const std::string& calling_function) { if (sBuf.length() <= dml_.msr_gps_pscale) return "1"; - string scalar; + std::string scalar; try { if (sBuf.length() > dml_.msr_gps_lscale) @@ -2590,12 +2588,12 @@ string dna_import::ParseScalePValue(const string& sBuf, const string& calling_fu return scalar; } -string dna_import::ParseScaleLValue(const string& sBuf, const string& calling_function) +std::string dna_import::ParseScaleLValue(const std::string& sBuf, const std::string& calling_function) { if (sBuf.length() <= dml_.msr_gps_lscale) return "1"; - string scalar; + std::string scalar; try { if (sBuf.length() > dml_.msr_gps_hscale) @@ -2614,12 +2612,12 @@ string dna_import::ParseScaleLValue(const string& sBuf, const string& calling_fu return scalar; } -string dna_import::ParseScaleHValue(const string& sBuf, const string& calling_function) +std::string dna_import::ParseScaleHValue(const std::string& sBuf, const std::string& calling_function) { if (sBuf.length() <= dml_.msr_gps_hscale) return "1"; - string scalar; + std::string scalar; try { if (sBuf.length() > (dml_.msr_gps_reframe)) @@ -2638,7 +2636,7 @@ string dna_import::ParseScaleHValue(const string& sBuf, const string& calling_fu return scalar; } -string dna_import::ParseRefFrameValue(const string& sBuf, const string& calling_function) +std::string dna_import::ParseRefFrameValue(const std::string& sBuf, const std::string& calling_function) { // Override the reference frame with the user specified frame? if (projectSettings_.i.override_input_rfame) @@ -2647,7 +2645,7 @@ string dna_import::ParseRefFrameValue(const string& sBuf, const string& calling_ if (sBuf.length() <= dml_.msr_gps_reframe) return ""; - string frame; + std::string frame; try { if (sBuf.length() > (dml_.msr_gps_epoch)) frame = trimstr(sBuf.substr(dml_.msr_gps_reframe, dmw_.msr_gps_reframe)); // reference frame @@ -2662,14 +2660,14 @@ string dna_import::ParseRefFrameValue(const string& sBuf, const string& calling_ return frame; } -string dna_import::ParseEpochValue(const string& sBuf, const string& calling_function) +std::string dna_import::ParseEpochValue(const std::string& sBuf, const std::string& calling_function) { if (sBuf.length() <= dml_.msr_gps_epoch) return ""; - string epoch; + std::string epoch; try { - if (sBuf.length() > static_cast(dml_.msr_gps_epoch + dmw_.msr_gps_epoch)) + if (sBuf.length() > static_cast(dml_.msr_gps_epoch + dmw_.msr_gps_epoch)) epoch = trimstr(sBuf.substr(dml_.msr_gps_epoch, dmw_.msr_gps_epoch)); // epoch else epoch = trimstr(sBuf.substr(dml_.msr_gps_epoch)); @@ -2682,7 +2680,7 @@ string dna_import::ParseEpochValue(const string& sBuf, const string& calling_fun return epoch; } -string dna_import::ParseGPSMsrValue(const string& sBuf, const string& element, const string& calling_function) +std::string dna_import::ParseGPSMsrValue(const std::string& sBuf, const std::string& element, const std::string& calling_function) { try { return trimstr(sBuf.substr(dml_.msr_gps, dmw_.msr_gps)); // value @@ -2694,7 +2692,7 @@ string dna_import::ParseGPSMsrValue(const string& sBuf, const string& element, c return ""; } -string dna_import::ParseGPSVarValue(const string& sBuf, const string& element, const UINT32 location, const UINT32 width, const string& calling_function) +std::string dna_import::ParseGPSVarValue(const std::string& sBuf, const std::string& element, const UINT32 location, const UINT32 width, const std::string& calling_function) { try { return trimstr(sBuf.substr(location, width)); // variance @@ -2706,7 +2704,7 @@ string dna_import::ParseGPSVarValue(const string& sBuf, const string& element, c return ""; } -void dna_import::ParseDNAMSRAngular(const string& sBuf, dnaMsrPtr& msr_ptr) +void dna_import::ParseDNAMSRAngular(const std::string& sBuf, dnaMsrPtr& msr_ptr) { // Measurement type try { @@ -2782,7 +2780,7 @@ void dna_import::ParseDNAMSRAngular(const string& sBuf, dnaMsrPtr& msr_ptr) } -UINT32 dna_import::ParseDNAMSRDirections(string& sBuf, dnaMsrPtr& msr_ptr, bool ignoreMsr) +UINT32 dna_import::ParseDNAMSRDirections(std::string& sBuf, dnaMsrPtr& msr_ptr, bool ignoreMsr) { // Measurement type try { @@ -2847,7 +2845,7 @@ UINT32 dna_import::ParseDNAMSRDirections(string& sBuf, dnaMsrPtr& msr_ptr, bool import_file_mutex.unlock(); // get ignore flag for sub direction and remove accordingly - subignoreMsr = iequals("*", sBuf.substr(dml_.msr_ignore, dmw_.msr_ignore)); + subignoreMsr = boost::iequals("*", sBuf.substr(dml_.msr_ignore, dmw_.msr_ignore)); if (subignoreMsr) { @@ -2899,10 +2897,10 @@ void dna_import::RemoveIgnoredMeasurements(vdnaMsrPtr* vMeasurements, MsrTally* } -void dna_import::IncludeMeasurementTypes(const string& includeMsrs, vdnaMsrPtr* vMeasurements, MsrTally* parsemsrTally) +void dna_import::IncludeMeasurementTypes(const std::string& includeMsrs, vdnaMsrPtr* vMeasurements, MsrTally* parsemsrTally) { _it_vdnamsrptr _it_msr; - string msrTypes = includeMsrs; + std::string msrTypes = includeMsrs; // convert to upper case str_toupper(msrTypes); @@ -2981,10 +2979,10 @@ void dna_import::IncludeMeasurementTypes(const string& includeMsrs, vdnaMsrPtr* *parsemsrTally = msrtallyTmp; } -void dna_import::ExcludeMeasurementTypes(const string& excludeMsrs, vdnaMsrPtr* vMeasurements, MsrTally* parsemsrTally) +void dna_import::ExcludeMeasurementTypes(const std::string& excludeMsrs, vdnaMsrPtr* vMeasurements, MsrTally* parsemsrTally) { _it_vdnamsrptr _it_msr; - string msrTypes = excludeMsrs; + std::string msrTypes = excludeMsrs; // convert to upper case str_toupper(msrTypes); @@ -3070,7 +3068,7 @@ void dna_import::ExcludeAllOutsideBoundingBox(vdnaStnPtr* vStations, vdnaMsrPtr* vdnaStnPtr bvStation = *vStations; // TestNotEqualStationName requires vStations to be sorted (for binary_search) - sort(vStations->begin(), vStations->end()); + std::sort(vStations->begin(), vStations->end()); // Remove all stations outside the bounding box // vExcludedStns will contain the names of all the stations (if any) that were outside the bounding box. @@ -3089,7 +3087,7 @@ void dna_import::ExcludeAllOutsideBoundingBox(vdnaStnPtr* vStations, vdnaMsrPtr* }); // FindMsrsConnectedToStns requires vExcludedStns to be sorted (for binary_search) - sort(vExcludedStns->begin(), vExcludedStns->end()); + std::sort(vExcludedStns->begin(), vExcludedStns->end()); // OK, now measurements... if (p.i.include_transcending_msrs == 1) @@ -3102,7 +3100,7 @@ void dna_import::ExcludeAllOutsideBoundingBox(vdnaStnPtr* vStations, vdnaMsrPtr* // restore station vector, and erase stations not in vIncludedStns *vStations = bvStation; vExcludedStns->clear(); - TestNotEqualStationName selectStnFunc(&vIncludedStns, vExcludedStns); + TestNotEqualStationName selectStnFunc(&vIncludedStns, vExcludedStns); erase_if(vStations, selectStnFunc); // Rebuild station tally @@ -3110,7 +3108,7 @@ void dna_import::ExcludeAllOutsideBoundingBox(vdnaStnPtr* vStations, vdnaMsrPtr* } -void dna_import::ExtractStnsAndAssociatedMsrs(const string& stnListInclude, const string& stnListExclude, vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, +void dna_import::ExtractStnsAndAssociatedMsrs(const std::string& stnListInclude, const std::string& stnListExclude, vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, StnTally* parsestnTally, MsrTally* parsemsrTally, pvstring vExcludedStns, const project_settings& p, bool& splitXmsrs, bool& splitYmsrs) { @@ -3119,7 +3117,7 @@ void dna_import::ExtractStnsAndAssociatedMsrs(const string& stnListInclude, cons // backup station vector vdnaStnPtr bvStations = *vStations; - const string *stnListIn; + const std::string *stnListIn; vstring vIncludedStns; pvstring pvStnsIn, pvStnsEx; @@ -3149,7 +3147,7 @@ void dna_import::ExtractStnsAndAssociatedMsrs(const string& stnListInclude, cons // TestNotEqualStationName requires stations to be sorted (for binary_search) strip_duplicates(pvStnsIn); // Strip duplicates and sort - sort(pvStnsIn->begin(), pvStnsIn->end()); + std::sort(pvStnsIn->begin(), pvStnsIn->end()); pvStnsEx->clear(); @@ -3158,20 +3156,20 @@ void dna_import::ExtractStnsAndAssociatedMsrs(const string& stnListInclude, cons // This list will be used to strip the corresponding measurements. if (!stnListInclude.empty()) { - TestNotEqualStationName selectStnFunc(pvStnsIn, pvStnsEx); + TestNotEqualStationName selectStnFunc(pvStnsIn, pvStnsEx); erase_if(vStations, selectStnFunc); } else { - TestEqualStationName selectStnFunc(pvStnsIn, pvStnsEx); + TestEqualStationName selectStnFunc(pvStnsIn, pvStnsEx); erase_if(vStations, selectStnFunc); pvStnsIn = &vIncludedStns; pvStnsEx = vExcludedStns; - sort(pvStnsIn->begin(), pvStnsIn->end()); + std::sort(pvStnsIn->begin(), pvStnsIn->end()); } // FindMsrsConnectedToStns requires vExcludedStns to be sorted (for binary_search) - sort(pvStnsEx->begin(), pvStnsEx->end()); + std::sort(pvStnsEx->begin(), pvStnsEx->end()); // OK, get all measurements connected associated with vIncludedStns, splitting clusters as necessary if (!stnListInclude.empty()) @@ -3187,7 +3185,7 @@ void dna_import::ExtractStnsAndAssociatedMsrs(const string& stnListInclude, cons // ExtractAssociatedMsrsConnectedToStns retrieves *vStations = bvStations; pvStnsEx->clear(); - TestNotEqualStationName selectStnFunc(pvStnsIn, pvStnsEx); + TestNotEqualStationName selectStnFunc(pvStnsIn, pvStnsEx); erase_if(vStations, selectStnFunc); // Rebuild station tally @@ -3228,12 +3226,12 @@ void dna_import::SplitClusterMsrs(vdnaMsrPtr& msrsConnectedToStns, void dna_import::SplitClusterMsrsConnectedToStns(vdnaMsrPtr* vClusterMsrs, pvstring pvIncludedStns, pvstring pvExcludedStns, bool& splitXmsrs, bool& splitYmsrs) { _it_vdnamsrptr _it_msr; - vector* vgpsBsls; - vector* vgpsPnts; - vector* vgpsCovs; - vector::iterator _it_gps_bsl; - vector::iterator _it_gps_pnt; - vector::iterator _it_gps_cov; + std::vector* vgpsBsls; + std::vector* vgpsPnts; + std::vector* vgpsCovs; + std::vector::iterator _it_gps_bsl; + std::vector::iterator _it_gps_pnt; + std::vector::iterator _it_gps_cov; UINT32 msr(0), index(0), subindex(0), keepCount; vUINT32 vIndices; @@ -3471,10 +3469,10 @@ void dna_import::ExtractAssociatedMsrsBoundingBox(vdnaMsrPtr* vMeasurements, Msr } -void dna_import::ExtractAssociatedStns_GX(vector* vGpsBaselines, pvstring pvUsedStns) +void dna_import::ExtractAssociatedStns_GX(std::vector* vGpsBaselines, pvstring pvUsedStns) { - string station; - vector::iterator _it_msr(vGpsBaselines->begin()); + std::string station; + std::vector::iterator _it_msr(vGpsBaselines->begin()); _it_pair_vstring it_msr_stns; for (_it_msr=vGpsBaselines->begin(); _it_msr!=vGpsBaselines->end(); _it_msr++) @@ -3484,7 +3482,7 @@ void dna_import::ExtractAssociatedStns_GX(vector* vGpsBaselines if (it_msr_stns.first == it_msr_stns.second) { pvUsedStns->push_back(station); - sort(pvUsedStns->begin(), pvUsedStns->end()); + std::sort(pvUsedStns->begin(), pvUsedStns->end()); } station = _it_msr->GetTarget(); @@ -3492,15 +3490,15 @@ void dna_import::ExtractAssociatedStns_GX(vector* vGpsBaselines if (it_msr_stns.first == it_msr_stns.second) { pvUsedStns->push_back(station); - sort(pvUsedStns->begin(), pvUsedStns->end()); + std::sort(pvUsedStns->begin(), pvUsedStns->end()); } } } -void dna_import::ExtractAssociatedStns_Y(vector* vGpsPoints, pvstring pvUsedStns) +void dna_import::ExtractAssociatedStns_Y(std::vector* vGpsPoints, pvstring pvUsedStns) { - string station; - vector< CDnaGpsPoint >::iterator _it_msr(vGpsPoints->begin()); + std::string station; + std::vector< CDnaGpsPoint >::iterator _it_msr(vGpsPoints->begin()); _it_pair_vstring it_msr_stns; for (_it_msr=vGpsPoints->begin(); _it_msr!=vGpsPoints->end(); _it_msr++) @@ -3510,15 +3508,15 @@ void dna_import::ExtractAssociatedStns_Y(vector* vGpsPoints, pvstr if (it_msr_stns.first == it_msr_stns.second) { pvUsedStns->push_back(station); - sort(pvUsedStns->begin(), pvUsedStns->end()); + std::sort(pvUsedStns->begin(), pvUsedStns->end()); } } } -void dna_import::ExtractAssociatedStns_D(vector* vDirections, pvstring pvUsedStns) +void dna_import::ExtractAssociatedStns_D(std::vector* vDirections, pvstring pvUsedStns) { - string station; - vector::iterator _it_msr(vDirections->begin()); + std::string station; + std::vector::iterator _it_msr(vDirections->begin()); _it_pair_vstring it_msr_stns; for (_it_msr=vDirections->begin(); _it_msr!=vDirections->end(); _it_msr++) @@ -3528,7 +3526,7 @@ void dna_import::ExtractAssociatedStns_D(vector* vDirections, pvs if (it_msr_stns.first == it_msr_stns.second) { pvUsedStns->push_back(station); - sort(pvUsedStns->begin(), pvUsedStns->end()); + std::sort(pvUsedStns->begin(), pvUsedStns->end()); } station = _it_msr->GetTarget(); @@ -3536,7 +3534,7 @@ void dna_import::ExtractAssociatedStns_D(vector* vDirections, pvs if (it_msr_stns.first == it_msr_stns.second) { pvUsedStns->push_back(station); - sort(pvUsedStns->begin(), pvUsedStns->end()); + std::sort(pvUsedStns->begin(), pvUsedStns->end()); } } } @@ -3544,11 +3542,11 @@ void dna_import::ExtractAssociatedStns_D(vector* vDirections, pvs void dna_import::ExtractAssociatedStns(vdnaMsrPtr* vMeasurements, pvstring pvUsedStns) { _it_vdnamsrptr _it_msr; - vector* vdirns; - vector* vgpsBsls; - vector* vgpsPnts; + std::vector* vdirns; + std::vector* vgpsBsls; + std::vector* vgpsPnts; - string station; + std::string station; _it_pair_vstring it_msr_stns; @@ -3580,7 +3578,7 @@ void dna_import::ExtractAssociatedStns(vdnaMsrPtr* vMeasurements, pvstring pvUse if (it_msr_stns.first == it_msr_stns.second) { pvUsedStns->push_back(station); - sort(pvUsedStns->begin(), pvUsedStns->end()); + std::sort(pvUsedStns->begin(), pvUsedStns->end()); } // Finished with single station measurements @@ -3604,7 +3602,7 @@ void dna_import::ExtractAssociatedStns(vdnaMsrPtr* vMeasurements, pvstring pvUse if (it_msr_stns.first == it_msr_stns.second) { pvUsedStns->push_back(station); - sort(pvUsedStns->begin(), pvUsedStns->end()); + std::sort(pvUsedStns->begin(), pvUsedStns->end()); } // Dual station measurements... @@ -3636,7 +3634,7 @@ void dna_import::ExtractAssociatedStns(vdnaMsrPtr* vMeasurements, pvstring pvUse if (it_msr_stns.first == it_msr_stns.second) { pvUsedStns->push_back(station); - sort(pvUsedStns->begin(), pvUsedStns->end()); + std::sort(pvUsedStns->begin(), pvUsedStns->end()); } } @@ -3667,7 +3665,7 @@ void dna_import::LoadBinaryFiles(pvstn_t binaryStn, pvmsr_t binaryMsr) dna_io_bms bms; bms.load_bms_file(projectSettings_.i.bms_file, binaryMsr, bms_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } } @@ -3685,7 +3683,7 @@ void dna_import::LoadSegmentationFile(pvmsr_t binaryMsr) true, binaryMsr, &v_measurementCount_, &v_unknownsCount_, &v_ContiguousNetList_, &v_parameterStationCount_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } } @@ -3697,21 +3695,21 @@ void dna_import::LoadDatabaseId() if (databaseIDsLoaded_) return; - string dbid_filename = formPath(projectSettings_.g.output_folder, + std::string dbid_filename = formPath(projectSettings_.g.output_folder, projectSettings_.g.network_name, "dbid"); - stringstream ss; + std::stringstream ss; v_msr_db_map_.clear(); std::ifstream dbid_file; try { // Create geoid file. Throws runtime_error on failure. file_opener(dbid_file, dbid_filename, - ios::in | ios::binary, binary); + std::ios::in | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } UINT32 r, recordCount; @@ -3747,7 +3745,7 @@ void dna_import::LoadDatabaseId() } catch (const std::ifstream::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } @@ -3762,15 +3760,15 @@ void dna_import::ImportStnsMsrsFromNetwork(vdnaStnPtr* vStations, vdnaMsrPtr* vM // Load Database IDs LoadDatabaseId(); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw XMLInteropException(e.what(), 0); } if ((p.i.import_network_number + 1) > v_ContiguousNetList_.size()) { - stringstream ss; + std::stringstream ss; ss << "The specified network ID " << p.i.import_network_number << - " does not exist in the list of " << endl << + " does not exist in the list of " << std::endl << " identified contiguous Network IDs (0 to " << (v_ContiguousNetList_.size() - 1) << ")."; throw XMLInteropException(ss.str(), 0); } @@ -3943,15 +3941,15 @@ void dna_import::ImportStnsMsrsFromBlock(vdnaStnPtr* vStations, vdnaMsrPtr* vMea // Load Database IDs LoadDatabaseId(); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw XMLInteropException(e.what(), 0); } if (p.i.import_block_number > v_ISL_.size()) { - stringstream ss; + std::stringstream ss; ss << "The specified block number " << p.i.import_block_number << - " exceeds the total number of " << endl << + " exceeds the total number of " << std::endl << " segmented blocks (" << v_ISL_.size() << ")."; throw XMLInteropException(ss.str(), 0); } @@ -4092,10 +4090,10 @@ void dna_import::RemoveNonMeasurements(const UINT32& block, pvmsr_t binaryMsr) if (v_CML_.at(block).size() < 2) return; CompareNonMeasStart measstartCompareFunc(binaryMsr, xMeas); - sort(v_CML_.at(block).begin(), v_CML_.at(block).end(), measstartCompareFunc); + std::sort(v_CML_.at(block).begin(), v_CML_.at(block).end(), measstartCompareFunc); erase_if(v_CML_.at(block), measstartCompareFunc); CompareMsrFileOrder fileorderCompareFunc(binaryMsr); - sort(v_CML_.at(block).begin(), v_CML_.at(block).end(), fileorderCompareFunc); + std::sort(v_CML_.at(block).begin(), v_CML_.at(block).end(), fileorderCompareFunc); } @@ -4130,22 +4128,22 @@ void dna_import::SignalComplete() import_file_mutex.unlock(); } -void dna_import::SignalExceptionParse(string msg, int i) +void dna_import::SignalExceptionParse(std::string msg, int i) { SignalComplete(); size_t s = msg.find("is not allowed for content model"); - if (s != string::npos) + if (s != std::string::npos) msg += "\n - check that the order of elements in the XML file matches the order of the XSD complex type elements."; parseStatus_ = PARSE_EXCEPTION_RAISED; throw XMLInteropException(msg, i); } -void dna_import::SignalExceptionParseDNA(const string& message, const string& sBuf, const int& column_no) +void dna_import::SignalExceptionParseDNA(const std::string& message, const std::string& sBuf, const int& column_no) { - stringstream ss; - ss << message << endl; + std::stringstream ss; + ss << message << std::endl; if (!sBuf.empty()) - ss << " " << sBuf << endl; + ss << " " << sBuf << std::endl; m_columnNo = column_no + 1; throw XMLInteropException(ss.str(), m_lineNo); } @@ -4155,7 +4153,7 @@ void dna_import::SignalExceptionParseDNA(const string& message, const string& sB // Purpose: Closes all files (if file pointers are passed in) and throws XMLInteropException // Called by: Any // Calls: XMLInteropException() -void dna_import::SignalExceptionInterop(string msg, int i, const char *streamType, ...) +void dna_import::SignalExceptionInterop(std::string msg, int i, const char *streamType, ...) { if (streamType == NULL) throw XMLInteropException(msg, i); @@ -4188,7 +4186,7 @@ void dna_import::SignalExceptionInterop(string msg, int i, const char *streamTyp throw XMLInteropException(msg, i); } -void dna_import::SerialiseMSR(vdnaMsrPtr* vMeasurements, const string& msrfilename, +void dna_import::SerialiseMSR(vdnaMsrPtr* vMeasurements, const std::string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta) { // Measurements @@ -4197,7 +4195,7 @@ void dna_import::SerialiseMSR(vdnaMsrPtr* vMeasurements, const string& msrfilena // Create DynAdjust MSR file. file_opener(dna_msr_file, msrfilename); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } @@ -4208,7 +4206,7 @@ void dna_import::SerialiseMSR(vdnaMsrPtr* vMeasurements, const string& msrfilena dna_header(dna_msr_file, "3.01", "MSR", datum_.GetName(), datum_.GetEpoch_s(), vMeasurements->size()); // Capture source files - string source_files(formatStnMsrFileSourceString(vinput_file_meta, msr_data)); + std::string source_files(formatStnMsrFileSourceString(vinput_file_meta, msr_data)); // Write header comment lines about this file dna_comment(dna_msr_file, "File type: Measurement file"); @@ -4223,15 +4221,15 @@ void dna_import::SerialiseMSR(vdnaMsrPtr* vMeasurements, const string& msrfilena } catch (const std::ifstream::failure& f) { - SignalExceptionInterop(static_cast(f.what()), 0, "o", &dna_msr_file); + SignalExceptionInterop(static_cast(f.what()), 0, "o", &dna_msr_file); } catch (const XMLInteropException& e) { - SignalExceptionInterop(static_cast(e.what()), 0, "o", &dna_msr_file); + SignalExceptionInterop(static_cast(e.what()), 0, "o", &dna_msr_file); } } -void dna_import::SerialiseSTN(vdnaStnPtr* vStations, const string& stnfilename, +void dna_import::SerialiseSTN(vdnaStnPtr* vStations, const std::string& stnfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused) { // Stations @@ -4240,7 +4238,7 @@ void dna_import::SerialiseSTN(vdnaStnPtr* vStations, const string& stnfilename, // Create DynAdjust STN file. file_opener(dna_stn_file, stnfilename); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } @@ -4270,7 +4268,7 @@ void dna_import::SerialiseSTN(vdnaStnPtr* vStations, const string& stnfilename, dna_header(dna_stn_file, "3.01", "STN", datum_.GetName(), datum_.GetEpoch_s(), count); // Capture source files - string source_files(formatStnMsrFileSourceString(vinput_file_meta, stn_data)); + std::string source_files(formatStnMsrFileSourceString(vinput_file_meta, stn_data)); // Write header comment lines about this file dna_comment(dna_stn_file, "File type: Station file"); @@ -4301,15 +4299,15 @@ void dna_import::SerialiseSTN(vdnaStnPtr* vStations, const string& stnfilename, } catch (const std::ifstream::failure& f) { - SignalExceptionInterop(static_cast(f.what()), 0, "o", &dna_stn_file); + SignalExceptionInterop(static_cast(f.what()), 0, "o", &dna_stn_file); } catch (const XMLInteropException& e) { - SignalExceptionInterop(static_cast(e.what()), 0, "o", &dna_stn_file); + SignalExceptionInterop(static_cast(e.what()), 0, "o", &dna_stn_file); } } void dna_import::SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, - const string& stnfilename, const string& msrfilename, + const std::string& stnfilename, const std::string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused) { try @@ -4317,7 +4315,7 @@ void dna_import::SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, // Reset the default datum. datum_.SetDatumFromEpsg(m_strProjectDefaultEpsg, m_strProjectDefaultEpoch); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } @@ -4332,12 +4330,12 @@ void dna_import::SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, void dna_import::InitialiseDynaMLFile(const project_settings& p, vifm_t* vinput_file_meta, - const string& outfilename, std::ofstream* dynaml_file) + const std::string& outfilename, std::ofstream* dynaml_file) { // create combined filename - string dynamlfilename(outfilename); - size_t dp = string::npos; - if ((dp = dynamlfilename.rfind(".")) == string::npos) + std::string dynamlfilename(outfilename); + size_t dp = std::string::npos; + if ((dp = dynamlfilename.rfind(".")) == std::string::npos) dynamlfilename += ".xml"; try @@ -4345,7 +4343,7 @@ void dna_import::InitialiseDynaMLFile(const project_settings& p, vifm_t* vinput_ // Reset the default datum. datum_.SetDatumFromEpsg(m_strProjectDefaultEpsg, m_strProjectDefaultEpoch); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } @@ -4357,30 +4355,30 @@ void dna_import::InitialiseDynaMLFile(const project_settings& p, vifm_t* vinput_ dynaml_header(*dynaml_file, "Combined File", datum_.GetName(), datum_.GetEpoch_s()); // Capture source files - string source_files(formatStnMsrFileSourceString(vinput_file_meta, stn_msr_data)); + std::string source_files(formatStnMsrFileSourceString(vinput_file_meta, stn_msr_data)); // Write header comment lines about this file dynaml_comment(*dynaml_file, "File type: Combined station and measurements file"); dynaml_comment(*dynaml_file, "Project name: " + p.g.network_name); dynaml_comment(*dynaml_file, "Source files: " + source_files); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } } // A useful, but unnecessary function // -//void dna_import::SerialiseDynaMLfromBinary(const string& outfilename, +//void dna_import::SerialiseDynaMLfromBinary(const std::string& outfilename, // const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused) //{ // // Load stations from binary file and serialise to XML // std::ifstream bst_file; // try { // // Load binary stations data. Throws runtime_error on failure. -// file_opener(bst_file, p.i.bst_file, ios::in | ios::binary, binary, true); +// file_opener(bst_file, p.i.bst_file, std::ios::in | std::ios::binary, binary, true); // } -// catch (const runtime_error& e) { +// catch (const std::runtime_error& e) { // SignalExceptionInterop(e.what(), 0, NULL); // } // @@ -4391,17 +4389,17 @@ void dna_import::InitialiseDynaMLFile(const project_settings& p, vifm_t* vinput_ // try { // SerialiseXmlStn(&bst_file, &dynaml_file); // } -// catch (const ios_base::failure& f) { -// SignalExceptionInterop(static_cast(f.what()), 0, +// catch (const std::ios_base::failure& f) { +// SignalExceptionInterop(static_cast(f.what()), 0, // "io", &bst_file, &dynaml_file); // } // // std::ifstream bms_file; // try { // // Load binary measurements data. Throws runtime_error on failure. -// file_opener(bms_file, p.i.bms_file, ios::in | ios::binary, binary, true); +// file_opener(bms_file, p.i.bms_file, std::ios::in | std::ios::binary, binary, true); // } -// catch (const runtime_error& e) { +// catch (const std::runtime_error& e) { // SignalExceptionInterop(e.what(), 0, NULL); // } // @@ -4410,28 +4408,28 @@ void dna_import::InitialiseDynaMLFile(const project_settings& p, vifm_t* vinput_ // SerialiseXmlMsr(&bst_file, &bms_file, &dynaml_file); // } // catch (const std::ifstream::failure& f) { -// SignalExceptionInterop(static_cast(f.what()), 0, +// SignalExceptionInterop(static_cast(f.what()), 0, // "iio", &bst_file, &bms_file, &dynaml_file); // } // catch (const XMLInteropException& e) { -// SignalExceptionInterop(static_cast(e.what()), 0, +// SignalExceptionInterop(static_cast(e.what()), 0, // "iio", &bst_file, &bms_file, &dynaml_file); // } // // bst_file.close(); // bms_file.close(); -// dynaml_file << "" << endl; +// dynaml_file << "" << std::endl; // dynaml_file.close(); //} void dna_import::SerialiseDynaMLfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, - const string& outfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused) + const std::string& outfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused) { // create combined filename - string dynamlfilename(outfilename); - size_t dp = string::npos; - if ((dp = dynamlfilename.rfind(".")) == string::npos) + std::string dynamlfilename(outfilename); + size_t dp = std::string::npos; + if ((dp = dynamlfilename.rfind(".")) == std::string::npos) dynamlfilename += ".xml"; try @@ -4439,7 +4437,7 @@ void dna_import::SerialiseDynaMLfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* vM // Reset the default datum. datum_.SetDatumFromEpsg(m_strProjectDefaultEpsg, m_strProjectDefaultEpoch); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } @@ -4447,7 +4445,7 @@ void dna_import::SerialiseDynaMLfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* vM InitialiseDynaMLFile(p, vinput_file_meta, outfilename, &dynaml_file); CDnaProjection projection(UTM); - string comment(""); + std::string comment(""); try { // Write the stations (from memory) @@ -4476,28 +4474,28 @@ void dna_import::SerialiseDynaMLfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* vM }); } catch (const std::ifstream::failure& f) { - SignalExceptionInterop(static_cast(f.what()), 0, + SignalExceptionInterop(static_cast(f.what()), 0, "o", &dynaml_file); } catch (const XMLInteropException& e) { - SignalExceptionInterop(static_cast(e.what()), 0, + SignalExceptionInterop(static_cast(e.what()), 0, "o", &dynaml_file); } - dynaml_file << "" << endl; + dynaml_file << "" << std::endl; dynaml_file.close(); } void dna_import::InitialiseDynaMLSepStationFile(const project_settings& p, vifm_t* vinput_file_meta, - const string& stnfilename, std::ofstream* dynaml_stn_file) + const std::string& stnfilename, std::ofstream* dynaml_stn_file) { try { // Reset the default datum. datum_.SetDatumFromEpsg(m_strProjectDefaultEpsg, m_strProjectDefaultEpoch); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } @@ -4509,20 +4507,20 @@ void dna_import::InitialiseDynaMLSepStationFile(const project_settings& p, vifm_ dynaml_header(*dynaml_stn_file, "Station File", datum_.GetName(), datum_.GetEpoch_s()); // Capture source files - string source_files(formatStnMsrFileSourceString(vinput_file_meta, stn_data)); + std::string source_files(formatStnMsrFileSourceString(vinput_file_meta, stn_data)); // Write header comment lines about this file dynaml_comment(*dynaml_stn_file, "File type: Station file"); dynaml_comment(*dynaml_stn_file, "Project name: " + p.g.network_name); dynaml_comment(*dynaml_stn_file, "Source files: " + source_files); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } } void dna_import::InitialiseDynaMLSepMeasurementFile(const project_settings& p, vifm_t* vinput_file_meta, - const string& msrfilename, std::ofstream* dynaml_msr_file) + const std::string& msrfilename, std::ofstream* dynaml_msr_file) { try { // Create DynaML measurement file. @@ -4532,30 +4530,30 @@ void dna_import::InitialiseDynaMLSepMeasurementFile(const project_settings& p, v dynaml_header(*dynaml_msr_file, "Measurement File", datum_.GetName(), datum_.GetEpoch_s()); // Capture source files - string source_files(formatStnMsrFileSourceString(vinput_file_meta, msr_data)); + std::string source_files(formatStnMsrFileSourceString(vinput_file_meta, msr_data)); // Write header comment lines about this file dynaml_comment(*dynaml_msr_file, "File type: Measurement file"); dynaml_comment(*dynaml_msr_file, "Project name: " + p.g.network_name); dynaml_comment(*dynaml_msr_file, "Source files: " + source_files); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } } // A useful, but unnecessary function // -//void dna_import::SerialiseDynaMLSepfromBinary(const string& stnfilename, const string& msrfilename, +//void dna_import::SerialiseDynaMLSepfromBinary(const std::string& stnfilename, const std::string& msrfilename, // const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused) //{ // // Load stations from binary file and serialise to XML // std::ifstream bst_file; // try { // // Load binary stations data. Throws runtime_error on failure. -// file_opener(bst_file, p.i.bst_file, ios::in | ios::binary, binary, true); +// file_opener(bst_file, p.i.bst_file, std::ios::in | std::ios::binary, binary, true); // } -// catch (const runtime_error& e) { +// catch (const std::runtime_error& e) { // SignalExceptionInterop(e.what(), 0, NULL); // } // @@ -4566,20 +4564,20 @@ void dna_import::InitialiseDynaMLSepMeasurementFile(const project_settings& p, v // // Write the stations (from binary file) // try { // SerialiseXmlStn(&bst_file, &dynaml_stn_file); -// dynaml_stn_file << "" << endl; +// dynaml_stn_file << "" << std::endl; // dynaml_stn_file.close(); // } -// catch (const ios_base::failure& f) { -// SignalExceptionInterop(static_cast(f.what()), 0, +// catch (const std::ios_base::failure& f) { +// SignalExceptionInterop(static_cast(f.what()), 0, // "io", &bst_file, &dynaml_stn_file); // } // // std::ifstream bms_file; // try { // // Load binary measurements data. Throws runtime_error on failure. -// file_opener(bms_file, p.i.bms_file, ios::in | ios::binary, binary, true); +// file_opener(bms_file, p.i.bms_file, std::ios::in | std::ios::binary, binary, true); // } -// catch (const runtime_error& e) { +// catch (const std::runtime_error& e) { // SignalExceptionInterop(e.what(), 0, NULL); // } // @@ -4590,15 +4588,15 @@ void dna_import::InitialiseDynaMLSepMeasurementFile(const project_settings& p, v // // Write the measurements (from binary file) // try { // SerialiseXmlMsr(&bst_file, &bms_file, &dynaml_msr_file); -// dynaml_msr_file << "" << endl; +// dynaml_msr_file << "" << std::endl; // dynaml_msr_file.close(); // } // catch (const std::ifstream::failure& f) { -// SignalExceptionInterop(static_cast(f.what()), 0, +// SignalExceptionInterop(static_cast(f.what()), 0, // "iio", &bst_file, &bms_file, &dynaml_msr_file); // } // catch (const XMLInteropException& e) { -// SignalExceptionInterop(static_cast(e.what()), 0, +// SignalExceptionInterop(static_cast(e.what()), 0, // "iio", &bst_file, &bms_file, &dynaml_msr_file); // } // @@ -4608,7 +4606,7 @@ void dna_import::InitialiseDynaMLSepMeasurementFile(const project_settings& p, v void dna_import::SerialiseDynaMLSepfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, - const string& stnfilename, const string& msrfilename, + const std::string& stnfilename, const std::string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused) { // Create Station file and initialise header @@ -4616,7 +4614,7 @@ void dna_import::SerialiseDynaMLSepfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* InitialiseDynaMLSepStationFile(p, vinput_file_meta, stnfilename, &dynaml_stn_file); CDnaProjection projection(UTM); - string comment(""); + std::string comment(""); // Write the stations (from memory) try { @@ -4638,15 +4636,15 @@ void dna_import::SerialiseDynaMLSepfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* }); } - dynaml_stn_file << "" << endl; + dynaml_stn_file << "" << std::endl; dynaml_stn_file.close(); } catch (const std::ifstream::failure& f) { - SignalExceptionInterop(static_cast(f.what()), 0, "o", &dynaml_stn_file); + SignalExceptionInterop(static_cast(f.what()), 0, "o", &dynaml_stn_file); } catch (const XMLInteropException& e) { - SignalExceptionInterop(static_cast(e.what()), 0, "o", &dynaml_stn_file); + SignalExceptionInterop(static_cast(e.what()), 0, "o", &dynaml_stn_file); } // Create Measurement file and initialise header @@ -4660,27 +4658,27 @@ void dna_import::SerialiseDynaMLSepfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* msr->WriteDynaMLMsr(&dynaml_msr_file, comment); }); - dynaml_msr_file << "" << endl; + dynaml_msr_file << "" << std::endl; dynaml_msr_file.close(); } catch (const std::ifstream::failure& f) { - SignalExceptionInterop(static_cast(f.what()), 0, "o", &dynaml_msr_file); + SignalExceptionInterop(static_cast(f.what()), 0, "o", &dynaml_msr_file); } catch (const XMLInteropException& e) { - SignalExceptionInterop(static_cast(e.what()), 0, "o", &dynaml_msr_file); + SignalExceptionInterop(static_cast(e.what()), 0, "o", &dynaml_msr_file); } } -//void dna_import::SerialiseGeoidData(vdnaStnPtr* vStations, const string& geofilename) +//void dna_import::SerialiseGeoidData(vdnaStnPtr* vStations, const std::string& geofilename) //{ // std::ofstream dynaml_geo_file; // try { // // Create geoid file. Throws runtime_error on failure. // file_opener(dynaml_geo_file, geofilename); // } -// catch (const runtime_error& e) { +// catch (const std::runtime_error& e) { // SignalExceptionInterop(e.what(), 0, NULL); // } // @@ -4697,10 +4695,10 @@ void dna_import::SerialiseDynaMLSepfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* // // } // catch (const std::ifstream::failure& f) { -// SignalExceptionInterop(static_cast(f.what()), 0, "o", &dynaml_geo_file); +// SignalExceptionInterop(static_cast(f.what()), 0, "o", &dynaml_geo_file); // } // catch (const XMLInteropException& e) { -// SignalExceptionInterop(static_cast(e.what()), 0, "o", &dynaml_geo_file); +// SignalExceptionInterop(static_cast(e.what()), 0, "o", &dynaml_geo_file); // } //} @@ -4714,7 +4712,7 @@ void dna_import::SerialiseDynaMLSepfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* // // Reset the default datum. // datum_.SetDatumFromEpsg(m_strProjectDefaultEpsg, m_strProjectDefaultEpoch); // } -// catch (const runtime_error& e) { +// catch (const std::runtime_error& e) { // SignalExceptionInterop(e.what(), 0, NULL); // } // @@ -4748,7 +4746,7 @@ void dna_import::SerialiseDynaMLSepfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* // // Reset the default datum. // datum_.SetDatumFromEpsg(m_strProjectDefaultEpsg, m_strProjectDefaultEpoch); // } -// catch (const runtime_error& e) { +// catch (const std::runtime_error& e) { // SignalExceptionInterop(e.what(), 0, NULL); // } // @@ -4758,7 +4756,7 @@ void dna_import::SerialiseDynaMLSepfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* // // // get number of measurements // UINT32 msrCount; -// string comment(""); +// std::string comment(""); // ifs_msrs->read(reinterpret_cast(&msrCount), sizeof(UINT32)); // // for (UINT32 i=0; i(f.what()), 0, NULL); + SignalExceptionInterop(static_cast(f.what()), 0, NULL); } catch (const XMLInteropException& e) { - SignalExceptionInterop(static_cast(e.what()), 0, NULL); + SignalExceptionInterop(static_cast(e.what()), 0, NULL); } } -void dna_import::PrintMeasurementsToStations(string& m2s_file, MsrTally* parsemsrTally, - string& bst_file, string& bms_file, string& aml_file, pvASLPtr vAssocStnList) +void dna_import::PrintMeasurementsToStations(std::string& m2s_file, MsrTally* parsemsrTally, + std::string& bst_file, std::string& bms_file, std::string& aml_file, pvASLPtr vAssocStnList) { dna_io_aml aml; vmsrtally v_stnmsrTally; @@ -4886,7 +4884,7 @@ void dna_import::PrintMeasurementsToStations(string& m2s_file, MsrTally* parsems // Load aml file. Throws runtime_error on failure. aml.load_aml_file(aml_file, &vAssocMsrList, &bmsBinaryRecords); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } @@ -4904,7 +4902,7 @@ void dna_import::PrintMeasurementsToStations(string& m2s_file, MsrTally* parsems { // sort summary according to measurement to station count CompareMeasCount2 msrcountCompareFunc(vAssocStnList); - sort(vStationList.begin(), vStationList.end(), msrcountCompareFunc); + std::sort(vStationList.begin(), vStationList.end(), msrcountCompareFunc); } break; case orig_stn_sort_ui: @@ -4912,7 +4910,7 @@ void dna_import::PrintMeasurementsToStations(string& m2s_file, MsrTally* parsems { // sort summary according to original station file order CompareStnFileOrder stnorderCompareFunc(&bstBinaryRecords); - sort(vStationList.begin(), vStationList.end(), stnorderCompareFunc); + std::sort(vStationList.begin(), vStationList.end(), stnorderCompareFunc); } break; } @@ -4926,23 +4924,23 @@ void dna_import::PrintMeasurementsToStations(string& m2s_file, MsrTally* parsems // Print formatted header print_file_header(m2s_stream, "DYNADJUST MEASUREMENT TO STATION OUTPUT FILE"); - m2s_stream << setw(PRINT_VAR_PAD) << left << "File name:" << system_complete(m2s_file).string() << endl << endl; + m2s_stream << std::setw(PRINT_VAR_PAD) << std::left << "File name:" << boost::filesystem::system_complete(m2s_file).string() << std::endl << std::endl; - m2s_stream << setw(PRINT_VAR_PAD) << left << "Associated measurement file: " << system_complete(aml_file).string() << endl; - m2s_stream << setw(PRINT_VAR_PAD) << left << "Stations file:" << system_complete(bst_file).string() << endl; - m2s_stream << setw(PRINT_VAR_PAD) << left << "Measurements file:" << system_complete(bms_file).string() << endl; + m2s_stream << std::setw(PRINT_VAR_PAD) << std::left << "Associated measurement file: " << boost::filesystem::system_complete(aml_file).string() << std::endl; + m2s_stream << std::setw(PRINT_VAR_PAD) << std::left << "Stations file:" << boost::filesystem::system_complete(bst_file).string() << std::endl; + m2s_stream << std::setw(PRINT_VAR_PAD) << std::left << "Measurements file:" << boost::filesystem::system_complete(bms_file).string() << std::endl; // Print station count - m2s_stream << endl; - m2s_stream << setw(PRINT_VAR_PAD) << left << "No. stations:" << vStationList.size() << endl; + m2s_stream << std::endl; + m2s_stream << std::setw(PRINT_VAR_PAD) << std::left << "No. stations:" << vStationList.size() << std::endl; - m2s_stream << OUTPUTLINE << endl << endl; + m2s_stream << OUTPUTLINE << std::endl << std::endl; aml.write_msr_to_stn(m2s_stream, &bstBinaryRecords, &vStationList, v_stnmsrTally, parsemsrTally); m2s_stream.close(); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } } @@ -4950,27 +4948,27 @@ void dna_import::PrintMeasurementsToStations(string& m2s_file, MsrTally* parsems // First item in the file is a UINT32 value - the number of records in the file // All records are of type UINT32 -void dna_import::SerialiseAml(const string& aml_filename, pvUINT32 vAML) +void dna_import::SerialiseAml(const std::string& aml_filename, pvUINT32 vAML) { try { // write the aml file. dna_io_aml aml; aml.write_aml_file(aml_filename, vAML); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } } -void dna_import::SerialiseAmlTextFile(const string& bms_filename, const string& aml_filename, pvUINT32 vAML, pvASLPtr vAssocStnList, vdnaStnPtr* vStations) +void dna_import::SerialiseAmlTextFile(const std::string& bms_filename, const std::string& aml_filename, pvUINT32 vAML, pvASLPtr vAssocStnList, vdnaStnPtr* vStations) { try { // write the aml file as raw text. dna_io_aml aml; aml.write_aml_file_txt(bms_filename, aml_filename + ".txt", vAML, vAssocStnList, vStations); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } } @@ -4978,14 +4976,14 @@ void dna_import::SerialiseAmlTextFile(const string& bms_filename, const string& // First item in the file is a UINT32 value - the number of records in the file // All records are of type ASLPtr -void dna_import::SerialiseAsl(const string& filename, pvASLPtr vAssocStnList) +void dna_import::SerialiseAsl(const std::string& filename, pvASLPtr vAssocStnList) { try { // write the asl file. dna_io_asl asl; asl.write_asl_file(filename, vAssocStnList); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } } @@ -4993,14 +4991,14 @@ void dna_import::SerialiseAsl(const string& filename, pvASLPtr vAssocStnList) // First item in the file is a UINT32 value - the number of records in the file // All records are of type ASLPtr -void dna_import::SerialiseAslTextFile(const string& filename, pvASLPtr vAssocStnList, vdnaStnPtr* vStations) +void dna_import::SerialiseAslTextFile(const std::string& filename, pvASLPtr vAssocStnList, vdnaStnPtr* vStations) { try { // write the ASCII version of the asl file. dna_io_asl asl; asl.write_asl_file_txt(filename + ".txt", vAssocStnList, vStations); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } } @@ -5016,10 +5014,10 @@ UINT32 dna_import::RemoveDuplicateStations(vdnaStnPtr* vStations, _it_vdnastnptr _it_stn_newend; // sort vStations on name and if equal, sort on file order - sort(vStations->begin(), vStations->end(), CompareStationName()); + std::sort(vStations->begin(), vStations->end(), CompareStationName()); vduplicateStations->clear(); - EqualStationNameSaveDuplicates duplicateStnCompareFunc(vduplicateStations); + EqualStationNameSaveDuplicates duplicateStnCompareFunc(vduplicateStations); _it_stn_newend = unique(vStations->begin(), vStations->end(), duplicateStnCompareFunc); if (_it_stn_newend != vStations->end()) @@ -5031,7 +5029,7 @@ UINT32 dna_import::RemoveDuplicateStations(vdnaStnPtr* vStations, // search nearby stations using a radial search // // begin by sorting on latitude - sort(vStations->begin(), vStations->end(), CompareLatitude()); + std::sort(vStations->begin(), vStations->end(), CompareLatitude()); vnearbyStations->clear(); NearbyStation_LowAcc @@ -5047,10 +5045,10 @@ UINT32 dna_import::RemoveDuplicateStations(vdnaStnPtr* vStations, copy_if_all_occurrences(vStations->begin(), vStations->end(), nearbyStnHCompareFunc); // sort station pairs by name - sort(vnearbyStations->begin(), vnearbyStations->end(), CompareStationPairs()); + std::sort(vnearbyStations->begin(), vnearbyStations->end(), CompareStationPairs()); // sort by station name - sort(vStations->begin(), vStations->end()); + std::sort(vStations->begin(), vStations->end()); return static_cast(vnearbyStations->size()); } @@ -5059,7 +5057,7 @@ UINT32 dna_import::RemoveDuplicateStations(vdnaStnPtr* vStations, UINT32 dna_import::FindSimilarMeasurements(vdnaMsrPtr* vMeasurements, vdnaMsrPtr* vSimilarMeasurements) { // sort measurements list by Type then by First station - sort(vMeasurements->begin(), vMeasurements->end(), CompareMsr()); + std::sort(vMeasurements->begin(), vMeasurements->end(), CompareMsr()); //bool similar; int similar_msrs_found(0); @@ -5201,8 +5199,8 @@ UINT32 dna_import::FindSimilarMeasurements(vdnaMsrPtr* vMeasurements, vdnaMsrPtr continue; break; default: - stringstream ss; - ss << "FindSimilarMeasurements(): Unknown measurement type: " << _it_msr->get()->GetTypeC() << endl; + std::stringstream ss; + ss << "FindSimilarMeasurements(): Unknown measurement type: " << _it_msr->get()->GetTypeC() << std::endl; throw XMLInteropException(ss.str(), 0); } @@ -5221,7 +5219,7 @@ UINT32 dna_import::FindSimilarGXMeasurements(vdnaMsrPtr* vMeasurements, vdnaMsrP vdnaMsrPtr vMeasurementsG(*vMeasurements); // Strip non-GX measurements - string msrTypes("GX"); + std::string msrTypes("GX"); CompareNonMeasType meastypeCompareFuncGX(msrTypes); erase_if(vMeasurementsG, meastypeCompareFuncGX); @@ -5246,10 +5244,10 @@ UINT32 dna_import::FindSimilarGXMeasurements(vdnaMsrPtr* vMeasurements, vdnaMsrP _it_vdnamsrptr _it_msrG(vMeasurementsG.begin()); vstring stationsX; - vector *vgpsBslsX, *vgpsBslsG; - string epochX, epochG; - date dateObsX, dateObsG; - stringstream strdiffDays; + std::vector *vgpsBslsX, *vgpsBslsG; + std::string epochX, epochG; + boost::gregorian::date dateObsX, dateObsG; + std::stringstream strdiffDays; size_t diffDays; vUINT32 cluster_ids; @@ -5257,9 +5255,9 @@ UINT32 dna_import::FindSimilarGXMeasurements(vdnaMsrPtr* vMeasurements, vdnaMsrP for (_it_vdnamsrptr _it_msrX(vMeasurementsX.begin()); _it_msrX!=vMeasurementsX.end(); ++_it_msrX) { vgpsBslsX = _it_msrX->get()->GetBaselines_ptr(); - GetGXMsrStations(vgpsBslsX, stationsX); + GetGXMsrStations(vgpsBslsX, stationsX); - sort(stationsX.begin(), stationsX.end()); + std::sort(stationsX.begin(), stationsX.end()); similarG = false; @@ -5286,10 +5284,10 @@ UINT32 dna_import::FindSimilarGXMeasurements(vdnaMsrPtr* vMeasurements, vdnaMsrP epochX = _it_msrX->get()->GetEpoch(); epochG = _it_msrG->get()->GetEpoch(); - dateObsX = dateFromString(epochX); - dateObsG = dateFromString(epochG); + dateObsX = dateFromString(epochX); + dateObsG = dateFromString(epochG); - days dateDifference = dateObsX - dateObsG; + boost::gregorian::days dateDifference = dateObsX - dateObsG; diffDays = abs(dateDifference.days()); //strdiffDays << "Elapsed days: " << dateDifference; @@ -5314,7 +5312,7 @@ UINT32 dna_import::FindSimilarGXMeasurements(vdnaMsrPtr* vMeasurements, vdnaMsrP // If required, ignore the measurements if (projectSettings_.i.ignore_similar_msr) { - sort(cluster_ids.begin(), cluster_ids.end()); + std::sort(cluster_ids.begin(), cluster_ids.end()); for (_it_msrG=vMeasurements->begin(); _it_msrG != vMeasurements->end(); _it_msrG++) IgnoreGXMeasurements(_it_msrG->get(), cluster_ids.begin(), cluster_ids.end()); } @@ -5332,7 +5330,7 @@ void dna_import::SortandMapStations(vdnaStnPtr* vStations) // sort on station name (by string, not int!!!) // Note that the sort order after this will be the final order - sort(vStations->begin(), vStations->end()); + std::sort(vStations->begin(), vStations->end()); // Create the Station-Name / ID map string_uint32_pair stnID; @@ -5345,7 +5343,7 @@ void dna_import::SortandMapStations(vdnaStnPtr* vStations) } // sort on station name (i.e. first of the pair) - sort(vStnsMap_sortName_.begin(), vStnsMap_sortName_.end(), StationNameIDCompareName()); + std::sort(vStnsMap_sortName_.begin(), vStnsMap_sortName_.end(), StationNameIDCompareName()); if (vStnsMap_sortName_.size() < stnCount) throw XMLInteropException("SortandMapStations(): Could not allocate sufficient memory for the Station map.", 0); @@ -5362,7 +5360,7 @@ void dna_import::FullSortandMapStations(vdnaStnPtr* vStations, pv_string_uint32_ void dna_import::SortStationsForExport(vdnaStnPtr* vStations) { // Sort on original file order - sort(vStations->begin(), vStations->end(), CompareStnFileOrder_CDnaStn()); + std::sort(vStations->begin(), vStations->end(), CompareStnFileOrder_CDnaStn()); } @@ -5384,9 +5382,9 @@ void dna_import::ReduceStations(vdnaStnPtr* vStations, const CDnaProjection& pro void dna_import::RenameStations(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, project_settings* p) { - if (!exists(p->i.stn_renamingfile)) + if (!boost::filesystem::exists(p->i.stn_renamingfile)) { - string s("The station renaming file cannot be found:\n"); + std::string s("The station renaming file cannot be found:\n"); s.append(" ").append(p->i.stn_renamingfile); throw XMLInteropException(s, 0); } @@ -5402,7 +5400,7 @@ void dna_import::RenameStations(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements v_string_vstring_pair stationNames; dna_io_dna dna; dna.read_ren_file(p->i.stn_renamingfile, &stationNames); - sort(stationNames.begin(), stationNames.end()); + std::sort(stationNames.begin(), stationNames.end()); // rename stations in stations vector for_each(vStations->begin(), vStations->end(), @@ -5423,9 +5421,9 @@ void dna_import::RenameStations(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements }); _it_vdnamsrptr _it_msr(vMeasurements->begin()); - vector* vdirns; - vector* vgpsBsls; - vector* vgpsPnts; + std::vector* vdirns; + std::vector* vgpsBsls; + std::vector* vgpsPnts; // rename stations in each measurement for (_it_msr=vMeasurements->begin(); _it_msr != vMeasurements->end(); _it_msr++) @@ -5457,7 +5455,7 @@ void dna_import::RenameStations(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements } -void dna_import::RenameStationsBsl(vector* vGpsBaselines, +void dna_import::RenameStationsBsl(std::vector* vGpsBaselines, v_string_vstring_pair& stnRenaming) { for_each(vGpsBaselines->begin(), vGpsBaselines->end(), @@ -5467,7 +5465,7 @@ void dna_import::RenameStationsBsl(vector* vGpsBaselines, } -void dna_import::RenameStationsPnt(vector* vGpsPoints, +void dna_import::RenameStationsPnt(std::vector* vGpsPoints, v_string_vstring_pair& stnRenaming) { for_each(vGpsPoints->begin(), vGpsPoints->end(), @@ -5477,7 +5475,7 @@ void dna_import::RenameStationsPnt(vector* vGpsPoints, } -void dna_import::RenameStationsDir(vector* vDirections, +void dna_import::RenameStationsDir(std::vector* vDirections, v_string_vstring_pair& stnRenaming) { for_each(vDirections->begin(), vDirections->end(), @@ -5486,10 +5484,10 @@ void dna_import::RenameStationsDir(vector* vDirections, }); } -void dna_import::ApplyGNSSMsrScalar(vector::iterator& _it_bsl, vscl_t& bslScalars) +void dna_import::ApplyGNSSMsrScalar(std::vector::iterator& _it_bsl, vscl_t& bslScalars) { vscl_t::iterator _it_scalar; - CompareScalarStations< scalar_t, string> scalarComparisonFunc(_it_bsl->GetFirst(), _it_bsl->GetTarget()); + CompareScalarStations< scalar_t, std::string> scalarComparisonFunc(_it_bsl->GetFirst(), _it_bsl->GetTarget()); if ((_it_scalar = find_if(bslScalars.begin(), bslScalars.end(), scalarComparisonFunc)) != bslScalars.end()) { @@ -5518,9 +5516,9 @@ void dna_import::EditGNSSMsrScalars(vdnaMsrPtr* vMeasurements, project_settings* if (!p->i.scalar_file.empty()) { - if (!exists(p->i.scalar_file)) + if (!boost::filesystem::exists(p->i.scalar_file)) { - string s("The GNSS scalar file cannot be found:\n"); + std::string s("The GNSS scalar file cannot be found:\n"); s.append(" ").append(p->i.scalar_file); throw XMLInteropException(s, 0); } @@ -5531,12 +5529,12 @@ void dna_import::EditGNSSMsrScalars(vdnaMsrPtr* vMeasurements, project_settings* scalar.load_scalar_file(p->i.scalar_file, &bslScalars); } - sort(bslScalars.begin(), bslScalars.end(), CompareScalars()); + std::sort(bslScalars.begin(), bslScalars.end(), CompareScalars()); - vector* vgpsBsls; - vector::iterator _it_bsl; - vector* vgpsPnts; - vector::iterator _it_pnt; + std::vector* vgpsBsls; + std::vector::iterator _it_bsl; + std::vector* vgpsPnts; + std::vector::iterator _it_pnt; // set scalars first for (_it_msr=vMeasurements->begin(); _it_msr != vMeasurements->end(); _it_msr++) @@ -5620,71 +5618,71 @@ void dna_import::EditGNSSMsrScalars(vdnaMsrPtr* vMeasurements, project_settings* } -void dna_import::SerialiseMap(const string& stnmap_file) +void dna_import::SerialiseMap(const std::string& stnmap_file) { try { // write the aml file. dna_io_map map; map.write_map_file(stnmap_file, &vStnsMap_sortName_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } } -void dna_import::SerialiseMapTextFile(const string& stnmap_file) +void dna_import::SerialiseMapTextFile(const std::string& stnmap_file) { try { // write the aml file as raw text. dna_io_map map; map.write_map_file_txt(stnmap_file + ".txt", &vStnsMap_sortName_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } } -void dna_import::SerialiseDiscontTextFile(const string& discont_file) +void dna_import::SerialiseDiscontTextFile(const std::string& discont_file) { std::ofstream discont_outfile; try { - path discontFile(discont_file); - string outfileName = discontFile.filename().string(); + boost::filesystem::path discontFile(discont_file); + std::string outfileName = discontFile.filename().string(); outfileName.append(".discont"); // Open discontinuity output file. Throws runtime_error on failure. file_opener(discont_outfile, outfileName, - ios::out, ascii); + std::ios::out, ascii); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } try { discont_outfile << - setw(14) << left << "file_index" << - setw(14) << left << "solution_id" << - setw(STATION) << left << "site_name" << - setw(14) << "date_start" << - setw(14) << "date_end" << - setw(24) << "discontinuity_exists" << endl; + std::setw(14) << std::left << "file_index" << + std::setw(14) << std::left << "solution_id" << + std::setw(STATION) << std::left << "site_name" << + std::setw(14) << "date_start" << + std::setw(14) << "date_end" << + std::setw(24) << "discontinuity_exists" << std::endl; // Print discontinuity file. Throws runtime_error on failure. for_each(stn_discontinuities_.begin(), stn_discontinuities_.end(), [this, &discont_outfile](discontinuity_tuple& discont) { // use lambda expression discont_outfile << - setw(14) << left << discont.file_index << - setw(14) << left << discont.solution_id << - setw(STATION) << left << discont.site_name << - setw(14) << stringFromDate(discont.date_start) << - setw(14) << stringFromDate(discont.date_end) << - setw(24) << discont.discontinuity_exists << endl; + std::setw(14) << std::left << discont.file_index << + std::setw(14) << std::left << discont.solution_id << + std::setw(STATION) << std::left << discont.site_name << + std::setw(14) << stringFromDate(discont.date_start) << + std::setw(14) << stringFromDate(discont.date_end) << + std::setw(24) << discont.discontinuity_exists << std::endl; } ); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionParse(e.what(), 0); } @@ -5693,7 +5691,7 @@ void dna_import::SerialiseDiscontTextFile(const string& discont_file) void dna_import::SimulateMSR(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, - const string& msrfilename, + const std::string& msrfilename, const project_settings& p) { CDnaProjection projection(UTM); @@ -5706,7 +5704,7 @@ void dna_import::SimulateMSR(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, }); } catch (...) { - stringstream ss; + std::stringstream ss; ss << "SimulateMSR(): An unexpected error occurred when reducing station coordinates."; SignalExceptionInterop(ss.str(), 0, NULL); } @@ -5721,7 +5719,7 @@ void dna_import::SimulateMSR(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, }); } catch (...) { - stringstream ss; + std::stringstream ss; ss << "SimulateMSR(): An unexpected error occurred when simulating measurements."; SignalExceptionInterop(ss.str(), 0, NULL); } @@ -5735,7 +5733,7 @@ void dna_import::SimulateMSR(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, }); } catch (...) { - stringstream ss; + std::stringstream ss; ss << "SimulateMSR(): An unexpected error occurred when reducing station coordinates."; SignalExceptionInterop(ss.str(), 0, NULL); } @@ -5748,7 +5746,7 @@ void dna_import::SimulateMSR(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, // Create DynAdjust MSR file. file_opener(dna_msr_file, msrfilename); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } @@ -5769,10 +5767,10 @@ void dna_import::SimulateMSR(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, } catch (const std::ifstream::failure& f) { - SignalExceptionInterop(static_cast(f.what()), 0, "o", &dna_msr_file); + SignalExceptionInterop(static_cast(f.what()), 0, "o", &dna_msr_file); } catch (const XMLInteropException& e) { - SignalExceptionInterop(static_cast(e.what()), 0, "o", &dna_msr_file); + SignalExceptionInterop(static_cast(e.what()), 0, "o", &dna_msr_file); } } @@ -5799,7 +5797,7 @@ void dna_import::IgnoreInsufficientMeasurements(vdnaStnPtr* vStations, vdnaMsrPt bool foundInsufficientMeasurement; vdnaMsrPtr vignMsr, vignMsrTotal; - vector* vdirns; + std::vector* vdirns; vignMsrTotal.clear(); @@ -5891,7 +5889,7 @@ void dna_import::IgnoreInsufficientMeasurements(vdnaStnPtr* vStations, vdnaMsrPt break; if (!projectSettings_.g.quiet) - cout << "."; + std::cout << "."; // add the newly found insufficient measurements vPoorlyConstrainedStns->insert(vPoorlyConstrainedStns->end(), @@ -5900,7 +5898,7 @@ void dna_import::IgnoreInsufficientMeasurements(vdnaStnPtr* vStations, vdnaMsrPt vignMsr.clear(); // find measurements connected to these stations and ignore them - sort(vInsufficientMsrStns.begin(), vInsufficientMsrStns.end()); + std::sort(vInsufficientMsrStns.begin(), vInsufficientMsrStns.end()); for_each(vMeasurements->begin(), vMeasurements->end(), [&vInsufficientMsrStns, &vMeasurements, &vdirns, &vignMsr](dnaMsrPtr msr) { @@ -5985,7 +5983,7 @@ void dna_import::IgnoreInsufficientMeasurements(vdnaStnPtr* vStations, vdnaMsrPt } vdirns = msr.get()->GetDirections_ptr(); - vector< CDnaDirection >::iterator _it_dir; + std::vector< CDnaDirection >::iterator _it_dir; for (_it_dir = vdirns->begin(); _it_dir != vdirns->end(); ++_it_dir) { // test the individual directions, which if found, remove the direction from the vector @@ -6029,7 +6027,7 @@ void dna_import::IgnoreInsufficientMeasurements(vdnaStnPtr* vStations, vdnaMsrPt if (vPoorlyConstrainedStns->size() > 0) - sort(vPoorlyConstrainedStns->begin(), vPoorlyConstrainedStns->end()); + std::sort(vPoorlyConstrainedStns->begin(), vPoorlyConstrainedStns->end()); // add the insufficient measurements back to the final vector. // Note, these were ignored as part of the process above @@ -6048,14 +6046,14 @@ void dna_import::MapMeasurementStations(vdnaMsrPtr* vMeasurements, pvASLPtr vAss g_map_tally.initialise(); - ostringstream ss; + std::ostringstream ss; - vector* vdirns; - vector* vgpsBsls; - vector* vgpsPnts; + std::vector* vdirns; + std::vector* vgpsBsls; + std::vector* vgpsPnts; // Association list initialisation and variables - string at_station_name, to_station_name, to2_station_name; + std::string at_station_name, to_station_name, to2_station_name; UINT32 at_station_index, to_station_index, to2_station_index; vAssocStnList->clear(); vAssocStnList->resize(vStnsMap_sortName_.size()); @@ -6133,7 +6131,7 @@ void dna_import::MapMeasurementStations(vdnaMsrPtr* vMeasurements, pvASLPtr vAss ss << " to " << _it_msr->get()->GetTarget(); } - ss << " was not found in the list of network stations." << endl << + ss << " was not found in the list of network stations." << std::endl << " Please ensure that " << at_station_name << " is included in the input station file."; throw XMLInteropException(ss.str(), 0); @@ -6375,8 +6373,8 @@ UINT32 dna_import::ComputeMeasurementCount(vdnaMsrPtr* vMeasurements, const vUIN msr_tally.Z++; break; default: - stringstream ss; - ss << "ComputeMeasurementCount(): Unknown measurement type: " << _it_msr->get()->GetTypeC() << endl; + std::stringstream ss; + ss << "ComputeMeasurementCount(): Unknown measurement type: " << _it_msr->get()->GetTypeC() << std::endl; throw XMLInteropException(ss.str(), m_lineNo); } } @@ -6384,17 +6382,17 @@ UINT32 dna_import::ComputeMeasurementCount(vdnaMsrPtr* vMeasurements, const vUIN return msr_tally.TotalCount(); } -void dna_import::MapMeasurementStationsBsl(vector* vGpsBaselines, pvASLPtr vAssocStnList, PUINT32 lMapCount) +void dna_import::MapMeasurementStationsBsl(std::vector* vGpsBaselines, pvASLPtr vAssocStnList, PUINT32 lMapCount) { const size_t mapsize = vStnsMap_sortName_.size(); if (mapsize < 1) throw XMLInteropException("A station map has not been created. Run \"SortStations\" to create a station map.", 0); - ostringstream ss; + std::ostringstream ss; //_it_string_uint32_pair _it_stnmap(vStnsMap_sortName_.end()); - vector< CDnaGpsBaseline >::iterator _it_msr(vGpsBaselines->begin()); + std::vector< CDnaGpsBaseline >::iterator _it_msr(vGpsBaselines->begin()); - string station_name; + std::string station_name; UINT32 station_index; //, msrs_per_cluster_row; #ifdef _MSDEBUG @@ -6420,8 +6418,8 @@ void dna_import::MapMeasurementStationsBsl(vector* vGpsBaseline { ss.str(""); ss << station_name << " is referenced in measurement '" << _it_msr->GetType() << "' " << - _it_msr->GetFirst() << " - " << _it_msr->GetTarget() << endl; - ss << " but is not in the stations map. " << endl; + _it_msr->GetFirst() << " - " << _it_msr->GetTarget() << std::endl; + ss << " but is not in the stations map. " << std::endl; ss << " Please ensure that " << station_name << " is included in the list of stations."; throw XMLInteropException(ss.str(), 0); } @@ -6448,8 +6446,8 @@ void dna_import::MapMeasurementStationsBsl(vector* vGpsBaseline { ss.str(""); ss << station_name << " is referenced in measurement '" << _it_msr->GetType() << "' " << - _it_msr->GetFirst() << " - " << _it_msr->GetTarget() << endl; - ss << " but is not in the stations map. " << endl; + _it_msr->GetFirst() << " - " << _it_msr->GetTarget() << std::endl; + ss << " but is not in the stations map. " << std::endl; ss << " Please ensure that " << station_name << " is included in the list of stations."; throw XMLInteropException(ss.str(), 0); } @@ -6490,8 +6488,8 @@ void dna_import::MapMeasurementStationsBsl(vector* vGpsBaseline // set ID for each covariance term. This is for the convenience of assigning covariance terms // to the right index in dnaAdjust - vector< CDnaCovariance >::iterator _it_cov; - vector< CDnaGpsBaseline >::iterator _it_msr2(vGpsBaselines->begin()); + std::vector< CDnaCovariance >::iterator _it_cov; + std::vector< CDnaGpsBaseline >::iterator _it_msr2(vGpsBaselines->begin()); for (_it_msr = vGpsBaselines->begin(); _it_msr != vGpsBaselines->end(); _it_msr++) { @@ -6504,17 +6502,17 @@ void dna_import::MapMeasurementStationsBsl(vector* vGpsBaseline } } -void dna_import::MapMeasurementStationsPnt(vector* vGpsPoints, pvASLPtr vAssocStnList, PUINT32 lMapCount) +void dna_import::MapMeasurementStationsPnt(std::vector* vGpsPoints, pvASLPtr vAssocStnList, PUINT32 lMapCount) { const size_t mapsize = vStnsMap_sortName_.size(); if (mapsize < 1) throw XMLInteropException("A station map has not been created. Run \"SortStations\" to create a station map.", 0); - ostringstream ss; + std::ostringstream ss; //_it_string_uint32_pair _it_stnmap; - vector< CDnaGpsPoint >::iterator _it_msr; + std::vector< CDnaGpsPoint >::iterator _it_msr; - string station_name; + std::string station_name; UINT32 station_index; //, msrs_per_cluster_row; #ifdef _MSDEBUG @@ -6553,8 +6551,8 @@ void dna_import::MapMeasurementStationsPnt(vector* vGpsPoints, pvA // set ID for each covariance term. This is for the convenience of assigning covariance terms // to the right index in dnaAdjust - vector< CDnaCovariance >::iterator _it_cov; - vector< CDnaGpsPoint >::iterator _it_msr2(vGpsPoints->begin()); + std::vector< CDnaCovariance >::iterator _it_cov; + std::vector< CDnaGpsPoint >::iterator _it_msr2(vGpsPoints->begin()); for (_it_msr = vGpsPoints->begin(); _it_msr != vGpsPoints->end(); _it_msr++) { @@ -6568,17 +6566,17 @@ void dna_import::MapMeasurementStationsPnt(vector* vGpsPoints, pvA } -void dna_import::MapMeasurementStationsDir(vector* vDirections, pvASLPtr vAssocStnList, PUINT32 lMapCount) +void dna_import::MapMeasurementStationsDir(std::vector* vDirections, pvASLPtr vAssocStnList, PUINT32 lMapCount) { const size_t mapsize = vStnsMap_sortName_.size(); if (mapsize < 1) throw XMLInteropException("A station map has not been created. Run \"SortStations\" to create a station map.", 0); - ostringstream ss; + std::ostringstream ss; //_it_string_uint32_pair _it_stnmap; - vector< CDnaDirection >::iterator _it_msr(vDirections->begin()); + std::vector< CDnaDirection >::iterator _it_msr(vDirections->begin()); - string at_station_name, to_station_name; + std::string at_station_name, to_station_name; UINT32 at_station_index, to_station_index; // Unique list of stations involved in this cluster @@ -6677,9 +6675,9 @@ void dna_import::CompleteAssociationLists(vdnaMsrPtr* vMeasurements, pvASLPtr vA vAssocMsrList->clear(); vAssocMsrList->resize(msrstoAllStations); - vector* vDirns; - vector* vGpsBsls; - vector* vGpsPnts; + std::vector* vDirns; + std::vector* vGpsBsls; + std::vector* vGpsPnts; // reset ASL #measurements to zero for (_it_asl=vAssocStnList->begin(); _it_asl!=vAssocStnList->end(); _it_asl++) @@ -6814,12 +6812,12 @@ void dna_import::CompleteAssociationLists(vdnaMsrPtr* vMeasurements, pvASLPtr vA // // it_vUINT32 it_ignmsr, _it_stn_newend; // -// vector* vDirns; -// vector::iterator it_Dirns; -// vector* vGpsBsls; -// vector::iterator it_GpsBsls; -// vector* vGpsPnts; -// vector::iterator it_GpsPnts; +// std::vector* vDirns; +// std::vector::iterator it_Dirns; +// std::vector* vGpsBsls; +// std::vector::iterator it_GpsBsls; +// std::vector* vGpsPnts; +// std::vector::iterator it_GpsPnts; // // vUINT32 vIgnoredMsrStations; // // Iterate through the ignored measurement list and build unique list of stations in ignored measurements @@ -6879,19 +6877,19 @@ void dna_import::CompleteAssociationLists(vdnaMsrPtr* vMeasurements, pvASLPtr vA //} -void dna_import::CompleteASLDirections(_it_vdnamsrptr _it_msr, vector* vDirections, pvASLPtr vAssocStnList, +void dna_import::CompleteASLDirections(_it_vdnamsrptr _it_msr, std::vector* vDirections, pvASLPtr vAssocStnList, pvUINT32 vAssocMsrList, PUINT32 currentBmsFileIndex, const _AML_TYPE_ aml_type) { - ostringstream ss; + std::ostringstream ss; CAStationList* currentASL; - string station_name; + std::string station_name; UINT32 stn_indexAML, stnmsr_indexAML; const UINT32 msrstoAllStations = static_cast(vAssocMsrList->size()); const UINT32 bmsrIndex(*currentBmsFileIndex); - vector< CDnaDirection >::iterator _it_dir(vDirections->begin()); + std::vector< CDnaDirection >::iterator _it_dir(vDirections->begin()); // Unique list of stations involved in this cluster vUINT32 msrStations; @@ -6986,7 +6984,7 @@ void dna_import::CompleteASLDirections(_it_vdnamsrptr _it_msr, vectorat(*_it_stn).get()->IncrementMsrCount(); } -void dna_import::CompleteASLGpsBaselines(vector* vGpsBaselines, pvASLPtr vAssocStnList, +void dna_import::CompleteASLGpsBaselines(std::vector* vGpsBaselines, pvASLPtr vAssocStnList, pvUINT32 vAssocMsrList, PUINT32 currentBmsFileIndex, const _AML_TYPE_ aml_type) { CAStationList* currentASL; @@ -6995,7 +6993,7 @@ void dna_import::CompleteASLGpsBaselines(vector* vGpsBaselines, const UINT32 msrstoAllStations = static_cast(vAssocMsrList->size()); const UINT32 bmsrIndex(*currentBmsFileIndex); - vector< CDnaGpsBaseline >::iterator _it_msr(vGpsBaselines->begin()); + std::vector< CDnaGpsBaseline >::iterator _it_msr(vGpsBaselines->begin()); // Unique list of stations involved in this cluster vUINT32 msrStations; @@ -7075,7 +7073,7 @@ void dna_import::CompleteASLGpsBaselines(vector* vGpsBaselines, vAssocStnList->at(*_it_stn).get()->IncrementMsrCount(); } -void dna_import::CompleteASLGpsPoints(vector* vGpsPoints, pvASLPtr vAssocStnList, +void dna_import::CompleteASLGpsPoints(std::vector* vGpsPoints, pvASLPtr vAssocStnList, pvUINT32 vAssocMsrList, PUINT32 currentBmsFileIndex, const _AML_TYPE_ aml_type) { CAStationList* currentASL; @@ -7084,7 +7082,7 @@ void dna_import::CompleteASLGpsPoints(vector* vGpsPoints, pvASLPtr const UINT32 msrstoAllStations = static_cast(vAssocMsrList->size()); const UINT32 bmsrIndex(*currentBmsFileIndex); - vector< CDnaGpsPoint >::iterator _it_msr(vGpsPoints->begin()); + std::vector< CDnaGpsPoint >::iterator _it_msr(vGpsPoints->begin()); for (_it_msr=vGpsPoints->begin(); _it_msr != vGpsPoints->end(); _it_msr++) { @@ -7136,19 +7134,19 @@ void dna_import::CompleteASLGpsPoints(vector* vGpsPoints, pvASLPtr } } -_PARSE_STATUS_ dna_import::LoadDNAGeoidFile(const string& fileName, vdnaStnPtr* vStations) +_PARSE_STATUS_ dna_import::LoadDNAGeoidFile(const std::string& fileName, vdnaStnPtr* vStations) { std::ifstream geo_file; try { // Load geoid file. Throws runtime_error on failure. file_opener(geo_file, fileName, - ios::in, ascii, true); + std::ios::in, ascii, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionInterop(e.what(), 0, NULL); } - string geoidRec, station, nValue, primeMeridian, primeVertical; + std::string geoidRec, station, nValue, primeMeridian, primeVertical; double value; _it_vdnastnptr _it_stn; @@ -7168,8 +7166,8 @@ _PARSE_STATUS_ dna_import::LoadDNAGeoidFile(const string& fileName, vdnaStnPtr* geo_file.close(); return parseStatus_; } - stringstream ss; - ss << "LoadDNAGeoidFile(): Could not read from the geoid file." << endl; + std::stringstream ss; + ss << "LoadDNAGeoidFile(): Could not read from the geoid file." << std::endl; m_columnNo = 0; throw XMLInteropException(ss.str(), m_lineNo); } @@ -7194,8 +7192,8 @@ _PARSE_STATUS_ dna_import::LoadDNAGeoidFile(const string& fileName, vdnaStnPtr* station = trimstr(geoidRec.substr(0, 40)); } catch (...) { - stringstream ss; - ss << "LoadDNAGeoidFile(): Could not extract station name from the record: " << endl << " " << geoidRec << endl; + std::stringstream ss; + ss << "LoadDNAGeoidFile(): Could not extract station name from the record: " << std::endl << " " << geoidRec << std::endl; m_columnNo = 0; throw XMLInteropException(ss.str(), m_lineNo); } @@ -7211,8 +7209,8 @@ _PARSE_STATUS_ dna_import::LoadDNAGeoidFile(const string& fileName, vdnaStnPtr* nValue = trimstr(geoidRec.substr(40, 10)); } catch (...) { - stringstream ss; - ss << "LoadDNAGeoidFile(): Could not extract the N-value from the record: " << endl << " " << geoidRec << endl; + std::stringstream ss; + ss << "LoadDNAGeoidFile(): Could not extract the N-value from the record: " << std::endl << " " << geoidRec << std::endl; m_columnNo = 41; throw XMLInteropException(ss.str(), m_lineNo); } @@ -7222,8 +7220,8 @@ _PARSE_STATUS_ dna_import::LoadDNAGeoidFile(const string& fileName, vdnaStnPtr* primeMeridian = trimstr(geoidRec.substr(50, 19)); } catch (...) { - stringstream ss; - ss << "LoadDNAGeoidFile(): Could not extract the deflection in prime meridian from the record: " << endl << " " << geoidRec << endl; + std::stringstream ss; + ss << "LoadDNAGeoidFile(): Could not extract the deflection in prime meridian from the record: " << std::endl << " " << geoidRec << std::endl; m_columnNo = 51; throw XMLInteropException(ss.str(), m_lineNo); } @@ -7233,8 +7231,8 @@ _PARSE_STATUS_ dna_import::LoadDNAGeoidFile(const string& fileName, vdnaStnPtr* primeVertical = trimstr(geoidRec.substr(69)); } catch (...) { - stringstream ss; - ss << "LoadDNAGeoidFile(): Could not extract the deflection in prime meridian from the record: " << endl << " " << geoidRec << endl; + std::stringstream ss; + ss << "LoadDNAGeoidFile(): Could not extract the deflection in prime meridian from the record: " << std::endl << " " << geoidRec << std::endl; m_columnNo = 70; throw XMLInteropException(ss.str(), m_lineNo); } diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.hpp b/dynadjust/dynadjust/dnaimport/dnainterop.hpp index 4dea0358..2384a512 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.hpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.hpp @@ -79,10 +79,6 @@ #include #include -using namespace std; -using namespace boost; -using namespace boost::filesystem; - using namespace dynadjust::measurements; using namespace dynadjust::math; using namespace dynadjust::exception; @@ -110,22 +106,22 @@ class dna_import { public: // Parse an xml file - _PARSE_STATUS_ ParseInputFile(const string& filename, vdnaStnPtr* vStations, PUINT32 stnCount, + _PARSE_STATUS_ ParseInputFile(const std::string& filename, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, input_file_meta_t* input_file_meta, bool firstFILE, - string* success_msg, project_settings* p); + std::string* success_msg, project_settings* p); - _PARSE_STATUS_ LoadDNAGeoidFile(const string& fileName, vdnaStnPtr* vStations); + _PARSE_STATUS_ LoadDNAGeoidFile(const std::string& fileName, vdnaStnPtr* vStations); void RemoveIgnoredMeasurements(vdnaMsrPtr* vMeasurements, MsrTally* parsemsrTally); - void IncludeMeasurementTypes(const string& includeMsrs, vdnaMsrPtr* vMeasurements, MsrTally* parsemsrTally); - void ExcludeMeasurementTypes(const string& excludeMsrs, vdnaMsrPtr* vMeasurements, MsrTally* parsemsrTally); + void IncludeMeasurementTypes(const std::string& includeMsrs, vdnaMsrPtr* vMeasurements, MsrTally* parsemsrTally); + void ExcludeMeasurementTypes(const std::string& excludeMsrs, vdnaMsrPtr* vMeasurements, MsrTally* parsemsrTally); void IgnoreInsufficientMeasurements(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, pvstring vPoorlyConstrainedStns); void ExcludeAllOutsideBoundingBox(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, StnTally* parsestnTally, MsrTally* parsemsrTally, pvstring pvUnusedStns, const project_settings& p, bool& splitXmsrs, bool& splitYmsrs); - void ExtractStnsAndAssociatedMsrs(const string& stnListInclude, const string& stnListExclude, vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, + void ExtractStnsAndAssociatedMsrs(const std::string& stnListInclude, const std::string& stnListExclude, vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, StnTally* parsestnTally, MsrTally* parsemsrTally, pvstring vExcludedStns, const project_settings& p, bool& splitXmsrs, bool& splitYmsrs); void ImportStnsMsrsFromBlock(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const project_settings& p); @@ -141,43 +137,43 @@ class dna_import { void ReduceStations(vdnaStnPtr* vStations, const CDnaProjection& projection, const UINT32& cores); void RenameStations(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, project_settings* p); void ApplyDiscontinuities(vdnaMsrPtr* vMeasurements); - void TrackDiscontinuitySite(const string& site, const string& site_renamed); + void TrackDiscontinuitySite(const std::string& site, const std::string& site_renamed); void ApplyDiscontinuitiesMeasurements(vdnaMsrPtr* vMeasurements); - void ApplyDiscontinuitiesMeasurements_GX(vector* vGpsBaselines); - void ApplyDiscontinuitiesMeasurements_Y(vector* vGpsPoints); - void ApplyDiscontinuitiesMeasurements_D(vector* vDirections, const date& site_date); + void ApplyDiscontinuitiesMeasurements_GX(std::vector* vGpsBaselines); + void ApplyDiscontinuitiesMeasurements_Y(std::vector* vGpsPoints); + void ApplyDiscontinuitiesMeasurements_D(std::vector* vDirections, const boost::gregorian::date& site_date); void AddDiscontinuityStations(vdnaStnPtr* vstationsTotal); void EditGNSSMsrScalars(vdnaMsrPtr* vMeasurements, project_settings* p); - void ApplyGNSSMsrScalar(vector::iterator& _it_bsl, vscl_t& bslScalars); + void ApplyGNSSMsrScalar(std::vector::iterator& _it_bsl, vscl_t& bslScalars); void MapMeasurementStations(vdnaMsrPtr* vMeasurements, pvASLPtr vAssocStnList, PUINT32 lMapCount, pvstring vUnusedStns, pvUINT32 vIgnoredMsrs); UINT32 ComputeMeasurementCount(vdnaMsrPtr* vMeasurements, const vUINT32& vIgnoredMsrs); // file handling - void SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const string& stnfilename, const string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); - void SerialiseMSR(vdnaMsrPtr* vMeasurements, const string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta); - void SerialiseSTN(vdnaStnPtr* vStations, const string& stnfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused = false); - //void SerialiseDynaMLfromBinary(const string& outfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); - void SerialiseDynaMLfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const string& outfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); - //void SerialiseDynaMLSepfromBinary(const string& stnfilename, const string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); - void SerialiseDynaMLSepfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const string& stnfilename, const string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); - //void SerialiseGeoidData(vdnaStnPtr* vStations, const string& geofilename); - void SimulateMSR(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const string& msrfilename, const project_settings& p); - - void SerialiseBst(const string& bst_filename, vdnaStnPtr* vStations, pvstring vUnusedStns, vifm_t& vinput_file_meta, bool flagUnused=false); - void SerialiseBms(const string& bms_filename, vdnaMsrPtr* vMeasurements, vifm_t& vinput_file_meta); - void SerialiseMap(const string& stnmap_file); - void SerialiseAml(const string& filename, pvUINT32 vAssocMsrList); - void SerialiseAsl(const string& filename, pvASLPtr vAssocStnList); - void SerialiseMapTextFile(const string& stnmap_file); - void SerialiseDiscontTextFile(const string& discont_file); - void SerialiseAmlTextFile(const string& bms_filename, const string& aml_filename, pvUINT32 vAML, pvASLPtr vAssocStnList, vdnaStnPtr* vStations); - void SerialiseAslTextFile(const string& filename, pvASLPtr vAssocStnList, vdnaStnPtr* vStations); - - void SerialiseDatabaseId(const string& dbid_filename, pvdnaMsrPtr vMeasurements); + void SerialiseDNA(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const std::string& stnfilename, const std::string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); + void SerialiseMSR(vdnaMsrPtr* vMeasurements, const std::string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta); + void SerialiseSTN(vdnaStnPtr* vStations, const std::string& stnfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused = false); + //void SerialiseDynaMLfromBinary(const std::string& outfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); + void SerialiseDynaMLfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const std::string& outfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); + //void SerialiseDynaMLSepfromBinary(const std::string& stnfilename, const std::string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); + void SerialiseDynaMLSepfromMemory(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const std::string& stnfilename, const std::string& msrfilename, const project_settings& p, vifm_t* vinput_file_meta, bool flagUnused=false); + //void SerialiseGeoidData(vdnaStnPtr* vStations, const std::string& geofilename); + void SimulateMSR(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, const std::string& msrfilename, const project_settings& p); + + void SerialiseBst(const std::string& bst_filename, vdnaStnPtr* vStations, pvstring vUnusedStns, vifm_t& vinput_file_meta, bool flagUnused=false); + void SerialiseBms(const std::string& bms_filename, vdnaMsrPtr* vMeasurements, vifm_t& vinput_file_meta); + void SerialiseMap(const std::string& stnmap_file); + void SerialiseAml(const std::string& filename, pvUINT32 vAssocMsrList); + void SerialiseAsl(const std::string& filename, pvASLPtr vAssocStnList); + void SerialiseMapTextFile(const std::string& stnmap_file); + void SerialiseDiscontTextFile(const std::string& discont_file); + void SerialiseAmlTextFile(const std::string& bms_filename, const std::string& aml_filename, pvUINT32 vAML, pvASLPtr vAssocStnList, vdnaStnPtr* vStations); + void SerialiseAslTextFile(const std::string& filename, pvASLPtr vAssocStnList, vdnaStnPtr* vStations); + + void SerialiseDatabaseId(const std::string& dbid_filename, pvdnaMsrPtr vMeasurements); void CompleteAssociationLists(vdnaMsrPtr* vMeasurements, pvASLPtr vAssocStnList, pvUINT32 vAssocMsrList, const _AML_TYPE_ aml_type = str_msr); @@ -190,66 +186,66 @@ class dna_import { inline void ResetFileOrder() const { g_fileOrder = 0; } inline bool filespecifiedReferenceFrame() const { return _filespecifiedreferenceframe; } - void InitialiseDatum(const string& reference_frame, const string epoch=""); + void InitialiseDatum(const std::string& reference_frame, const std::string epoch=""); - void PrintMeasurementsToStations(string& m2s_file, MsrTally* parsemsrTally, - string& bst_file, string& bms_file, string& aml_file, pvASLPtr vAssocStnList); + void PrintMeasurementsToStations(std::string& m2s_file, MsrTally* parsemsrTally, + std::string& bst_file, std::string& bms_file, std::string& aml_file, pvASLPtr vAssocStnList); // Discontonuity file - void ParseDiscontinuities(const string& fileName); + void ParseDiscontinuities(const std::string& fileName); private: // DynaML files - void ParseXML(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, + void ParseXML(const std::string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, - string& fileEpsg, string& fileEpoch, bool firstFile, string* success_msg); + std::string& fileEpsg, std::string& fileEpoch, bool firstFile, std::string* success_msg); // SINEX files - void ParseSNX(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, + void ParseSNX(const std::string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID); // DNA Ascii files //void ParseDNAVersion(const INPUT_DATA_TYPE& idt); - void ParseDNA(const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, + void ParseDNA(const std::string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, - string& fileEpsg, string& fileEpoch, bool firstFile); + std::string& fileEpsg, std::string& fileEpoch, bool firstFile); void ParseDNASTN(vdnaStnPtr* vStations, PUINT32 stnCount, - const string& fileEpsg, const string& fileEpoch); + const std::string& fileEpsg, const std::string& fileEpoch); void ParseDNAMSR(pvdnaMsrPtr vMeasurements, PUINT32 msrCount, PUINT32 clusterID, - const string& fileEpsg, const string& fileEpoch); + const std::string& fileEpsg, const std::string& fileEpoch); //void SetDefaultReferenceFrame(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements); - void ParseDNAMSRAngular(const string& sBuf, dnaMsrPtr& msr_ptr); - void ParseDNAMSRCoordinate(const string& sBuf, dnaMsrPtr& msr_ptr); - UINT32 ParseDNAMSRDirections(string& sBuf, dnaMsrPtr& msr_ptr, bool ignoreMsr); - void ParseDNAMSRGPSBaselines(string& sBuf, dnaMsrPtr& msr_ptr, bool ignoreMsr); - void ParseDNAMSRGPSPoints(string& sBuf, dnaMsrPtr& msr_ptr, bool ignoreMsr); - void ParseDNAMSRLinear(const string& sBuf, dnaMsrPtr& msr_ptr); + void ParseDNAMSRAngular(const std::string& sBuf, dnaMsrPtr& msr_ptr); + void ParseDNAMSRCoordinate(const std::string& sBuf, dnaMsrPtr& msr_ptr); + UINT32 ParseDNAMSRDirections(std::string& sBuf, dnaMsrPtr& msr_ptr, bool ignoreMsr); + void ParseDNAMSRGPSBaselines(std::string& sBuf, dnaMsrPtr& msr_ptr, bool ignoreMsr); + void ParseDNAMSRGPSPoints(std::string& sBuf, dnaMsrPtr& msr_ptr, bool ignoreMsr); + void ParseDNAMSRLinear(const std::string& sBuf, dnaMsrPtr& msr_ptr); void ParseDNAMSRCovariance(CDnaCovariance& cov); - string ParseAngularValue(const string& sBuf, const string& calling_function); - string ParseLinearValue(const string& sBuf, const string& msrName, const string& calling_function); - string ParseGPSMsrValue(const string& sBuf, const string& element, const string& calling_function); - string ParseGPSVarValue(const string& sBuf, const string& element, const UINT32 location, const UINT32 width, const string& calling_function); - string ParseInstrumentValue(const string& sBuf, const string& calling_function); - string ParseTargetValue(const string& sBuf, const string& calling_function); - string ParseTarget2Value(const string& sBuf, const string& calling_function); - string ParseStdDevValue(const string& sBuf, const string& calling_function); - string ParseInstHeightValue(const string& sBuf, const string& calling_function); - string ParseTargHeightValue(const string& sBuf, const string& calling_function); - string ParseMsrCountValue(const string& sBuf, UINT32& msrCount, const string& calling_function); - string ParseScaleVValue(const string& sBuf, const string& calling_function); - string ParseScalePValue(const string& sBuf, const string& calling_function); - string ParseScaleLValue(const string& sBuf, const string& calling_function); - string ParseScaleHValue(const string& sBuf, const string& calling_function); - string ParseRefFrameValue(const string& sBuf, const string& calling_function); - string ParseEpochValue(const string& sBuf, const string& calling_function); - - void ParseDatabaseIds(const string& sBuf, const string& calling_function, const char msrType); - void ParseDatabaseClusterId(const string& sBuf, const string& calling_function); - void ParseDatabaseMsrId(const string& sBuf, const string& calling_function); + std::string ParseAngularValue(const std::string& sBuf, const std::string& calling_function); + std::string ParseLinearValue(const std::string& sBuf, const std::string& msrName, const std::string& calling_function); + std::string ParseGPSMsrValue(const std::string& sBuf, const std::string& element, const std::string& calling_function); + std::string ParseGPSVarValue(const std::string& sBuf, const std::string& element, const UINT32 location, const UINT32 width, const std::string& calling_function); + std::string ParseInstrumentValue(const std::string& sBuf, const std::string& calling_function); + std::string ParseTargetValue(const std::string& sBuf, const std::string& calling_function); + std::string ParseTarget2Value(const std::string& sBuf, const std::string& calling_function); + std::string ParseStdDevValue(const std::string& sBuf, const std::string& calling_function); + std::string ParseInstHeightValue(const std::string& sBuf, const std::string& calling_function); + std::string ParseTargHeightValue(const std::string& sBuf, const std::string& calling_function); + std::string ParseMsrCountValue(const std::string& sBuf, UINT32& msrCount, const std::string& calling_function); + std::string ParseScaleVValue(const std::string& sBuf, const std::string& calling_function); + std::string ParseScalePValue(const std::string& sBuf, const std::string& calling_function); + std::string ParseScaleLValue(const std::string& sBuf, const std::string& calling_function); + std::string ParseScaleHValue(const std::string& sBuf, const std::string& calling_function); + std::string ParseRefFrameValue(const std::string& sBuf, const std::string& calling_function); + std::string ParseEpochValue(const std::string& sBuf, const std::string& calling_function); + + void ParseDatabaseIds(const std::string& sBuf, const std::string& calling_function, const char msrType); + void ParseDatabaseClusterId(const std::string& sBuf, const std::string& calling_function); + void ParseDatabaseMsrId(const std::string& sBuf, const std::string& calling_function); void LoadNetworkFiles(pvstn_t binaryStn, pvmsr_t binaryMsr, const project_settings& projectSettings, bool loadSegmentFile); void LoadBinaryFiles(pvstn_t binaryStn, pvmsr_t binaryMsr); @@ -268,29 +264,29 @@ class dna_import { pvstring pvUsedStns, pvstring pvUnusedStns, const project_settings& p, bool& splitXmsrs, bool& splitYmsrs); void ExtractAssociatedStns(vdnaMsrPtr* vMeasurements, pvstring pvUsedStns); - void ExtractAssociatedStns_GX(vector* vGpsBaselines, pvstring pvUsedStns); - void ExtractAssociatedStns_Y(vector* vGpsPoints, pvstring pvUsedStns); - void ExtractAssociatedStns_D(vector* vDirections, pvstring pvUsedStns); + void ExtractAssociatedStns_GX(std::vector* vGpsBaselines, pvstring pvUsedStns); + void ExtractAssociatedStns_Y(std::vector* vGpsPoints, pvstring pvUsedStns); + void ExtractAssociatedStns_D(std::vector* vDirections, pvstring pvUsedStns); void SortandMapStations(vdnaStnPtr* vStations); - void MapMeasurementStationsBsl(vector* vGpsBaselines, + void MapMeasurementStationsBsl(std::vector* vGpsBaselines, pvASLPtr vAssocStnList, PUINT32 lMapCount); - void MapMeasurementStationsPnt(vector* vGpsPoints, + void MapMeasurementStationsPnt(std::vector* vGpsPoints, pvASLPtr vAssocStnList, PUINT32 lMapCount); - void MapMeasurementStationsDir(vector* vDirections, + void MapMeasurementStationsDir(std::vector* vDirections, pvASLPtr vAssocStnList, PUINT32 lMapCount); //void RenameStationsMsr(CDnaMeasurement* msr, v_string_string_pair& variables); - void RenameStationsBsl(vector* vGpsBaselines, v_string_vstring_pair& stnRenaming); - void RenameStationsPnt(vector* vGpsPoints, v_string_vstring_pair& stnRenaming); - void RenameStationsDir(vector* vDirections, v_string_vstring_pair& stnRenaming); + void RenameStationsBsl(std::vector* vGpsBaselines, v_string_vstring_pair& stnRenaming); + void RenameStationsPnt(std::vector* vGpsPoints, v_string_vstring_pair& stnRenaming); + void RenameStationsDir(std::vector* vDirections, v_string_vstring_pair& stnRenaming); - void CompleteASLDirections(_it_vdnamsrptr _it_msr, vector* vDirections, pvASLPtr vAssocStnList, + void CompleteASLDirections(_it_vdnamsrptr _it_msr, std::vector* vDirections, pvASLPtr vAssocStnList, pvUINT32 vAssocMsrList, PUINT32 currentBmsFileIndex, const _AML_TYPE_ aml_type); - void CompleteASLGpsBaselines(vector* vGpsBaselines, pvASLPtr vAssocStnList, + void CompleteASLGpsBaselines(std::vector* vGpsBaselines, pvASLPtr vAssocStnList, pvUINT32 vAssocMsrList, PUINT32 currentBmsFileIndex, const _AML_TYPE_ aml_type); - void CompleteASLGpsPoints(vector* vGpsPoints, pvASLPtr vAssocStnList, + void CompleteASLGpsPoints(std::vector* vGpsPoints, pvASLPtr vAssocStnList, pvUINT32 vAssocMsrList, PUINT32 currentBmsFileIndex, const _AML_TYPE_ aml_type); //void FindUnusedStationsInIgnoredMeasurements(vdnaMsrPtr* vMeasurements, pvASLPtr vAssocStnList, pvUINT32 vAssocMsrList, pvstring vUnusedStns, pvUINT32 vIgnoredMsrs); @@ -299,22 +295,22 @@ class dna_import { void SerialiseXmlMsr(std::ifstream* ifs_stns, std::ifstream* ifs_msrs, std::ofstream* ofs_dynaml); void InitialiseDynaMLSepStationFile(const project_settings& p, vifm_t* vinput_file_meta, - const string& stnfilename, std::ofstream* dynaml_stn_file); + const std::string& stnfilename, std::ofstream* dynaml_stn_file); void InitialiseDynaMLSepMeasurementFile(const project_settings& p, vifm_t* vinput_file_meta, - const string& msrfilename, std::ofstream* dynaml_msr_file); + const std::string& msrfilename, std::ofstream* dynaml_msr_file); void InitialiseDynaMLFile(const project_settings& p, vifm_t* vinput_file_meta, - const string& outfilename, std::ofstream* dynaml_file); + const std::string& outfilename, std::ofstream* dynaml_file); void DetermineBoundingBox(); - void BuildExtractStationsList(const string& stnList, pvstring vstnList); + void BuildExtractStationsList(const std::string& stnList, pvstring vstnList); void RemoveNonMeasurements(const UINT32& block, pvmsr_t binaryMsr); void SignalComplete(); - void SignalExceptionParseDNA(const string& message, const string& sBuf, const int& column_no); - void SignalExceptionParse(string msg, int i); - void SignalExceptionInterop(string msg, int i, const char *streamType, ...); + void SignalExceptionParseDNA(const std::string& message, const std::string& sBuf, const int& column_no); + void SignalExceptionParse(std::string msg, int i); + void SignalExceptionInterop(std::string msg, int i, const char *streamType, ...); project_settings projectSettings_; @@ -346,9 +342,9 @@ class dna_import { UINT32 m_lineNo; UINT32 m_columnNo; - string m_strProjectDefaultEpsg; - string m_strProjectDefaultEpoch; - string m_msrComments; + std::string m_strProjectDefaultEpsg; + std::string m_strProjectDefaultEpoch; + std::string m_msrComments; vvUINT32 v_ISL_; // Inner stations vvUINT32 v_JSL_; // Junction stations diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index 57a4629a..c495cb1b 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -16,7 +16,6 @@ #include -using namespace std; using namespace dynadjust::measurements; using namespace dynadjust::epsg; using namespace dynadjust::exception; @@ -195,9 +194,9 @@ void Directions_pimpl::post_Directions(const UINT32& total) if (t == 0) { - stringstream ss, ss2; + std::stringstream ss, ss2; ss << - "...', total of " << total << " element(s)" << endl << + "...', total of " << total << " element(s)" << std::endl << " - found 0 , or there aren't any non-ignored directions in the set. '"; ss2 << " ~ " << total << ""; throw ::xsd::cxx::parser::expected_element< char >( @@ -226,7 +225,7 @@ void DnaMeasurement_pimpl::Type(const ::std::string& Type) if (Type.empty()) throw XMLInteropException("\"Type\" element cannot be empty.", 0); - string frame, epoch; + std::string frame, epoch; if (_ReferenceframeTagSupplied || _overridereferenceframe) frame = _referenceframe; @@ -332,7 +331,7 @@ void DnaMeasurement_pimpl::Type(const ::std::string& Type) _dnaCurrentMsr.reset(new CDnaDirection); break; default: - stringstream ss; + std::stringstream ss; ss << "Unknown measurement type: " << Type; throw XMLInteropException(ss.str(), 0); } @@ -384,7 +383,7 @@ void DnaMeasurement_pimpl::Second(const ::std::string& Second) case 'X': // GPS Baseline cluster if (Second.empty()) { - stringstream ss; + std::stringstream ss; ss << "\"Second\" element cannot be empty for measurement type " << _dnaCurrentMsr->GetTypeC() << " (first station: " << _dnaCurrentMsr->GetFirst() << ")."; throw XMLInteropException(ss.str(), 0); @@ -402,7 +401,7 @@ void DnaMeasurement_pimpl::Third(const ::std::string& Third) case 'A': // Horizontal angle if (Third.empty()) { - stringstream ss; + std::stringstream ss; ss << "\"Third\" element cannot be empty for measurement type " << _dnaCurrentMsr->GetTypeC() << " (first station: " << _dnaCurrentMsr->GetFirst() << ")."; throw XMLInteropException(ss.str(), 0); @@ -437,7 +436,7 @@ void DnaMeasurement_pimpl::Value(const ::std::string& Value) case 'Z': // Vertical angle if (Value.empty()) { - stringstream ss; + std::stringstream ss; ss << "\"Value\" element cannot be empty for measurement type " << _dnaCurrentMsr->GetTypeC() << " (first station: " << _dnaCurrentMsr->GetFirst() << ")."; throw XMLInteropException(ss.str(), 0); @@ -472,14 +471,14 @@ void DnaMeasurement_pimpl::StdDev(const ::std::string& StdDev) case 'Z': // Vertical angle if (StdDev.empty()) { - stringstream ss; + std::stringstream ss; ss << "\"StdDev\" element cannot be empty for " << _dnaCurrentMsr->GetTypeC() << " measurements (first station: " << _dnaCurrentMsr->GetFirst() << ")."; throw XMLInteropException(ss.str(), 0); } if (DoubleFromString(StdDev) < PRECISION_1E25) { - stringstream ss; + std::stringstream ss; ss << "\"StdDev\" element cannot contain a zero or negative value for " << _dnaCurrentMsr->GetTypeC() << " measurements (first station: " << _dnaCurrentMsr->GetFirst() << ")."; throw XMLInteropException(ss.str(), 0); } @@ -587,14 +586,14 @@ void DnaMeasurement_pimpl::Epoch(const ::std::string& Epoch) _dnaCurrentMsr->SetEpoch(Epoch); _EpochTagSupplied = true; } - catch (const runtime_error& e) { - stringstream ss(""); + catch (const std::runtime_error& e) { + std::stringstream ss(""); ss << e.what(); - ss << " - Measurement type: " << _dnaCurrentMsr->GetType() << endl << - " - From: " << _dnaCurrentMsr->GetFirst() << endl << - " - To: " << _dnaCurrentMsr->GetTarget() << endl << - " - Reference frame: " << _dnaCurrentMsr->GetReferenceFrame() << endl << - " - Epoch: " << Epoch << endl; + ss << " - Measurement type: " << _dnaCurrentMsr->GetType() << std::endl << + " - From: " << _dnaCurrentMsr->GetFirst() << std::endl << + " - To: " << _dnaCurrentMsr->GetTarget() << std::endl << + " - Reference frame: " << _dnaCurrentMsr->GetReferenceFrame() << std::endl << + " - Epoch: " << Epoch << std::endl; throw XMLInteropException(ss.str(), 0); } } @@ -624,14 +623,14 @@ void DnaMeasurement_pimpl::ReferenceFrame(const ::std::string& ReferenceFrame) _dnaCurrentMsr->SetReferenceFrame(ReferenceFrame); _ReferenceframeTagSupplied = true; } - catch (const runtime_error& e) { - stringstream ss(""); + catch (const std::runtime_error& e) { + std::stringstream ss(""); ss << e.what(); - ss << " - Measurement type: " << _dnaCurrentMsr->GetType() << endl << - " - From: " << _dnaCurrentMsr->GetFirst() << endl << - " - To: " << _dnaCurrentMsr->GetTarget() << endl << - " - Reference frame: " << ReferenceFrame << endl << - " - Epoch: " << _dnaCurrentMsr->GetEpoch() << endl; + ss << " - Measurement type: " << _dnaCurrentMsr->GetType() << std::endl << + " - From: " << _dnaCurrentMsr->GetFirst() << std::endl << + " - To: " << _dnaCurrentMsr->GetTarget() << std::endl << + " - Reference frame: " << ReferenceFrame << std::endl << + " - Epoch: " << _dnaCurrentMsr->GetEpoch() << std::endl; throw XMLInteropException(ss.str(), 0); } } @@ -758,9 +757,9 @@ void DnaMeasurement_pimpl::post_DnaMeasurement() found = static_cast(_dnaCurrentMsr->GetDirections_ptr()->size()); if (total != found) { - stringstream ss, ss2; + std::stringstream ss, ss2; ss << - "...', total of " << total << " element(s)" << endl << + "...', total of " << total << " element(s)" << std::endl << " - found " << found << " in the set. '"; ss2 << " ~ " << total << ""; throw ::xsd::cxx::parser::expected_element< char >( @@ -779,9 +778,9 @@ void DnaMeasurement_pimpl::post_DnaMeasurement() if (found == 0 && _dnaCurrentMsr->NotIgnored()) { - stringstream ss, ss2; + std::stringstream ss, ss2; ss << - "...', total of " << total << " element(s)" << endl << + "...', total of " << total << " element(s)" << std::endl << " - There aren't any non-ignored directions in the set. "; ss2 << " ~ " << total << ""; throw ::xsd::cxx::parser::expected_element< char >( @@ -811,9 +810,9 @@ void DnaMeasurement_pimpl::post_DnaMeasurement() found = static_cast(_dnaCurrentMsr->GetBaselines_ptr()->size()); if (total != found) { - stringstream ss, ss2; + std::stringstream ss, ss2; ss << - "...', total of " << total << " element(s)" << endl << + "...', total of " << total << " element(s)" << std::endl << " - found " << found << " in the set. '"; ss2 << " ~ " << total << ""; throw ::xsd::cxx::parser::expected_element< char >( @@ -841,9 +840,9 @@ void DnaMeasurement_pimpl::post_DnaMeasurement() found = static_cast(_dnaCurrentMsr->GetPoints_ptr()->size()); if (total != found) { - stringstream ss, ss2; + std::stringstream ss, ss2; ss << - "...', total of " << total << " element(s)" << endl << + "...', total of " << total << " element(s)" << std::endl << " - found " << found << " in the set. '"; ss2 << " ~ " << total << ""; throw ::xsd::cxx::parser::expected_element< char >( @@ -874,7 +873,7 @@ void DnaMeasurement_pimpl::post_DnaMeasurement() void DnaStation_pimpl::pre() { - string frame, epoch; + std::string frame, epoch; if (_overridereferenceframe) frame = _referenceframe; @@ -931,7 +930,7 @@ void DnaStation_pimpl::post_DnaStation() // DnaXmlFormat_pimpl // -DnaXmlFormat_pimpl::DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, const string& referenceframe, const string& epoch, +DnaXmlFormat_pimpl::DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, const std::string& referenceframe, const std::string& epoch, bool firstFile, bool userspecifiedreferenceframe, bool userspecifiedepoch, bool overridereferenceframe) @@ -990,7 +989,7 @@ void DnaXmlFormat_pimpl::epoch() void DnaXmlFormat_pimpl::post_DnaXmlFormat(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements) { - ostringstream ss(""); + std::ostringstream ss(""); if (_station_count > 0) { ss << "Loaded " << _station_count << " stations"; @@ -1378,7 +1377,7 @@ void referenceframe_pimpl::pre() // For DynaML.xsd, the following is specified: // // In this case, post_string() will return "GDA2020" -void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, +void referenceframe_pimpl::post_type(std::string& referenceframe, std::string& fileEpsg, bool userspecifiedreferenceframe, bool firstFile) { // 1. Get the DnaXmlFormat referenceframe attribute value from the file @@ -1395,7 +1394,7 @@ void referenceframe_pimpl::post_type(string& referenceframe, string& fileEpsg, _referenceframe = referenceframe; // Capture epsg code for the file - fileEpsg = epsgStringFromName(_referenceframe); + fileEpsg = epsgStringFromName(_referenceframe); if (!userspecifiedreferenceframe) { @@ -1418,7 +1417,7 @@ void epoch_pimpl::pre() // For DynaML.xsd, the following is specified: // // In this case, post_string() will return "01.01.1994" -void epoch_pimpl::post_type(string& epoch, string& fileEpoch, +void epoch_pimpl::post_type(std::string& epoch, std::string& fileEpoch, bool userspecifiedreferenceframe, bool userspecifiedepoch, bool firstFile) { diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx index c462545d..7d27fbd7 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx @@ -18,8 +18,6 @@ #include #include -using namespace std; -using namespace boost; using namespace dynadjust::measurements; class Clusterpoint_pimpl: public virtual Clusterpoint_pskel @@ -40,15 +38,15 @@ public: virtual void post_Clusterpoint (); protected: - string _X; - string _Y; - string _Z; - string _SigmaXX; - string _SigmaXY; - string _SigmaXZ; - string _SigmaYY; - string _SigmaYZ; - string _SigmaZZ; + std::string _X; + std::string _Y; + std::string _Z; + std::string _SigmaXX; + std::string _SigmaXY; + std::string _SigmaXZ; + std::string _SigmaYY; + std::string _SigmaYZ; + std::string _SigmaZZ; }; class Directions_pimpl: public virtual Directions_pskel @@ -63,10 +61,10 @@ public: virtual void post_Directions (const UINT32&); protected: - string _Ignore; - string _Target; - string _Value; - string _StdDev; + std::string _Ignore; + std::string _Target; + std::string _Value; + std::string _StdDev; }; @@ -116,7 +114,7 @@ class DnaXmlFormat_pimpl: public virtual DnaXmlFormat_pskel { public: DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, - const string& referenceframe, const string& epoch, + const std::string& referenceframe, const std::string& epoch, bool firstFile, bool userspecifiedreferenceframe, bool userspecifiedepoch, bool overridereferenceframe); @@ -129,17 +127,17 @@ public: virtual void post_DnaXmlFormat (vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements); inline bool filespecifiedreferenceframe() { return _filespecifiedreferenceframe; } - string DnaXmlParseMessage() { return _parse_msg; } + std::string DnaXmlParseMessage() { return _parse_msg; } inline UINT32 NumStationsRead() const { return _station_count; } inline UINT32 NumMeasurementsRead() const { return _measurement_count; } inline UINT32 CurrentClusterID() const { return _clusterID; } - inline string FileEpsg() const { return _fileEpsg; } - inline string FileEpoch() const { return _fileEpoch; } + inline std::string FileEpsg() const { return _fileEpsg; } + inline std::string FileEpoch() const { return _fileEpoch; } protected: - string _parse_msg; + std::string _parse_msg; private: std::ifstream* is_; @@ -239,12 +237,12 @@ class referenceframe_pimpl: public virtual referenceframe_pskel, { public: virtual void pre (); - virtual void post_type (string& referenceframe, string& fileEpsg, + virtual void post_type (std::string& referenceframe, std::string& fileEpsg, bool userspecifiedreferenceframe, bool firstFile); - inline const string str() { return _referenceframe; } + inline const std::string str() { return _referenceframe; } protected: - string _referenceframe; + std::string _referenceframe; bool _overridereferenceframe; }; @@ -253,12 +251,12 @@ class epoch_pimpl: public virtual epoch_pskel, { public: virtual void pre (); - virtual void post_type (string& epoch, string& fileEpoch, + virtual void post_type (std::string& epoch, std::string& fileEpoch, bool userspecifiedreferenceframe, bool userspecifiedepoch, bool firstFile); - inline const string str() { return _epoch; } + inline const std::string str() { return _epoch; } protected: - string _epoch; + std::string _epoch; }; class system_pimpl: public virtual system_pskel, diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx index acada195..3f528191 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx @@ -42,7 +42,6 @@ #include -using namespace std; using namespace dynadjust::measurements; // Clusterpoint_pskel @@ -3193,15 +3192,15 @@ void type_pskel::post_type () } // referenceframe_pskel -// string& referenceframe, bool user_specified, bool override_referenceframe -void referenceframe_pskel::post_type (string&, string&, bool, bool) +// std::string& referenceframe, bool user_specified, bool override_referenceframe +void referenceframe_pskel::post_type (std::string&, std::string&, bool, bool) { } // epoch_pskel -// string& epoch, bool override_referenceframe -void epoch_pskel::post_type (string&, string&, bool, bool, bool) +// std::string& epoch, bool override_referenceframe +void epoch_pskel::post_type (std::string&, std::string&, bool, bool, bool) { } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx index 9fda286a..9092dc1b 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx @@ -99,8 +99,6 @@ class system_pskel; #include -using namespace std; -using namespace boost; using namespace dynadjust::measurements; namespace xml_schema @@ -478,20 +476,20 @@ public: // Initialisation - inline void InitfileEpsg(string& fileEpsg) { + inline void InitfileEpsg(std::string& fileEpsg) { _fileEpsg = fileEpsg; } - inline void InitfileEpoch(string& fileEpoch) { + inline void InitfileEpoch(std::string& fileEpoch) { _fileEpoch = fileEpoch; } - inline void SetDefaultReferenceFrame(string& referenceframe, bool overridereferenceframe) { + inline void SetDefaultReferenceFrame(std::string& referenceframe, bool overridereferenceframe) { _referenceframe = referenceframe; _overridereferenceframe = overridereferenceframe; } - inline void SetDefaultEpoch(string& epoch) { + inline void SetDefaultEpoch(std::string& epoch) { _epoch = epoch; } @@ -644,10 +642,10 @@ protected: PUINT32 _pMeasurementCount; PUINT32 _pclusterID; - string _fileEpoch; - string _fileEpsg; - string _epoch; - string _referenceframe; + std::string _fileEpoch; + std::string _fileEpsg; + std::string _epoch; + std::string _referenceframe; bool _EpochTagSupplied; bool _ReferenceframeTagSupplied; bool _overridereferenceframe; @@ -673,11 +671,11 @@ public: virtual void post_DnaStation (); // Initialisation - inline void InitfileEpsg(string& fileEpsg) { + inline void InitfileEpsg(std::string& fileEpsg) { _fileEpsg = fileEpsg; } - inline void InitfileEpoch(string& fileEpoch) { + inline void InitfileEpoch(std::string& fileEpoch) { _fileEpoch = fileEpoch; } @@ -686,12 +684,12 @@ public: _vParentStns = pStns; } - inline void SetDefaultReferenceFrame(string& referenceframe, bool overridereferenceframe) { + inline void SetDefaultReferenceFrame(std::string& referenceframe, bool overridereferenceframe) { _referenceframe = referenceframe; _overridereferenceframe = overridereferenceframe; } - inline void SetDefaultEpoch(string& epoch) { + inline void SetDefaultEpoch(std::string& epoch) { _epoch = epoch; } @@ -763,10 +761,10 @@ protected: vdnaStnPtr* _vParentStns; dnaStnPtr _dnaCurrentStn; - string _fileEpoch; - string _fileEpsg; - string _epoch; - string _referenceframe; + std::string _fileEpoch; + std::string _fileEpsg; + std::string _epoch; + std::string _referenceframe; bool _overridereferenceframe; }; @@ -843,10 +841,10 @@ protected: UINT32 _clusterID; UINT32 _measurement_count; UINT32 _station_count; - string _referenceframe; - string _epoch; - string _fileEpsg; - string _fileEpoch; + std::string _referenceframe; + std::string _epoch; + std::string _fileEpsg; + std::string _fileEpoch; bool _firstFile; bool _userspecifiedreferenceframe; bool _filespecifiedreferenceframe; @@ -1255,8 +1253,8 @@ public: // virtual void // pre (); - // string& referenceframe, bool user_specified, bool overridereferenceframe - virtual void post_type (string&, string&, bool, bool); + // std::string& referenceframe, bool user_specified, bool overridereferenceframe + virtual void post_type (std::string&, std::string&, bool, bool); }; class epoch_pskel: public virtual ::xml_schema::string_pskel @@ -1267,8 +1265,8 @@ public: // virtual void // pre (); - // string& referenceframe, bool overridereferenceframe - virtual void post_type (string&, string&, bool, bool, bool); + // std::string& referenceframe, bool overridereferenceframe + virtual void post_type (std::string&, std::string&, bool, bool, bool); }; class system_pskel: public virtual ::xml_schema::string_pskel diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index f7f13ccc..72879675 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -29,33 +29,33 @@ using namespace dynadjust::epsg; bool running; boost::mutex cout_mutex; -void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, project_settings* p, const string& header) +void PrintOutputFileHeaderInfo(std::ofstream* f_out, const std::string& out_file, project_settings* p, const std::string& header) { // Print formatted header print_file_header(*f_out, header); - *f_out << setw(PRINT_VAR_PAD) << left << "File name:" << system_complete(out_file).string() << endl << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "File name:" << boost::filesystem::system_complete(out_file).string() << std::endl << std::endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Command line arguments: "; - *f_out << p->i.command_line_arguments << endl << endl; - - *f_out << setw(PRINT_VAR_PAD) << left << "Network name:" << p->g.network_name << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Input folder: " << system_complete(p->g.input_folder).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Output folder: " << system_complete(p->g.output_folder).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Stations file:" << system_complete(p->i.bst_file).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Measurements file:" << system_complete(p->i.bms_file).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Associated station file:" << system_complete(p->i.asl_file).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Associated measurement file:" << system_complete(p->i.aml_file).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Duplicate stations output file:" << system_complete(p->i.dst_file).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Similar measurement output file:" << system_complete(p->i.dms_file).string() << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Command line arguments: "; + *f_out << p->i.command_line_arguments << std::endl << std::endl; + + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Network name:" << p->g.network_name << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Input folder: " << boost::filesystem::system_complete(p->g.input_folder).string() << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Output folder: " << boost::filesystem::system_complete(p->g.output_folder).string() << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Stations file:" << boost::filesystem::system_complete(p->i.bst_file).string() << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Measurements file:" << boost::filesystem::system_complete(p->i.bms_file).string() << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Associated station file:" << boost::filesystem::system_complete(p->i.asl_file).string() << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Associated measurement file:" << boost::filesystem::system_complete(p->i.aml_file).string() << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Duplicate stations output file:" << boost::filesystem::system_complete(p->i.dst_file).string() << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Similar measurement output file:" << boost::filesystem::system_complete(p->i.dms_file).string() << std::endl; if (!p->i.input_files.empty()) { _it_vstr _it_files(p->i.input_files.begin()); - string str("Input files:"); + std::string str("Input files:"); while (_it_files!=p->i.input_files.end()) { - *f_out << setw(PRINT_VAR_PAD) << left << str << *_it_files++ << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << str << *_it_files++ << std::endl; str = " "; } } @@ -64,63 +64,63 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, pro // If not, the assumption is, the project frame will be assumed from the first file and // in this case, it will be reported later if (p->i.user_supplied_frame) - *f_out << setw(PRINT_VAR_PAD) << left << "Project reference frame:" << p->i.reference_frame << " (user supplied)" << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Project reference frame:" << p->i.reference_frame << " (user supplied)" << std::endl; else - *f_out << setw(PRINT_VAR_PAD) << left << "Project reference frame:" << "To be assumed from the first input file" << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Project reference frame:" << "To be assumed from the first input file" << std::endl; if (p->i.override_input_rfame) - *f_out << setw(PRINT_VAR_PAD) << left << "Override input file ref frame:" << yesno_string(p->i.override_input_rfame) << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Override input file ref frame:" << yesno_string(p->i.override_input_rfame) << std::endl; if (p->i.user_supplied_epoch) - *f_out << setw(PRINT_VAR_PAD) << left << "Project epoch:" << p->i.epoch << " (user supplied)" << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Project epoch:" << p->i.epoch << " (user supplied)" << std::endl; else - *f_out << setw(PRINT_VAR_PAD) << left << "Project epoch:" << "To be assumed from the first input file" << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Project epoch:" << "To be assumed from the first input file" << std::endl; if (!p->i.include_msrs.empty()) - *f_out << setw(PRINT_VAR_PAD) << left << "Strip all measurements except:" << p->i.include_msrs << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Strip all measurements except:" << p->i.include_msrs << std::endl; else if (!p->i.exclude_msrs.empty()) - *f_out << setw(PRINT_VAR_PAD) << left << "Strip measurement types:" << p->i.exclude_msrs << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Strip measurement types:" << p->i.exclude_msrs << std::endl; if (p->i.ignore_insufficient_msrs == 1) - *f_out << setw(PRINT_VAR_PAD) << left << "Ignore insufficient measurements:" << "yes" << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Ignore insufficient measurements:" << "yes" << std::endl; if (p->i.search_nearby_stn) - *f_out << setw(PRINT_VAR_PAD) << left << "Search for nearby stations:" << "tolerance = " << p->i.search_stn_radius << "m" << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Search for nearby stations:" << "tolerance = " << p->i.search_stn_radius << "m" << std::endl; if (p->i.search_similar_msr) - *f_out << setw(PRINT_VAR_PAD) << left << "Search for similar measurements:" << "yes" << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Search for similar measurements:" << "yes" << std::endl; if (p->i.search_similar_msr_gx) - *f_out << setw(PRINT_VAR_PAD) << left << "Search for similar GNSS measurements:" << "yes" << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Search for similar GNSS measurements:" << "yes" << std::endl; if (!p->i.bounding_box.empty()) { - *f_out << setw(PRINT_VAR_PAD) << left << "Bounding box: " << p->i.bounding_box << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Bounding box: " << p->i.bounding_box << std::endl; if (p->i.split_clusters) - *f_out << setw(PRINT_VAR_PAD) << left << "Split GNSS clusters: " << (p->i.split_clusters ? "Yes" : "No") << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Split GNSS clusters: " << (p->i.split_clusters ? "Yes" : "No") << std::endl; } else { if (!p->i.stn_associated_msr_include.empty()) - *f_out << setw(PRINT_VAR_PAD) << left << "Stations to include: " << p->i.stn_associated_msr_include << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Stations to include: " << p->i.stn_associated_msr_include << std::endl; if (!p->i.stn_associated_msr_exclude.empty()) - *f_out << setw(PRINT_VAR_PAD) << left << "Stations to exclude: " << p->i.stn_associated_msr_exclude << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Stations to exclude: " << p->i.stn_associated_msr_exclude << std::endl; if (p->i.split_clusters) - *f_out << setw(PRINT_VAR_PAD) << left << "Split GNSS clusters: " << (p->i.split_clusters ? "Yes" : "No") << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Split GNSS clusters: " << (p->i.split_clusters ? "Yes" : "No") << std::endl; } if (!p->i.seg_file.empty()) - *f_out << setw(PRINT_VAR_PAD) << left << "Segmentation file:" << system_complete(p->i.seg_file).string() << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Segmentation file:" << boost::filesystem::system_complete(p->i.seg_file).string() << std::endl; if (p->i.import_block) - *f_out << setw(PRINT_VAR_PAD) << left << "Import stns & msrs from block: " << p->i.import_block_number << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Import stns & msrs from block: " << p->i.import_block_number << std::endl; else if (p->i.import_network) - *f_out << setw(PRINT_VAR_PAD) << left << "Import stns & msrs from network: " << p->i.import_network_number << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Import stns & msrs from network: " << p->i.import_network_number << std::endl; - *f_out << OUTPUTLINE << endl << endl; + *f_out << OUTPUTLINE << std::endl << std::endl; } -int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& vm, project_settings& p) +int ParseCommandLineOptions(const int& argc, char* argv[], const boost::program_options::variables_map& vm, project_settings& p) { // capture command line arguments for (int cmd_arg(0); cmd_arg(p.g.input_folder, file); + [&p] (std::string& file) { + formPath(p.g.input_folder, file); } ); @@ -175,18 +175,18 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& { // Iterate through network1, network2, network3, etc // until the first name not used is found - stringstream netname_ss; - string networkASL; + std::stringstream netname_ss; + std::string networkASL; UINT32 networkID(1); // This loop terminates when a file name cannot be found while (true) { // 1. Form ASL file and see if it exists - networkASL = formPath(p.g.output_folder, p.g.network_name, "asl"); + networkASL = formPath(p.g.output_folder, p.g.network_name, "asl"); // 2. Does this network exist? - if (!exists(networkASL)) + if (!boost::filesystem::exists(networkASL)) break; // 3. Flush and look for the next network @@ -196,30 +196,30 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& } } - p.g.project_file = formPath(p.g.output_folder, p.g.network_name, "dnaproj"); + p.g.project_file = formPath(p.g.output_folder, p.g.network_name, "dnaproj"); // binary station file location (output) if (vm.count(BIN_STN_FILE)) - p.i.bst_file = formPath(p.g.output_folder, p.i.bst_file); + p.i.bst_file = formPath(p.g.output_folder, p.i.bst_file); else - p.i.bst_file = formPath(p.g.output_folder, p.g.network_name, "bst"); + p.i.bst_file = formPath(p.g.output_folder, p.g.network_name, "bst"); // binary station file location (output) if (vm.count(BIN_MSR_FILE)) - p.i.bms_file = formPath(p.g.output_folder, p.i.bms_file); + p.i.bms_file = formPath(p.g.output_folder, p.i.bms_file); else - p.i.bms_file = formPath(p.g.output_folder, p.g.network_name, "bms"); + p.i.bms_file = formPath(p.g.output_folder, p.g.network_name, "bms"); if (vm.count(IMPORT_GEO_FILE)) p.i.import_geo_file = 1; // output files - p.i.asl_file = formPath(p.g.output_folder, p.g.network_name, "asl"); // associated stations list - p.i.aml_file = formPath(p.g.output_folder, p.g.network_name, "aml"); // associated measurements list - p.i.map_file = formPath(p.g.output_folder, p.g.network_name, "map"); // station names map - p.i.dst_file = formPath(p.g.output_folder, p.g.network_name, "dst"); // duplicate stations - p.i.dms_file = formPath(p.g.output_folder, p.g.network_name, "dms"); // duplicate measurements - p.i.imp_file = formPath(p.g.output_folder, p.g.network_name, "imp"); // log + p.i.asl_file = formPath(p.g.output_folder, p.g.network_name, "asl"); // associated stations list + p.i.aml_file = formPath(p.g.output_folder, p.g.network_name, "aml"); // associated measurements list + p.i.map_file = formPath(p.g.output_folder, p.g.network_name, "map"); // station names map + p.i.dst_file = formPath(p.g.output_folder, p.g.network_name, "dst"); // duplicate stations + p.i.dms_file = formPath(p.g.output_folder, p.g.network_name, "dms"); // duplicate measurements + p.i.imp_file = formPath(p.g.output_folder, p.g.network_name, "imp"); // log ////////////////////////////////////////////////////////////////////////////// // Ref frame options @@ -227,17 +227,17 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& p.i.override_input_rfame = 1; if (vm.count(REFERENCE_FRAME)) { - p.i.reference_frame = str_upper(p.i.reference_frame); + p.i.reference_frame = str_upper(p.i.reference_frame); p.i.user_supplied_frame = 1; } if (vm.count(EPOCH)) { // Get today's date? - if (iequals(p.i.epoch, "today")) - p.i.epoch = stringFromToday(); + if (boost::iequals(p.i.epoch, "today")) + p.i.epoch = stringFromToday(); // Has the user supplied the year only? - else if (p.i.epoch.rfind(".") == string::npos) + else if (p.i.epoch.rfind(".") == std::string::npos) p.i.epoch.insert(0, "01.01."); p.i.user_supplied_epoch = 1; } @@ -252,8 +252,8 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (vm.count(IMPORT_SEG_BLOCK) && vm.count(IMPORT_CONTIG_NET)) { - cout << endl << "- Error: Cannot import stations and measurements using both options" << endl << " --" << IMPORT_SEG_BLOCK << " and --" << IMPORT_CONTIG_NET << "." << endl << - " Please supply only one option." << endl << endl; + std::cout << std::endl << "- Error: Cannot import stations and measurements using both options" << std::endl << " --" << IMPORT_SEG_BLOCK << " and --" << IMPORT_CONTIG_NET << "." << std::endl << + " Please supply only one option." << std::endl << std::endl; return EXIT_FAILURE; } @@ -273,9 +273,9 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (vm.count(SEG_FILE)) { // Does it exist? - if (!exists(p.i.seg_file)) + if (!boost::filesystem::exists(p.i.seg_file)) // Look for it in the input folder - p.i.seg_file = formPath(p.g.input_folder, leafStr(p.i.seg_file)); + p.i.seg_file = formPath(p.g.input_folder, leafStr(p.i.seg_file)); } // convert all single X measurements to G measurements? @@ -316,10 +316,10 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& p.i.apply_scaling = 1; if (vm.count(SCALAR_FILE)) - if (!exists(p.i.scalar_file)) // does it exist? + if (!boost::filesystem::exists(p.i.scalar_file)) // does it exist? // No. Assume it is a filename contained in the input folder. import will throw // an exception if it cannot be found. - p.i.scalar_file = formPath(p.g.input_folder, p.i.scalar_file); + p.i.scalar_file = formPath(p.g.input_folder, p.i.scalar_file); ////////////////////////////////////////////////////////////////////////////// // Export options @@ -327,19 +327,19 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (vm.count(OUTPUT_MSR_TO_STN)) p.o._msr_to_stn = 1; - p.o._m2s_file = formPath(p.g.output_folder, p.g.network_name, "m2s"); // measurement to stations table + p.o._m2s_file = formPath(p.g.output_folder, p.g.network_name, "m2s"); // measurement to stations table // Create file name based on the provided block number or contiguous network number - string fileName(p.g.network_name); + std::string fileName(p.g.network_name); if (p.i.import_block) { - stringstream blk(""); + std::stringstream blk(""); blk << ".block-" << p.i.import_block_number; fileName += blk.str(); } else if (p.i.import_network) { - stringstream net(""); + std::stringstream net(""); net << ".network-" << p.i.import_network_number; fileName += net.str(); } @@ -357,16 +357,16 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (vm.count(EXPORT_SINGLE_XML_FILE)) { p.i.export_single_xml_file = 1; - p.i.xml_outfile = formPath(p.g.output_folder, + p.i.xml_outfile = formPath(p.g.output_folder, fileName, "xml"); } // unique files for stations and measurements else { p.i.export_single_xml_file = 0; - p.i.xml_stnfile = formPath(p.g.output_folder, + p.i.xml_stnfile = formPath(p.g.output_folder, fileName + "stn", "xml"); - p.i.xml_msrfile = formPath(p.g.output_folder, + p.i.xml_msrfile = formPath(p.g.output_folder, fileName + "msr", "xml"); } } @@ -375,9 +375,9 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (vm.count(EXPORT_DNA_FILES)) { p.i.export_dna_files = 1; - p.i.dna_stnfile = formPath(p.g.output_folder, + p.i.dna_stnfile = formPath(p.g.output_folder, fileName, "stn"); - p.i.dna_msrfile = formPath(p.g.output_folder, + p.i.dna_msrfile = formPath(p.g.output_folder, fileName, "msr"); } @@ -394,7 +394,7 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (vm.count(SIMULATE_MSR_FILE)) { p.i.simulate_measurements = 1; - p.i.simulate_msrfile = formPath(p.g.output_folder, + p.i.simulate_msrfile = formPath(p.g.output_folder, p.g.network_name, "simulated.msr"); } @@ -413,13 +413,13 @@ void PrintMeasurementstoStations(MsrTally* parsemsrTally, dna_import* parserDyna { if (!p->g.quiet) { - cout << "+ Printing summary of measurements connected to each station..."; - cout.flush(); + std::cout << "+ Printing summary of measurements connected to each station..."; + std::cout.flush(); } parserDynaML->PrintMeasurementsToStations(p->o._m2s_file, parsemsrTally, p->i.bst_file, p->i.bms_file, p->i.aml_file, vAssocStnList); if (!p->g.quiet) - cout << " done." << endl; + std::cout << " done." << std::endl; } } @@ -429,13 +429,13 @@ int SearchForSimilarMeasurements(dna_import* parserDynaML, project_settings* p, std::ofstream dms_file; UINT32 msr; vdnaMsrPtr vSimilarMeasurements; - string comment(""); + std::string comment(""); try { if (!p->g.quiet) { - cout << "+ Searching for similar measurements... "; - cout.flush(); + std::cout << "+ Searching for similar measurements... "; + std::cout.flush(); } *imp_file << "+ Searching for similar measurements... "; @@ -448,32 +448,32 @@ int SearchForSimilarMeasurements(dna_import* parserDynaML, project_settings* p, if (!vSimilarMeasurements.empty()) { - ostringstream ss_msg; + std::ostringstream ss_msg; if (!p->i.ignore_similar_msr) - ss_msg << endl << "- Warning: "; + ss_msg << std::endl << "- Warning: "; else - ss_msg << endl << "- Note: "; + ss_msg << std::endl << "- Note: "; ss_msg << msr << " measurement" << (msr > 1 ? "s were" : " was") << " found to be very similar (if not identical)\n to " << (msr > 1 ? "other measurements" : "another measurement") << - ". See " << p->i.dms_file << " for details." << endl; + ". See " << p->i.dms_file << " for details." << std::endl; *imp_file << ss_msg.str(); if (!p->g.quiet) - cout << ss_msg.str(); + std::cout << ss_msg.str(); ss_msg.str(""); try { // Create duplicate measurements file file_opener(dms_file, p->i.dms_file); } - catch (const ios_base::failure& f) { - stringstream ss; - ss << "- Error: Could not open " << p->i.dms_file << "." << endl; - ss << " Check that the file exists and that the file is not already opened." << endl << f.what(); + catch (const std::ios_base::failure& f) { + std::stringstream ss; + ss << "- Error: Could not open " << p->i.dms_file << "." << std::endl; + ss << " Check that the file exists and that the file is not already opened." << std::endl << f.what(); if (!p->g.quiet) - cout << ss.str(); + std::cout << ss.str(); *imp_file << ss.str(); imp_file->close(); return EXIT_FAILURE; @@ -482,13 +482,13 @@ int SearchForSimilarMeasurements(dna_import* parserDynaML, project_settings* p, PrintOutputFileHeaderInfo(&dms_file, p->i.dms_file, p, "DUPLICATE MEASUREMENTS FILE"); // output message - dms_file << endl << "- " << msr << " measurement" << (msr > 1 ? "s were" : " was") << + dms_file << std::endl << "- " << msr << " measurement" << (msr > 1 ? "s were" : " was") << " found to be very similar (if not identical)\n to " << (msr > 1 ? "other measurements." : "another measurement. "); if (p->i.ignore_similar_msr) - dms_file << endl << "+ These measurements have been ignored."; - dms_file << endl << endl; + dms_file << std::endl << "+ These measurements have been ignored."; + dms_file << std::endl << std::endl; // dump measurements to dms file for_each (vSimilarMeasurements.begin(), vSimilarMeasurements.end(), @@ -499,16 +499,16 @@ int SearchForSimilarMeasurements(dna_import* parserDynaML, project_settings* p, dms_file.close(); if (p->i.ignore_similar_msr) - ss_msg << " These measurements have been ignored." << endl; + ss_msg << " These measurements have been ignored." << std::endl; else - ss_msg << endl << - " If the listed measurements are true duplicates, either remove each duplicate " << endl << - " from the measurement file and re-run " << __BINARY_NAME__ << ", or re-run " << __BINARY_NAME__ << " with the" << endl << - " --" << IGNORE_SIMILAR_MSRS << " option. Alternatively, if each measurement " << endl << - " is unique, then call " << __BINARY_NAME__ << " without the --" << TEST_SIMILAR_MSRS << " option." << endl << endl; + ss_msg << std::endl << + " If the listed measurements are true duplicates, either remove each duplicate " << std::endl << + " from the measurement file and re-run " << __BINARY_NAME__ << ", or re-run " << __BINARY_NAME__ << " with the" << std::endl << + " --" << IGNORE_SIMILAR_MSRS << " option. Alternatively, if each measurement " << std::endl << + " is unique, then call " << __BINARY_NAME__ << " without the --" << TEST_SIMILAR_MSRS << " option." << std::endl << std::endl; if (!p->g.quiet) - cout << ss_msg.str(); + std::cout << ss_msg.str(); *imp_file << ss_msg.str(); if (!p->i.ignore_similar_msr) @@ -522,22 +522,22 @@ int SearchForSimilarMeasurements(dna_import* parserDynaML, project_settings* p, *imp_file << "Done. "; if (!p->g.quiet) { - cout << "Done. "; - cout.flush(); + std::cout << "Done. "; + std::cout.flush(); } } - *imp_file << endl; + *imp_file << std::endl; if (!p->g.quiet) { - cout << endl; - cout.flush(); + std::cout << std::endl; + std::cout.flush(); } } catch (const XMLInteropException& e) { - cout << endl << "- Error: " << e.what() << endl; - *imp_file << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; + *imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file->close(); return EXIT_FAILURE; } @@ -549,7 +549,7 @@ int SearchForSimilarMeasurements(dna_import* parserDynaML, project_settings* p, void ReportExportedData(const project_settings& p, std::ostream& out, const size_t& file_type, const UINT32& stnCount, const UINT32& msrCount) { - string dataExported; + std::string dataExported; if (stnCount > 0 && msrCount == 0) dataExported = "stations"; else if (stnCount == 0 && msrCount > 0) @@ -557,29 +557,29 @@ void ReportExportedData(const project_settings& p, std::ostream& out, const size else if (stnCount > 0 && msrCount > 0) dataExported = "stations and measurements"; - string stn_file, msr_file, single_file; + std::string stn_file, msr_file, single_file; bool print_single_xml = (p.i.export_single_xml_file && p.i.export_dynaml); switch (file_type) { case dna: - stn_file = leafStr(p.i.dna_stnfile); - msr_file = leafStr(p.i.dna_msrfile); + stn_file = leafStr(p.i.dna_stnfile); + msr_file = leafStr(p.i.dna_msrfile); break; case dynaml: if (print_single_xml) - single_file = leafStr(p.i.xml_outfile); + single_file = leafStr(p.i.xml_outfile); else { - stn_file = leafStr(p.i.xml_stnfile); - msr_file = leafStr(p.i.xml_msrfile); + stn_file = leafStr(p.i.xml_stnfile); + msr_file = leafStr(p.i.xml_msrfile); } break; default: break; } - out << "+ Exporting " << dataExported << " to:" << endl; + out << "+ Exporting " << dataExported << " to:" << std::endl; if (file_type == dynaml && print_single_xml) out << " - " << single_file << "... "; else @@ -588,7 +588,7 @@ void ReportExportedData(const project_settings& p, std::ostream& out, const size { out << " - " << stn_file; if (msrCount > 0) - out << endl; + out << std::endl; } if (msrCount > 0) out << " - " << msr_file; @@ -601,22 +601,22 @@ void ReportExportedData(const project_settings& p, std::ostream& out, const size void ExportStationsandMeasurements(dna_import* parserDynaML, const project_settings& p, std::ofstream* imp_file, vifm_t* vinput_file_meta, vdnaStnPtr* vstationsTotal, vdnaMsrPtr* vmeasurementsTotal, const UINT32& stnCount, const UINT32& msrCount) { - stringstream ssEpsgWarning; + std::stringstream ssEpsgWarning; bool displayEpsgWarning(false); - string epsgCode(epsgStringFromName(p.i.reference_frame)); + std::string epsgCode(epsgStringFromName(p.i.reference_frame)); // Check inconsistent reference frames if ((p.i.export_dynaml || p.i.export_dna_files) && !p.i.override_input_rfame && !p.i.user_supplied_frame) { for (UINT32 i(0); isize(); ++i) { - if (!iequals(epsgCode, vinput_file_meta->at(i).epsgCode)) + if (!boost::iequals(epsgCode, vinput_file_meta->at(i).epsgCode)) { - string inputFrame(datumFromEpsgString(vinput_file_meta->at(i).epsgCode)); - ssEpsgWarning << endl << "- Warning: The default reference frame (" << p.i.reference_frame << ")" << - " used for all exported" << endl << - " files does not match the reference frame of one or more input files." << endl << - " To suppress this warning, override the default reference frame using" << endl << + std::string inputFrame(datumFromEpsgString(vinput_file_meta->at(i).epsgCode)); + ssEpsgWarning << std::endl << "- Warning: The default reference frame (" << p.i.reference_frame << ")" << + " used for all exported" << std::endl << + " files does not match the reference frame of one or more input files." << std::endl << + " To suppress this warning, override the default reference frame using" << std::endl << " --reference-frame, or provide --override-input-ref-frame."; displayEpsgWarning = true; break; @@ -631,7 +631,7 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti if (p.i.export_dynaml && (stnCount > 0 || msrCount > 0)) { if (!p.g.quiet) - ReportExportedData(p, cout, dynaml, stnCount, msrCount); + ReportExportedData(p, std::cout, dynaml, stnCount, msrCount); ReportExportedData(p, *imp_file, dynaml, stnCount, msrCount); if (p.i.export_single_xml_file) @@ -650,10 +650,10 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti } if (!p.g.quiet) { - cout << "Done." << endl; - cout.flush(); + std::cout << "Done." << std::endl; + std::cout.flush(); } - *imp_file << "Done." << endl; + *imp_file << "Done." << std::endl; } // DNA file format @@ -661,7 +661,7 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti { // Separate output files (default) if (!p.g.quiet) - ReportExportedData(p, cout, dna, stnCount, msrCount); + ReportExportedData(p, std::cout, dna, stnCount, msrCount); ReportExportedData(p, *imp_file, dna, stnCount, msrCount); parserDynaML->SerialiseDNA( @@ -669,15 +669,15 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti p.i.dna_stnfile, p.i.dna_msrfile, p, vinput_file_meta, (p.i.flag_unused_stn ? true : false)); if (!p.g.quiet) - cout << "Done." << endl; - *imp_file << "Done." << endl; + std::cout << "Done." << std::endl; + *imp_file << "Done." << std::endl; } if (displayEpsgWarning) { - cout << ssEpsgWarning.str() << endl; - *imp_file << ssEpsgWarning.str() << endl; - cout.flush(); + std::cout << ssEpsgWarning.str() << std::endl; + *imp_file << ssEpsgWarning.str() << std::endl; + std::cout.flush(); } } @@ -690,35 +690,35 @@ int PrepareImportSegmentedData(project_settings& p, bool& userSuppliedSegFile) if (!p.i.seg_file.empty()) userSuppliedSegFile = true; else - p.i.seg_file = formPath(p.g.input_folder, p.g.network_name, "seg"); + p.i.seg_file = formPath(p.g.input_folder, p.g.network_name, "seg"); - if (!exists(p.i.seg_file)) + if (!boost::filesystem::exists(p.i.seg_file)) { - cout << endl << "- Error: The required segmentation file does not exist:" << endl << - " " << p.i.seg_file << endl << endl << - " Run 'segment " << p.g.network_name << "' to create a segmentation file" << endl << endl; + std::cout << std::endl << "- Error: The required segmentation file does not exist:" << std::endl << + " " << p.i.seg_file << std::endl << std::endl << + " Run 'segment " << p.g.network_name << "' to create a segmentation file" << std::endl << std::endl; return EXIT_FAILURE; } - if (!exists(p.i.bst_file)) + if (!boost::filesystem::exists(p.i.bst_file)) { - cout << endl << "- Error: The required binary station file does not exist:" << endl << - " " << p.i.bst_file << endl << endl; + std::cout << std::endl << "- Error: The required binary station file does not exist:" << std::endl << + " " << p.i.bst_file << std::endl << std::endl; return EXIT_FAILURE; } - if (!exists(p.i.bms_file)) + if (!boost::filesystem::exists(p.i.bms_file)) { - cout << endl << "- Error: The required binary measurement file does not exist:" << endl << - " " << p.i.bms_file << endl << endl; + std::cout << std::endl << "- Error: The required binary measurement file does not exist:" << std::endl << + " " << p.i.bms_file << std::endl << std::endl; return EXIT_FAILURE; } // If the user has not provided a seg file, check the meta of the default file if (!userSuppliedSegFile) { - if (last_write_time(p.i.seg_file) < last_write_time(p.i.bst_file) || - last_write_time(p.i.seg_file) < last_write_time(p.i.bms_file)) + if (boost::filesystem::last_write_time(p.i.seg_file) < boost::filesystem::last_write_time(p.i.bst_file) || + boost::filesystem::last_write_time(p.i.seg_file) < boost::filesystem::last_write_time(p.i.bms_file)) { // Has import been run after the segmentation file was created? binary_file_meta_t bst_meta, bms_meta; @@ -727,27 +727,27 @@ int PrepareImportSegmentedData(project_settings& p, bool& userSuppliedSegFile) bst.load_bst_file_meta(p.i.bst_file, bst_meta); bms.load_bms_file_meta(p.i.bms_file, bms_meta); - bool bst_meta_import(iequals(bst_meta.modifiedBy, __import_app_name__) || - iequals(bst_meta.modifiedBy, __import_dll_name__)); - bool bms_meta_import(iequals(bms_meta.modifiedBy, __import_app_name__) || - iequals(bms_meta.modifiedBy, __import_dll_name__)); + bool bst_meta_import(boost::iequals(bst_meta.modifiedBy, __import_app_name__) || + boost::iequals(bst_meta.modifiedBy, __import_dll_name__)); + bool bms_meta_import(boost::iequals(bms_meta.modifiedBy, __import_app_name__) || + boost::iequals(bms_meta.modifiedBy, __import_dll_name__)); - if ((bst_meta_import && (last_write_time(p.i.seg_file) < last_write_time(p.i.bst_file))) || - (bms_meta_import && (last_write_time(p.i.seg_file) < last_write_time(p.i.bms_file)))) + if ((bst_meta_import && (boost::filesystem::last_write_time(p.i.seg_file) < boost::filesystem::last_write_time(p.i.bst_file))) || + (bms_meta_import && (boost::filesystem::last_write_time(p.i.seg_file) < boost::filesystem::last_write_time(p.i.bms_file)))) { - cout << endl << endl << - "- Error: The raw stations and measurements have been imported after" << endl << - " the segmentation file was created:" << endl; + std::cout << std::endl << std::endl << + "- Error: The raw stations and measurements have been imported after" << std::endl << + " the segmentation file was created:" << std::endl; - time_t t_bst(last_write_time(p.i.bst_file)), t_bms(last_write_time(p.i.bms_file)); - time_t t_seg(last_write_time(p.i.seg_file)); + time_t t_bst(boost::filesystem::last_write_time(p.i.bst_file)), t_bms(boost::filesystem::last_write_time(p.i.bms_file)); + time_t t_seg(boost::filesystem::last_write_time(p.i.seg_file)); - cout << " " << leafStr(p.i.bst_file) << " last modified on " << ctime(&t_bst); - cout << " " << leafStr(p.i.bms_file) << " last modified on " << ctime(&t_bms) << endl; - cout << " " << leafStr(p.i.seg_file) << " created on " << ctime(&t_seg) << endl; - cout << " Run 'segment " << p.g.network_name << " [options]' to re-create the segmentation file, or re-run" << endl << - " the import using the " << SEG_FILE << " option if this segmentation file must\n be used." << endl << endl; + std::cout << " " << leafStr(p.i.bst_file) << " last modified on " << ctime(&t_bst); + std::cout << " " << leafStr(p.i.bms_file) << " last modified on " << ctime(&t_bms) << std::endl; + std::cout << " " << leafStr(p.i.seg_file) << " created on " << ctime(&t_seg) << std::endl; + std::cout << " Run 'segment " << p.g.network_name << " [options]' to re-create the segmentation file, or re-run" << std::endl << + " the import using the " << SEG_FILE << " option if this segmentation file must\n be used." << std::endl << std::endl; return EXIT_FAILURE; } } @@ -767,22 +767,22 @@ int ImportSegmentedBlock(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMs // Import stations and measurements from a particular block if (!p.g.quiet) - cout << endl << "+ Importing stations and measurements from block " << p.i.import_block_number << " of\n " << p.i.seg_file << "... "; + std::cout << std::endl << "+ Importing stations and measurements from block " << p.i.import_block_number << " of\n " << p.i.seg_file << "... "; try { parserDynaML.ImportStnsMsrsFromBlock(vStations, vMeasurements, p); } catch (const XMLInteropException& e) { - stringstream ss; - ss << endl << endl << "- Error: " << e.what(); - cout << ss.str() << endl; + std::stringstream ss; + ss << std::endl << std::endl << "- Error: " << e.what(); + std::cout << ss.str() << std::endl; return EXIT_FAILURE; } *parsestnTally += parserDynaML.GetStnTally(); *parsemsrTally += parserDynaML.GetMsrTally(); if (!p.g.quiet) - cout << "Done. " << endl; + std::cout << "Done. " << std::endl; // Restore seg_file to null if (!userSuppliedSegFile) @@ -802,22 +802,22 @@ int ImportContiguousNetwork(dna_import& parserDynaML, vdnaStnPtr* vStations, vdn // Import stations and measurements from a particular block if (!p.g.quiet) - cout << endl << "+ Importing stations and measurements from contiguous network " << p.i.import_network_number << " of\n " << p.i.seg_file << "... "; + std::cout << std::endl << "+ Importing stations and measurements from contiguous network " << p.i.import_network_number << " of\n " << p.i.seg_file << "... "; try { parserDynaML.ImportStnsMsrsFromNetwork(vStations, vMeasurements, p); } catch (const XMLInteropException& e) { - stringstream ss; - ss << endl << endl << "- Error: " << e.what(); - cout << ss.str() << endl; + std::stringstream ss; + ss << std::endl << std::endl << "- Error: " << e.what(); + std::cout << ss.str() << std::endl; return EXIT_FAILURE; } *parsestnTally += parserDynaML.GetStnTally(); *parsemsrTally += parserDynaML.GetMsrTally(); if (!p.g.quiet) - cout << "Done. " << endl; + std::cout << "Done. " << std::endl; // Restore seg_file to null if (!userSuppliedSegFile) @@ -856,55 +856,55 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* // UINT32 stnCount(0), msrCount(0), clusterID(0); - size_t pos = string::npos; + size_t pos = std::string::npos; size_t strlen_arg = 0; for_each(p.i.input_files.begin(), p.i.input_files.end(), - [&strlen_arg](string& file) { - if (leafStr(file).length() > strlen_arg) - strlen_arg = leafStr(file).length(); + [&strlen_arg](std::string& file) { + if (leafStr(file).length() > strlen_arg) + strlen_arg = leafStr(file).length(); }); strlen_arg += (6 + PROGRESS_PERCENT_04); size_t i, nfiles(p.i.input_files.size()); // for each file... - string input_file, ss, status_msg; - ostringstream ss_time, ss_msg; + std::string input_file, ss, status_msg; + std::ostringstream ss_time, ss_msg; input_file_meta_t input_file_meta; - milliseconds elapsed_time(milliseconds(0)); - ptime pt; + boost::posix_time::milliseconds elapsed_time(boost::posix_time::milliseconds(0)); + boost::posix_time::ptime pt; if (!p.g.quiet) - cout << "+ Parsing: " << endl; - *imp_file << "+ Parsing " << endl; + std::cout << "+ Parsing: " << std::endl; + *imp_file << "+ Parsing " << std::endl; bool firstFile; // obtain the project reference frame epsg code - string projctEpsgCode(epsgStringFromName(p.i.reference_frame)); + std::string projctEpsgCode(epsgStringFromName(p.i.reference_frame)); for (i=0; i(p.g.input_folder, input_file); - if (!exists(input_file)) + input_file = formPath(p.g.input_folder, input_file); + if (!boost::filesystem::exists(input_file)) { - cout << "- Error: " << input_file << " does not exist" << endl; + std::cout << "- Error: " << input_file << " does not exist" << std::endl; return EXIT_FAILURE; } } - ss = leafStr(p.i.input_files.at(i)) + "... "; + ss = leafStr(p.i.input_files.at(i)) + "... "; if (!p.g.quiet) - cout << " " << setw(strlen_arg) << left << ss; - *imp_file << " " << setw(strlen_arg) << left << ss; + std::cout << " " << std::setw(strlen_arg) << std::left << ss; + *imp_file << " " << std::setw(strlen_arg) << std::left << ss; running = true; firstFile = bool(i == 0); - thread_group ui_interop_threads; + boost::thread_group ui_interop_threads; if (!p.g.quiet) ui_interop_threads.create_thread(dna_import_progress_thread(&parserDynaML, &p)); ui_interop_threads.create_thread(dna_import_thread(&parserDynaML, &p, input_file, @@ -916,12 +916,12 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* switch (parserDynaML.GetStatus()) { case PARSE_EXCEPTION_RAISED: - *imp_file << endl << status_msg; + *imp_file << std::endl << status_msg; running = false; return EXIT_FAILURE; break; case PARSE_UNRECOGNISED_FILE: - *imp_file << status_msg << endl; + *imp_file << status_msg << std::endl; errorCount++; continue; case PARSE_SUCCESS: @@ -929,7 +929,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* break; default: errorCount++; - cout << endl; + std::cout << std::endl; continue; } @@ -948,44 +948,44 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* ss_time << msrCount << " measurements"; ss_time << " in "; - pt = ptime(gregorian::day_clock::local_day(), elapsed_time); - if (elapsed_time < seconds(3)) + pt = boost::posix_time::ptime(boost::gregorian::day_clock::local_day(), elapsed_time); + if (elapsed_time < boost::posix_time::seconds(3)) { - time_facet* facet(new time_facet("%s")); - ss_time.imbue(locale(ss_time.getloc(), facet)); + boost::posix_time::time_facet* facet(new boost::posix_time::time_facet("%s")); + ss_time.imbue(std::locale(ss_time.getloc(), facet)); ss_time << pt << "s"; } - else if (elapsed_time < seconds(61)) + else if (elapsed_time < boost::posix_time::seconds(61)) { - time_facet* facet(new time_facet("%S")); - ss_time.imbue(locale(ss_time.getloc(), facet)); + boost::posix_time::time_facet* facet(new boost::posix_time::time_facet("%S")); + ss_time.imbue(std::locale(ss_time.getloc(), facet)); ss_time << pt << "s"; } else ss_time << elapsed_time; - string time_message = ss_time.str(); - while ((pos = time_message.find("0s")) != string::npos) + std::string time_message = ss_time.str(); + while ((pos = time_message.find("0s")) != std::string::npos) time_message = time_message.substr(0, pos) + "s"; - if ((pos = time_message.find(" 00.")) != string::npos) + if ((pos = time_message.find(" 00.")) != std::string::npos) time_message = time_message.replace(pos, 4, " 0."); - if ((pos = time_message.find(" 0.s")) != string::npos) + if ((pos = time_message.find(" 0.s")) != std::string::npos) time_message = time_message.replace(pos, 4, " 0s"); if (!p.g.quiet) { if (isatty(fileno(stdout))) - cout << PROGRESS_BACKSPACE_04; - cout << time_message << endl; + std::cout << PROGRESS_BACKSPACE_04; + std::cout << time_message << std::endl; } - *imp_file << time_message << endl; + *imp_file << time_message << std::endl; // Capture the input file's default reference frame and set the // project reference frame (if not specified on the command-line) - string inputFileEpsg(""), inputFileDatum(""), inputFileEpoch(""); + std::string inputFileEpsg(""), inputFileDatum(""), inputFileEpoch(""); try { - inputFileDatum = datumFromEpsgString(input_file_meta.epsgCode); + inputFileDatum = datumFromEpsgString(input_file_meta.epsgCode); inputFileEpsg = input_file_meta.epsgCode; inputFileEpoch = input_file_meta.epoch; } @@ -1024,7 +1024,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* // revert to epoch of p.i.epoch = referenceepochFromEpsgCode(inputFileEpsgi); else - p.i.epoch = referenceepochFromEpsgString(projctEpsgCode); + p.i.epoch = referenceepochFromEpsgString(projctEpsgCode); p.r.epoch = p.i.epoch; } else @@ -1038,38 +1038,38 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* parserDynaML.InitialiseDatum(p.i.reference_frame, p.i.epoch); } catch (const XMLInteropException& e) { - stringstream ss; + std::stringstream ss; ss << "- Error: "; - cout << ss.str() << e.what() << endl; + std::cout << ss.str() << e.what() << std::endl; return EXIT_FAILURE; } } if (!parserDynaML.filespecifiedReferenceFrame()) { - stringstream ssEpsgWarning; + std::stringstream ssEpsgWarning; ssEpsgWarning << " - Warning: Input file reference frame empty. Assuming the default reference frame (" << inputFileDatum << ")."; if (!p.g.quiet) - cout << ssEpsgWarning.str() << endl; - *imp_file << ssEpsgWarning.str() << endl; + std::cout << ssEpsgWarning.str() << std::endl; + *imp_file << ssEpsgWarning.str() << std::endl; } - else if (!iequals(projctEpsgCode, input_file_meta.epsgCode)) + else if (!boost::iequals(projctEpsgCode, input_file_meta.epsgCode)) { - stringstream ssEpsgWarning; + std::stringstream ssEpsgWarning; if (referenceframeChanged) { - ssEpsgWarning << " - Warning: The project reference frame has been set to the default" << endl << - " file datum of " << leafStr(p.i.input_files.at(i)) << " (" << inputFileDatum << ")."; + ssEpsgWarning << " - Warning: The project reference frame has been set to the default" << std::endl << + " file datum of " << leafStr(p.i.input_files.at(i)) << " (" << inputFileDatum << ")."; } else { - ssEpsgWarning << " - Warning: Input file reference frame (" << inputFileDatum << ") does not match the " << endl << + ssEpsgWarning << " - Warning: Input file reference frame (" << inputFileDatum << ") does not match the " << std::endl << " project reference frame (" << p.i.reference_frame << ")."; } if (!p.g.quiet) - cout << ssEpsgWarning.str() << endl; - *imp_file << ssEpsgWarning.str() << endl; + std::cout << ssEpsgWarning.str() << std::endl; + *imp_file << ssEpsgWarning.str() << std::endl; } } @@ -1108,92 +1108,92 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* int main(int argc, char* argv[]) { // create banner message - string cmd_line_banner; + std::string cmd_line_banner; fileproc_help_header(&cmd_line_banner); project_settings p; - variables_map vm; - positional_options_description positional_options; + boost::program_options::variables_map vm; + boost::program_options::positional_options_description positional_options; - options_description standard_options("+ " + string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description ref_frame_options("+ " + string(IMPORT_MODULE_FRAME), PROGRAM_OPTIONS_LINE_LENGTH); - options_description data_screening_options("+ " + string(IMPORT_MODULE_SCREEN), PROGRAM_OPTIONS_LINE_LENGTH); - options_description gnss_scaling_options("+ " + string(IMPORT_MODULE_GNSS_VAR), PROGRAM_OPTIONS_LINE_LENGTH); - options_description simulation_options("+ " + string(IMPORT_MODULE_SIMULATE), PROGRAM_OPTIONS_LINE_LENGTH); - options_description output_options("+ " + string(ALL_MODULE_OUTPUT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description export_options("+ " + string(ALL_MODULE_EXPORT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description generic_options("+ " + string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description standard_options("+ " + std::string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description ref_frame_options("+ " + std::string(IMPORT_MODULE_FRAME), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description data_screening_options("+ " + std::string(IMPORT_MODULE_SCREEN), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description gnss_scaling_options("+ " + std::string(IMPORT_MODULE_GNSS_VAR), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description simulation_options("+ " + std::string(IMPORT_MODULE_SIMULATE), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description output_options("+ " + std::string(ALL_MODULE_OUTPUT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description export_options("+ " + std::string(ALL_MODULE_EXPORT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description generic_options("+ " + std::string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); - string cmd_line_usage("+ "); + std::string cmd_line_usage("+ "); cmd_line_usage.append(__BINARY_NAME__).append(" usage: ").append(__BINARY_NAME__).append(" [options] [files]..."); - options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); try { // Declare a group of options that will be // allowed only on command line standard_options.add_options() - (PROJECT_FILE_P, value(&p.g.project_file), + (PROJECT_FILE_P, boost::program_options::value(&p.g.project_file), "Project file name. Full path to project file. If none specified, a new file is created using input-folder and network-name. If a project file exists, the file is used to set all command line options.") - (NETWORK_NAME_N, value(&p.g.network_name), + (NETWORK_NAME_N, boost::program_options::value(&p.g.network_name), "Network name. User defined name for all input and output files. Default is \"network#\", where # is incremented until the first available network is reached.") - (IMPORT_FILE_F, value< vstring >(&p.i.input_files), + (IMPORT_FILE_F, boost::program_options::value< vstring >(&p.i.input_files), "Station and measurement input file(s). Switch is not required.") - (IMPORT_GEO_FILE_G, value(&p.i.geo_file), + (IMPORT_GEO_FILE_G, boost::program_options::value(&p.i.geo_file), "Import DNA geoid file.") - (INPUT_FOLDER_I, value(&p.g.input_folder), + (INPUT_FOLDER_I, boost::program_options::value(&p.g.input_folder), "Path containing all input files.") - (OUTPUT_FOLDER_O, value(&p.g.output_folder), // default is ./, + (OUTPUT_FOLDER_O, boost::program_options::value(&p.g.output_folder), // default is ./, "Path for all output files.") - (BIN_STN_FILE_S, value(&p.i.bst_file), + (BIN_STN_FILE_S, boost::program_options::value(&p.i.bst_file), "Binary station output file name. Overrides network name.") - (BIN_MSR_FILE_M, value(&p.i.bms_file), + (BIN_MSR_FILE_M, boost::program_options::value(&p.i.bms_file), "Binary measurement output file name. Overrides network name.") ; ref_frame_options.add_options() - (REFERENCE_FRAME_R, value(&p.i.reference_frame), - (string("Project reference frame for all stations, measurements, and preliminary reductions on the ellipsoid when input files do not specify a reference frame. Default is ") + + (REFERENCE_FRAME_R, boost::program_options::value(&p.i.reference_frame), + (std::string("Project reference frame for all stations, measurements, and preliminary reductions on the ellipsoid when input files do not specify a reference frame. Default is ") + p.i.reference_frame + ".").c_str()) - (EPOCH_E, value(&p.i.epoch), - (string("Project epoch for all stations and measurements when input files do not specify an epoch. Default is ") + + (EPOCH_E, boost::program_options::value(&p.i.epoch), + (std::string("Project epoch for all stations and measurements when input files do not specify an epoch. Default is ") + p.i.epoch + ".").c_str()) (OVERRIDE_INPUT_FRAME, "Override the reference frame specified for each measurement in input files.") ; data_screening_options.add_options() - (BOUNDING_BOX, value(&p.i.bounding_box), + (BOUNDING_BOX, boost::program_options::value(&p.i.bounding_box), "Import stations and measurements within bounding box. arg is a comma delimited string \"lat1,lon1,lat2,lon2\" (in dd.mmss) defining the upper-left and lower-right limits.") (GET_MSRS_TRANSCENDING_BOX, "Include measurements which transcend bounding box, including associated stations.") - (INCLUDE_STN_ASSOC_MSRS, value(&p.i.stn_associated_msr_include), + (INCLUDE_STN_ASSOC_MSRS, boost::program_options::value(&p.i.stn_associated_msr_include), "Include stations and all associated measurements. arg is a comma delimited string \"stn 1,stn 2,stn 3,...,stn N\" of the stations to include.") - (EXCLUDE_STN_ASSOC_MSRS, value(&p.i.stn_associated_msr_exclude), + (EXCLUDE_STN_ASSOC_MSRS, boost::program_options::value(&p.i.stn_associated_msr_exclude), "Exclude stations and all associated measurements. arg is a comma delimited string \"stn 1,stn 2,stn 3,...,stn N\" of the stations to exclude.") (SPLIT_CLUSTERS, "Allow bounding-box or get-stns-and-assoc-msrs to split GNSS point and baseline cluster measurements.") - (IMPORT_SEG_BLOCK, value(&p.i.import_block_number), + (IMPORT_SEG_BLOCK, boost::program_options::value(&p.i.import_block_number), "Extract stations and measurements from this block.") - (IMPORT_CONTIG_NET, value(&p.i.import_network_number), + (IMPORT_CONTIG_NET, boost::program_options::value(&p.i.import_network_number), "Extract stations and measurements from this contiguous network.") - (SEG_FILE, value(&p.i.seg_file), + (SEG_FILE, boost::program_options::value(&p.i.seg_file), "Network segmentation input file. Filename overrides network name.") (PREFER_X_MSR_AS_G, "Import single baseline cluster measurements (X) as single baselines (G).") - (INCLUDE_MSRS, value(&p.i.include_msrs), + (INCLUDE_MSRS, boost::program_options::value(&p.i.include_msrs), "Import the specified measurement types. arg is a non-delimited string of measurement types (eg \"GXY\").") - (EXCLUDE_MSRS, value(&p.i.exclude_msrs), + (EXCLUDE_MSRS, boost::program_options::value(&p.i.exclude_msrs), "Exclude the specified measurement types. arg is a non-delimited string of measurement typs (eg \"IJK\").") - (STATION_RENAMING_FILE, value(&p.i.stn_renamingfile), + (STATION_RENAMING_FILE, boost::program_options::value(&p.i.stn_renamingfile), "Station renaming file") - (STATION_DISCONTINUITY_FILE, value(&p.i.stn_discontinuityfile), + (STATION_DISCONTINUITY_FILE, boost::program_options::value(&p.i.stn_discontinuityfile), "Station discontinuity file. Applies discontinuity dates to station names in station and measurement files.") (TEST_NEARBY_STNS, "Search for nearby stations.") - (TEST_NEARBY_STN_DIST, value(&p.i.search_stn_radius), - (string("Specify the radius of the circle within which to search for nearby stations. Default is ")+ - StringFromT(STN_SEARCH_RADIUS)+string("m")).c_str()) + (TEST_NEARBY_STN_DIST, boost::program_options::value(&p.i.search_stn_radius), + (std::string("Specify the radius of the circle within which to search for nearby stations. Default is ")+ + StringFromT(STN_SEARCH_RADIUS)+std::string("m")).c_str()) (TEST_SIMILAR_GNSS_MSRS, "Search and provide warnings for GNSS baselines (G) and baseline clusters (X) which appear to have been derived from the same source data.") (TEST_SIMILAR_MSRS, @@ -1211,27 +1211,27 @@ int main(int argc, char* argv[]) ; gnss_scaling_options.add_options() - (VSCALE, value(&p.i.vscale), - (string("Global variance (v) matrix scalar for all GNSS measurements. Replaces existing scalar. Default is ")+ - StringFromT(p.i.vscale)+string(".")).c_str()) - (PSCALE, value(&p.i.pscale), - (string("Latitude (p=phi) variance matrix scalar for all GNSS measurements. Replaces existing scalar. Default is ")+ - StringFromT(p.i.pscale)+string(".")).c_str()) - (LSCALE, value(&p.i.lscale), - (string("Longitude (l=lambda) variance matrix scalar for all GNSS measurements. Replaces existing scalar. Default is ")+ - StringFromT(p.i.lscale)+string(".")).c_str()) - (HSCALE, value(&p.i.hscale), - (string("Height (h) variance matrix scalar for all GNSS measurements. Replaces existing scalar. Default is ")+ - StringFromT(p.i.hscale)+string(".")).c_str()) - (SCALAR_FILE, value(&p.i.scalar_file), + (VSCALE, boost::program_options::value(&p.i.vscale), + (std::string("Global variance (v) matrix scalar for all GNSS measurements. Replaces existing scalar. Default is ")+ + StringFromT(p.i.vscale)+std::string(".")).c_str()) + (PSCALE, boost::program_options::value(&p.i.pscale), + (std::string("Latitude (p=phi) variance matrix scalar for all GNSS measurements. Replaces existing scalar. Default is ")+ + StringFromT(p.i.pscale)+std::string(".")).c_str()) + (LSCALE, boost::program_options::value(&p.i.lscale), + (std::string("Longitude (l=lambda) variance matrix scalar for all GNSS measurements. Replaces existing scalar. Default is ")+ + StringFromT(p.i.lscale)+std::string(".")).c_str()) + (HSCALE, boost::program_options::value(&p.i.hscale), + (std::string("Height (h) variance matrix scalar for all GNSS measurements. Replaces existing scalar. Default is ")+ + StringFromT(p.i.hscale)+std::string(".")).c_str()) + (SCALAR_FILE, boost::program_options::value(&p.i.scalar_file), "File containing v, p, l and h scalars for GNSS baseline measurements between specific station pairs. Scalar file values do not apply to GNSS point or baseline clusters.") ; output_options.add_options() (OUTPUT_MSR_TO_STN, "Output summary of measurements connected to each station.") - (OUTPUT_MSR_TO_STN_SORTBY, value(&p.o._sort_msr_to_stn), - string("Sort order for measurement to stations summary.\n " + + (OUTPUT_MSR_TO_STN_SORTBY, boost::program_options::value(&p.o._sort_msr_to_stn), + std::string("Sort order for measurement to stations summary.\n " + StringFromT(orig_stn_sort_ui) + ": Original station order (default)\n " + StringFromT(meas_stn_sort_ui) + ": Measurement count").c_str()) ; @@ -1263,13 +1263,13 @@ int main(int argc, char* argv[]) ; generic_options.add_options() - (VERBOSE, value(&p.g.verbose), - string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information\n 3: Debug level information").c_str()) + (VERBOSE, boost::program_options::value(&p.g.verbose), + std::string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information\n 3: Debug level information").c_str()) (QUIET, - string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs.").c_str()) + std::string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs.").c_str()) (VERSION_V, "Display the current program version.") (HELP_H, "Show this help message.") - (HELP_MODULE_H, value(), + (HELP_MODULE_H, boost::program_options::value(), "Provide help for a specific help category.") ; @@ -1278,74 +1278,74 @@ int main(int argc, char* argv[]) // add "positional options" to handle command line tokens which have no option name positional_options.add(IMPORT_FILE, -1); - command_line_parser parser(argc, argv); + boost::program_options::command_line_parser parser(argc, argv); store(parser.options(allowable_options).positional(positional_options).run(), vm); notify(vm); } catch(const std::exception& e) { - cout << "- Error: " << e.what() << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << "- Error: " << e.what() << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } catch (...) { - cout << "+ Exception of unknown type!\n"; + std::cout << "+ Exception of unknown type!\n"; return EXIT_FAILURE; } if (argc < 2) { - cout << endl << "- Nothing to do - no options provided. " << endl << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << std::endl << "- Nothing to do - no options provided. " << std::endl << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } if (vm.count(VERSION)) { - cout << cmd_line_banner << endl; + std::cout << cmd_line_banner << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP)) { - cout << cmd_line_banner << allowable_options << endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP_MODULE)) { - cout << cmd_line_banner; - string original_text = vm[HELP_MODULE].as(); - string help_text = str_upper(original_text); + std::cout << cmd_line_banner; + std::string original_text = vm[HELP_MODULE].as(); + std::string help_text = str_upper(original_text); - if (str_upper(ALL_MODULE_STDOPT).find(help_text) != string::npos) { - cout << standard_options << endl; + if (str_upper(ALL_MODULE_STDOPT).find(help_text) != std::string::npos) { + std::cout << standard_options << std::endl; } - else if (str_upper(IMPORT_MODULE_FRAME).find(help_text) != string::npos) { - cout << ref_frame_options << endl; + else if (str_upper(IMPORT_MODULE_FRAME).find(help_text) != std::string::npos) { + std::cout << ref_frame_options << std::endl; } - else if (str_upper(IMPORT_MODULE_SCREEN).find(help_text) != string::npos) { - cout << data_screening_options << endl; + else if (str_upper(IMPORT_MODULE_SCREEN).find(help_text) != std::string::npos) { + std::cout << data_screening_options << std::endl; } - else if (str_upper(IMPORT_MODULE_GNSS_VAR).find(help_text) != string::npos) { - cout << gnss_scaling_options << endl; + else if (str_upper(IMPORT_MODULE_GNSS_VAR).find(help_text) != std::string::npos) { + std::cout << gnss_scaling_options << std::endl; } - else if (str_upper(IMPORT_MODULE_SIMULATE).find(help_text) != string::npos) { - cout << simulation_options << endl; + else if (str_upper(IMPORT_MODULE_SIMULATE).find(help_text) != std::string::npos) { + std::cout << simulation_options << std::endl; } - else if (str_upper(ALL_MODULE_OUTPUT).find(help_text) != string::npos) { - cout << output_options << endl; + else if (str_upper(ALL_MODULE_OUTPUT).find(help_text) != std::string::npos) { + std::cout << output_options << std::endl; } - else if (str_upper(ALL_MODULE_EXPORT).find(help_text) != string::npos) { - cout << export_options << endl; + else if (str_upper(ALL_MODULE_EXPORT).find(help_text) != std::string::npos) { + std::cout << export_options << std::endl; } - else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != string::npos) { - cout << generic_options << endl; + else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != std::string::npos) { + std::cout << generic_options << std::endl; } else { - cout << endl << "- Error: Help module '" << - original_text << "' is not in the list of options." << endl; + std::cout << std::endl << "- Error: Help module '" << + original_text << "' is not in the list of options." << std::endl; return EXIT_FAILURE; } @@ -1368,19 +1368,19 @@ int main(int argc, char* argv[]) UINT32 errorCount(0); bool stn_map_created = false, measurements_mapped = false; - string input_file; + std::string input_file; vstring input_files; - string status_msg; + std::string status_msg; std::ofstream imp_file; try { // Create import log file. Throws runtime_error on failure. file_opener(imp_file, p.i.imp_file); } - catch (const runtime_error& e) { - stringstream ss; - ss << "- Error: Could not open " << p.i.imp_file << ". \n Check that the file exists and that the file is not already opened." << endl; - cout << ss.str() << e.what() << endl; + catch (const std::runtime_error& e) { + std::stringstream ss; + ss << "- Error: Could not open " << p.i.imp_file << ". \n Check that the file exists and that the file is not already opened." << std::endl; + std::cout << ss.str() << e.what() << std::endl; return EXIT_FAILURE; } @@ -1399,88 +1399,88 @@ int main(int argc, char* argv[]) if (!p.g.quiet) { - cout << endl << cmd_line_banner; + std::cout << std::endl << cmd_line_banner; - cout << "+ Options:" << endl; - cout << setw(PRINT_VAR_PAD) << left << " Network name: " << p.g.network_name << endl; - cout << setw(PRINT_VAR_PAD) << left << " Input folder: " << p.g.input_folder << endl; - cout << setw(PRINT_VAR_PAD) << left << " Output folder: " << p.g.output_folder << endl; - cout << setw(PRINT_VAR_PAD) << left << " Associated station file: " << p.i.asl_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Associated measurement file: " << p.i.aml_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Binary station output file: " << p.i.bst_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Binary measurement output file: " << p.i.bms_file << endl; + std::cout << "+ Options:" << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Network name: " << p.g.network_name << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Input folder: " << p.g.input_folder << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Output folder: " << p.g.output_folder << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Associated station file: " << p.i.asl_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Associated measurement file: " << p.i.aml_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Binary station output file: " << p.i.bst_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Binary measurement output file: " << p.i.bms_file << std::endl; // If a reference frame and epoch have been supplied, report them. // If not, the assumption is, the project frame and epoch will be assumed from the first file and // in this case, it will be reported later if (p.i.user_supplied_frame) - cout << setw(PRINT_VAR_PAD) << left << " Project reference frame:" << p.i.reference_frame << " (user supplied)" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project reference frame:" << p.i.reference_frame << " (user supplied)" << std::endl; else - cout << setw(PRINT_VAR_PAD) << left << " Project reference frame:" << "To be assumed from the first input file" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project reference frame:" << "To be assumed from the first input file" << std::endl; if (p.i.override_input_rfame) - cout << setw(PRINT_VAR_PAD) << left << " Override input file ref frame:" << yesno_string(p.i.override_input_rfame) << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Override input file ref frame:" << yesno_string(p.i.override_input_rfame) << std::endl; if (p.i.user_supplied_epoch) - cout << setw(PRINT_VAR_PAD) << left << " Project epoch:" << p.i.epoch << " (user supplied)" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project epoch:" << p.i.epoch << " (user supplied)" << std::endl; else - cout << setw(PRINT_VAR_PAD) << left << " Project epoch:" << "To be assumed from the first input file" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project epoch:" << "To be assumed from the first input file" << std::endl; if (p.i.export_dynaml) { if (p.i.export_single_xml_file) - cout << setw(PRINT_VAR_PAD) << left << " DynaML output file: " << p.i.xml_outfile << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " DynaML output file: " << p.i.xml_outfile << std::endl; else { - cout << setw(PRINT_VAR_PAD) << left << " DynaML station file: " << p.i.xml_stnfile << endl; - cout << setw(PRINT_VAR_PAD) << left << " DynaML measurement file: " << p.i.xml_msrfile << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " DynaML station file: " << p.i.xml_stnfile << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " DynaML measurement file: " << p.i.xml_msrfile << std::endl; } } if (p.i.export_dna_files) { - cout << setw(PRINT_VAR_PAD) << left << " DNA station file: " << p.i.dna_stnfile << endl; - cout << setw(PRINT_VAR_PAD) << left << " DNA measurement file: " << p.i.dna_msrfile << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " DNA station file: " << p.i.dna_stnfile << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " DNA measurement file: " << p.i.dna_msrfile << std::endl; } if (p.i.simulate_measurements) { - cout << setw(PRINT_VAR_PAD) << left << " DNA simulated msr file: " << p.i.simulate_msrfile << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " DNA simulated msr file: " << p.i.simulate_msrfile << std::endl; } if (!p.i.bounding_box.empty()) { - cout << setw(PRINT_VAR_PAD) << left << " Bounding box: " << p.i.bounding_box << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Bounding box: " << p.i.bounding_box << std::endl; if (p.i.split_clusters) - cout << setw(PRINT_VAR_PAD) << left << " Split GNSS clusters: " << (p.i.split_clusters ? "Yes" : "No") << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Split GNSS clusters: " << (p.i.split_clusters ? "Yes" : "No") << std::endl; } else { if (!p.i.stn_associated_msr_include.empty()) - cout << setw(PRINT_VAR_PAD) << left << " Stations to include: " << p.i.stn_associated_msr_include << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Stations to include: " << p.i.stn_associated_msr_include << std::endl; if (!p.i.stn_associated_msr_exclude.empty()) - cout << setw(PRINT_VAR_PAD) << left << " Stations to exclude: " << p.i.stn_associated_msr_exclude << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Stations to exclude: " << p.i.stn_associated_msr_exclude << std::endl; if (p.i.split_clusters) - cout << setw(PRINT_VAR_PAD) << left << " Split GNSS clusters: " << (p.i.split_clusters ? "Yes" : "No") << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Split GNSS clusters: " << (p.i.split_clusters ? "Yes" : "No") << std::endl; } if (p.i.import_block) { if (!p.i.seg_file.empty()) - cout << setw(PRINT_VAR_PAD) << left << " Segmentation file: " << p.i.seg_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Import stns & msrs from block: " << p.i.import_block_number << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Segmentation file: " << p.i.seg_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Import stns & msrs from block: " << p.i.import_block_number << std::endl; } else if (p.i.import_network) { if (!p.i.seg_file.empty()) - cout << setw(PRINT_VAR_PAD) << left << " Segmentation file: " << p.i.seg_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Import stns & msrs from network: " << p.i.import_network_number << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Segmentation file: " << p.i.seg_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Import stns & msrs from network: " << p.i.import_network_number << std::endl; } if (!p.i.scalar_file.empty()) - cout << setw(PRINT_VAR_PAD) << left << " GNSS baseline scalar file: " << p.i.scalar_file << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " GNSS baseline scalar file: " << p.i.scalar_file << std::endl; - cout << endl; + std::cout << std::endl; } PrintOutputFileHeaderInfo(&imp_file, p.i.imp_file, &p, "DYNADJUST IMPORT LOG FILE"); @@ -1503,9 +1503,9 @@ int main(int argc, char* argv[]) parserDynaML.InitialiseDatum(p.i.reference_frame, p.i.epoch); } catch (const XMLInteropException& e) { - stringstream ss; + std::stringstream ss; ss << "- Error: "; - cout << ss.str() << e.what() << endl; + std::cout << ss.str() << e.what() << std::endl; return EXIT_FAILURE; } @@ -1520,7 +1520,7 @@ int main(int argc, char* argv[]) /////////////////////////////////////////////////////////////////////////////////////////////////////////// // start "total" time - cpu_timer time; + boost::timer::cpu_timer time; // Import discontinuity file and apply discontinuities @@ -1531,49 +1531,49 @@ int main(int argc, char* argv[]) p.i.apply_discontinuities = true; // Does it exist? - if (!exists(p.i.stn_discontinuityfile)) + if (!boost::filesystem::exists(p.i.stn_discontinuityfile)) { - path discontPath(p.i.stn_discontinuityfile); - stringstream ss; - ss << "- Warning: The station discontinuity file " << discontPath.filename().string() << " does not exist... ignoring discontinuity input." << endl; - imp_file << endl << ss.str(); + boost::filesystem::path discontPath(p.i.stn_discontinuityfile); + std::stringstream ss; + ss << "- Warning: The station discontinuity file " << discontPath.filename().string() << " does not exist... ignoring discontinuity input." << std::endl; + imp_file << std::endl << ss.str(); } else { if (!p.g.quiet) { - cout << "+ Importing station discontinuities from " << p.i.stn_discontinuityfile << "... "; - cout.flush(); + std::cout << "+ Importing station discontinuities from " << p.i.stn_discontinuityfile << "... "; + std::cout.flush(); } imp_file << "+ Importing station discontinuities from " << p.i.stn_discontinuityfile << "... "; parserDynaML.ParseDiscontinuities(p.i.stn_discontinuityfile); if (!p.g.quiet) - cout << "Done." << endl; - imp_file << "Done." << endl; + std::cout << "Done." << std::endl; + imp_file << "Done." << std::endl; } if (p.i.export_discont_file) { if (!p.g.quiet) { - cout << "+ Exporting discontinuity information to text file... "; - cout.flush(); + std::cout << "+ Exporting discontinuity information to text file... "; + std::cout.flush(); } imp_file << "+ Exporting discontinuity information to text file... "; parserDynaML.SerialiseDiscontTextFile(p.i.stn_discontinuityfile); if (!p.g.quiet) { - cout << "Done." << endl; - cout.flush(); + std::cout << "Done." << std::endl; + std::cout.flush(); } - imp_file << "Done." << endl; + imp_file << "Done." << std::endl; } } // Now, set the 'default' epoch in the binary station and measurement files - string default_datum = p.i.reference_frame; + std::string default_datum = p.i.reference_frame; // Import network information based on a segmentation block? if (p.i.import_block) @@ -1585,7 +1585,7 @@ int main(int argc, char* argv[]) &parsestnTally, &parsemsrTally, p) != EXIT_SUCCESS) return EXIT_FAILURE; - imp_file << "Done." << endl; + imp_file << "Done." << std::endl; } // Import network information based on a contiguous network? else if (p.i.import_network) @@ -1597,7 +1597,7 @@ int main(int argc, char* argv[]) &parsestnTally, &parsemsrTally, p) != EXIT_SUCCESS) return EXIT_FAILURE; - imp_file << "Done." << endl; + imp_file << "Done." << std::endl; } // Import data as normal else @@ -1610,8 +1610,8 @@ int main(int argc, char* argv[]) } if (!p.g.quiet) - cout << endl; - imp_file << endl; + std::cout << std::endl; + imp_file << std::endl; vstring vPoorlyConstrainedStns; @@ -1621,23 +1621,23 @@ int main(int argc, char* argv[]) size_t msrCount = vmeasurementsTotal.size(); if (!p.g.quiet) { - cout << "+ Identifying stations with insufficient measurements"; - cout.flush(); + std::cout << "+ Identifying stations with insufficient measurements"; + std::cout.flush(); } imp_file << "+ Identifying stations with insufficient measurements..."; parserDynaML.IgnoreInsufficientMeasurements(&vstationsTotal, &vmeasurementsTotal, &vPoorlyConstrainedStns); if (!p.g.quiet) { - cout << " Done. " << endl; + std::cout << " Done. " << std::endl; if (msrCount > vmeasurementsTotal.size()) - cout << "+ Removed " << (msrCount - vmeasurementsTotal.size()) << " measurements which alone do not sufficiently allow for" << endl << - " the estimation of 2D coordinates." << endl; + std::cout << "+ Removed " << (msrCount - vmeasurementsTotal.size()) << " measurements which alone do not sufficiently allow for" << std::endl << + " the estimation of 2D coordinates." << std::endl; } - imp_file << " Done. " << endl; + imp_file << " Done. " << std::endl; if (msrCount > vmeasurementsTotal.size()) - imp_file << "+ Removed " << (msrCount - vmeasurementsTotal.size()) << " measurements which alone do not sufficiently allow for" << endl << - " the estimation of 2D coordinates." << endl; + imp_file << "+ Removed " << (msrCount - vmeasurementsTotal.size()) << " measurements which alone do not sufficiently allow for" << std::endl << + " the estimation of 2D coordinates." << std::endl; if (!vPoorlyConstrainedStns.empty()) { @@ -1646,14 +1646,14 @@ int main(int argc, char* argv[]) if (p.g.verbose > 2) { if (!p.g.quiet) - cout << "- Warning: station " << vPoorlyConstrainedStns.at(0) << " is not associated with sufficient measurements." << endl; - imp_file << "- Warning: station " << vPoorlyConstrainedStns.at(0) << " is not associated with sufficient measurements." << endl; + std::cout << "- Warning: station " << vPoorlyConstrainedStns.at(0) << " is not associated with sufficient measurements." << std::endl; + imp_file << "- Warning: station " << vPoorlyConstrainedStns.at(0) << " is not associated with sufficient measurements." << std::endl; } else { if (!p.g.quiet) - cout << "- Warning: 1 station is not associated with sufficient measurements." << endl; - imp_file << "- Warning: 1 station is not associated with sufficient measurements." << endl; + std::cout << "- Warning: 1 station is not associated with sufficient measurements." << std::endl; + imp_file << "- Warning: 1 station is not associated with sufficient measurements." << std::endl; } } else @@ -1661,21 +1661,21 @@ int main(int argc, char* argv[]) if (p.g.verbose > 2) { if (!p.g.quiet) - cout << "- Warning: The following " << vPoorlyConstrainedStns.size() << " stations are not associated with sufficient measurements." << endl; - imp_file << "- Warning: The following " << vPoorlyConstrainedStns.size() << " stations are not associated with sufficient measurements." << endl; + std::cout << "- Warning: The following " << vPoorlyConstrainedStns.size() << " stations are not associated with sufficient measurements." << std::endl; + imp_file << "- Warning: The following " << vPoorlyConstrainedStns.size() << " stations are not associated with sufficient measurements." << std::endl; _it_vstr poorly; for (poorly = vPoorlyConstrainedStns.begin(); poorly != vPoorlyConstrainedStns.end(); poorly++) { if (!p.g.quiet) - outputObject(string(" - " + *poorly + "\n"), cout); - outputObject(string(" - " + *poorly + "\n"), imp_file); + outputObject(std::string(" - " + *poorly + "\n"), std::cout); + outputObject(std::string(" - " + *poorly + "\n"), imp_file); } } else { if (!p.g.quiet) - cout << "- Warning: " << vPoorlyConstrainedStns.size() << " stations are not associated with sufficient measurements." << endl; - imp_file << "- Warning: " << vPoorlyConstrainedStns.size() << " stations are not associated with sufficient measurements." << endl; + std::cout << "- Warning: " << vPoorlyConstrainedStns.size() << " stations are not associated with sufficient measurements." << std::endl; + imp_file << "- Warning: " << vPoorlyConstrainedStns.size() << " stations are not associated with sufficient measurements." << std::endl; } } } @@ -1686,14 +1686,14 @@ int main(int argc, char* argv[]) { if (!p.g.quiet) { - cout << "+ Removing ignored measurements... "; - cout.flush(); + std::cout << "+ Removing ignored measurements... "; + std::cout.flush(); } imp_file << "+ Removing ignored measurements... "; parserDynaML.RemoveIgnoredMeasurements(&vmeasurementsTotal, &parsemsrTally); if (!p.g.quiet) - cout << "Done. " << endl; - imp_file << "Done. " << endl; + std::cout << "Done. " << std::endl; + imp_file << "Done. " << std::endl; } // Strip all measurements except required measurements (if supplied) @@ -1701,14 +1701,14 @@ int main(int argc, char* argv[]) { if (!p.g.quiet) { - cout << "+ Stripping all measurements except types " << p.i.include_msrs << "... "; - cout.flush(); + std::cout << "+ Stripping all measurements except types " << p.i.include_msrs << "... "; + std::cout.flush(); } imp_file << "+ Stripping all measurements except types " << p.i.include_msrs << "... "; parserDynaML.IncludeMeasurementTypes(p.i.include_msrs, &vmeasurementsTotal, &parsemsrTally); if (!p.g.quiet) - cout << "Done. " << endl; - imp_file << "Done. " << endl; + std::cout << "Done. " << std::endl; + imp_file << "Done. " << std::endl; } // Strip all unwanted measurements (if supplied) @@ -1716,14 +1716,14 @@ int main(int argc, char* argv[]) { if (!p.g.quiet) { - cout << "+ Stripping measurement types " << p.i.exclude_msrs << "... "; - cout.flush(); + std::cout << "+ Stripping measurement types " << p.i.exclude_msrs << "... "; + std::cout.flush(); } imp_file << "+ Stripping measurement types " << p.i.exclude_msrs << "... "; parserDynaML.ExcludeMeasurementTypes(p.i.exclude_msrs, &vmeasurementsTotal, &parsemsrTally); if (!p.g.quiet) - cout << "Done. " << endl; - imp_file << "Done. " << endl; + std::cout << "Done. " << std::endl; + imp_file << "Done. " << std::endl; } // Reduce stations. @@ -1737,18 +1737,18 @@ int main(int argc, char* argv[]) try { if (!p.g.quiet) { - cout << "+ Reducing stations... "; - cout.flush(); + std::cout << "+ Reducing stations... "; + std::cout.flush(); } imp_file << "+ Reducing stations... "; parserDynaML.ReduceStations(&vstationsTotal, projection); if (!p.g.quiet) - cout << "Done." << endl; - imp_file << "Done." << endl; + std::cout << "Done." << std::endl; + imp_file << "Done." << std::endl; } catch (const XMLInteropException& e) { - cout << endl << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -1778,8 +1778,8 @@ int main(int argc, char* argv[]) try { if (!p.g.quiet) { - cout << "+ Extracting stations and associated measurements... "; - cout.flush(); + std::cout << "+ Extracting stations and associated measurements... "; + std::cout.flush(); } imp_file << "+ Extracting stations and associated measurements... "; @@ -1788,15 +1788,15 @@ int main(int argc, char* argv[]) &parsestnTally, &parsemsrTally, &vUnusedStns, p, splitXmsrs, splitYmsrs); } catch (const XMLInteropException& e) { - cout << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } if (!p.g.quiet) - cout << "Done. " << endl; - imp_file << "Done." << endl; + std::cout << "Done. " << std::endl; + imp_file << "Done." << std::endl; //msrCount = vmeasurementsTotal.size(); } @@ -1811,32 +1811,32 @@ int main(int argc, char* argv[]) try { if (!p.g.quiet) { - cout << "+ Stripping stations and measurements outside the bounding box... "; - cout.flush(); + std::cout << "+ Stripping stations and measurements outside the bounding box... "; + std::cout.flush(); } imp_file << "+ Stripping stations and measurements outside the bounding box... "; parserDynaML.ExcludeAllOutsideBoundingBox(&vstationsTotal, &vmeasurementsTotal, &parsestnTally, &parsemsrTally, &vUnusedStns, p, splitXmsrs, splitYmsrs); } catch (const XMLInteropException& e) { - cout << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } if (!p.g.quiet) - cout << "Done. " << endl; - imp_file << "Done." << endl; + std::cout << "Done. " << std::endl; + imp_file << "Done." << std::endl; if (!vUnusedStns.empty()) { - ostringstream ss_msg; + std::ostringstream ss_msg; ss_msg << " - " << vstationsTotal.size() << (vstationsTotal.size() == 1 ? " station is" : " stations are") << - " within the bounding box." << endl; + " within the bounding box." << std::endl; imp_file << ss_msg.str(); if (!p.g.quiet) - cout << ss_msg.str(); + std::cout << ss_msg.str(); ss_msg.str(""); ss_msg << " - "; if (vUnusedStns.size() > 1) @@ -1846,8 +1846,8 @@ int main(int argc, char* argv[]) else ss_msg << "Station " << vUnusedStns.at(0) << " was"; - ss_msg << " found outside the bounding box and " << (vUnusedStns.size() > 1 ? "have been" : "has been") << endl << - " removed together with the corresponding measurements." << endl; + ss_msg << " found outside the bounding box and " << (vUnusedStns.size() > 1 ? "have been" : "has been") << std::endl << + " removed together with the corresponding measurements." << std::endl; if (p.i.split_clusters && (splitXmsrs || splitYmsrs)) { ss_msg << " - Note: GPS "; @@ -1857,22 +1857,22 @@ int main(int argc, char* argv[]) ss_msg << "baseline"; else //if (splitYmsrs) ss_msg << "point"; - ss_msg << " cluster measurements straddling the limits of" << endl << - " the bounding box have been split." << endl; + ss_msg << " cluster measurements straddling the limits of" << std::endl << + " the bounding box have been split." << std::endl; } - imp_file << ss_msg.str() << " - Excluded stations:" << endl; + imp_file << ss_msg.str() << " - Excluded stations:" << std::endl; if (!p.g.quiet) - cout << ss_msg.str() << endl; + std::cout << ss_msg.str() << std::endl; for (stn=0; stn(vinput_file_meta.at(0).filetype) << ")"; + datumSource << ". Taken from first file (" << FormatFileType(vinput_file_meta.at(0).filetype) << ")"; } if (!p.g.quiet) - cout << setw(PRINT_VAR_PAD) << left << "+ Project reference frame:" << p.i.reference_frame << datumSource.str() << endl; - imp_file << setw(PRINT_VAR_PAD) << left << "+ Project reference frame:" << p.i.reference_frame << datumSource.str() << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << "+ Project reference frame:" << p.i.reference_frame << datumSource.str() << std::endl; + imp_file << std::setw(PRINT_VAR_PAD) << std::left << "+ Project reference frame:" << p.i.reference_frame << datumSource.str() << std::endl; } if (!p.g.quiet) - cout << endl; - imp_file << endl; + std::cout << std::endl; + imp_file << std::endl; /////////////////////////////////////////////////////////////////////// // Ok, now that unwanted stations and measurements have been stripped, @@ -1910,19 +1910,19 @@ int main(int argc, char* argv[]) if (p.i.import_block || p.i.import_network) { if (!p.g.quiet) - cout << "+ Binary file "; + std::cout << "+ Binary file "; imp_file << "+ Binary file "; } else { if (!p.g.quiet) - cout << "+ File "; + std::cout << "+ File "; imp_file << "+ File "; } if (!p.g.quiet) - cout << "parsing summary:" << endl << endl; - imp_file << "parsing summary:" << endl << endl; + std::cout << "parsing summary:" << std::endl << std::endl; + imp_file << "parsing summary:" << std::endl << std::endl; } // @@ -1931,11 +1931,11 @@ int main(int argc, char* argv[]) { if (!p.g.quiet) { - parsestnTally.coutSummary(cout, string(" Read")); - cout << endl; + parsestnTally.coutSummary(std::cout, std::string(" Read")); + std::cout << std::endl; } - parsestnTally.coutSummary(imp_file, string(" Read")); - imp_file << endl; + parsestnTally.coutSummary(imp_file, std::string(" Read")); + imp_file << std::endl; } // @@ -1944,20 +1944,20 @@ int main(int argc, char* argv[]) { if (!p.g.quiet) { - parsemsrTally.coutSummary(cout, string(" Read")); - cout << endl; + parsemsrTally.coutSummary(std::cout, std::string(" Read")); + std::cout << std::endl; } - parsemsrTally.coutSummary(imp_file, string(" Read")); - imp_file << endl; + parsemsrTally.coutSummary(imp_file, std::string(" Read")); + imp_file << std::endl; } //////////////////////////////////////////////////////////////////////// // Can we proceed? if (stnCount < 1) { - imp_file << "- No further processing can be done as no stations were loaded." << endl; + imp_file << "- No further processing can be done as no stations were loaded." << std::endl; if (!p.g.quiet) - cout << "- No further processing can be done as no stations were loaded." << endl; + std::cout << "- No further processing can be done as no stations were loaded." << std::endl; imp_file.close(); return PARSE_SUCCESS; } @@ -1967,26 +1967,26 @@ int main(int argc, char* argv[]) if (p.i.rename_stations && (stnCount > 0 || msrCount > 0)) { // Does it exist? - if (!exists(p.i.stn_renamingfile)) + if (!boost::filesystem::exists(p.i.stn_renamingfile)) // Look for it in the input folder - p.i.stn_renamingfile = formPath(p.g.input_folder, leafStr(p.i.stn_renamingfile)); + p.i.stn_renamingfile = formPath(p.g.input_folder, leafStr(p.i.stn_renamingfile)); // Apply renaming try { if (!p.g.quiet) { - cout << "+ Renaming stations... "; - cout.flush(); + std::cout << "+ Renaming stations... "; + std::cout.flush(); } imp_file << "+ Renaming stations... "; parserDynaML.RenameStations(&vstationsTotal, &vmeasurementsTotal, &p); if (!p.g.quiet) - cout << "Done." << endl; - imp_file << "Done." << endl; + std::cout << "Done." << std::endl; + imp_file << "Done." << std::endl; } catch (const XMLInteropException& e) { - cout << endl << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -1999,18 +1999,18 @@ int main(int argc, char* argv[]) try { if (!p.g.quiet) { - cout << "+ Applying scalars to GNSS measurements... "; - cout.flush(); + std::cout << "+ Applying scalars to GNSS measurements... "; + std::cout.flush(); } imp_file << "+ Applying scalars to GNSS measurements... "; parserDynaML.EditGNSSMsrScalars(&vmeasurementsTotal, &p); if (!p.g.quiet) - cout << "Done." << endl; - imp_file << "Done." << endl; + std::cout << "Done." << std::endl; + imp_file << "Done." << std::endl; } catch (const XMLInteropException& e) { - cout << endl << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -2020,20 +2020,20 @@ int main(int argc, char* argv[]) // flush duplicate stations/measurements files try { - if (exists(p.i.dst_file)) - remove(p.i.dst_file); - if (exists(p.i.dms_file)) - remove(p.i.dms_file); + if (boost::filesystem::exists(p.i.dst_file)) + boost::filesystem::remove(p.i.dst_file); + if (boost::filesystem::exists(p.i.dms_file)) + boost::filesystem::remove(p.i.dms_file); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { // do nothing on failure. - imp_file << endl << "- Warning: " << f.what() << endl; + imp_file << std::endl << "- Warning: " << f.what() << std::endl; } // Prepare file names if importing from a segmentation block or contiguous network if (p.i.import_block == 1 || p.i.import_network == 1) { - stringstream modifier(""); + std::stringstream modifier(""); if (p.i.import_block == 1) modifier << ".block-" << p.i.import_block_number; else if (p.i.import_network == 1) @@ -2041,33 +2041,33 @@ int main(int argc, char* argv[]) // create new output file names based on block number // reform file name for each so as to preserve full path for each file - stringstream ss(""); - ss << formPath(path(p.i.bst_file).parent_path().generic_string(), path(p.i.bst_file).stem().generic_string()); + std::stringstream ss(""); + ss << formPath(boost::filesystem::path(p.i.bst_file).parent_path().generic_string(), boost::filesystem::path(p.i.bst_file).stem().generic_string()); ss << modifier.str() << ".bst"; p.i.bst_file = ss.str(); ss.str(""); - ss << formPath(path(p.i.bms_file).parent_path().generic_string(), path(p.i.bms_file).stem().generic_string()); + ss << formPath(boost::filesystem::path(p.i.bms_file).parent_path().generic_string(), boost::filesystem::path(p.i.bms_file).stem().generic_string()); ss << modifier.str() << ".bms"; p.i.bms_file = ss.str(); ss.str(""); - ss << formPath(path(p.i.asl_file).parent_path().generic_string(), path(p.i.asl_file).stem().generic_string()); + ss << formPath(boost::filesystem::path(p.i.asl_file).parent_path().generic_string(), boost::filesystem::path(p.i.asl_file).stem().generic_string()); ss << modifier.str() << ".asl"; p.i.asl_file = ss.str(); ss.str(""); - ss << formPath(path(p.i.aml_file).parent_path().generic_string(), path(p.i.aml_file).stem().generic_string()); + ss << formPath(boost::filesystem::path(p.i.aml_file).parent_path().generic_string(), boost::filesystem::path(p.i.aml_file).stem().generic_string()); ss << modifier.str() << ".aml"; p.i.aml_file = ss.str(); ss.str(""); - ss << formPath(path(p.i.map_file).parent_path().generic_string(), path(p.i.map_file).stem().generic_string()); + ss << formPath(boost::filesystem::path(p.i.map_file).parent_path().generic_string(), boost::filesystem::path(p.i.map_file).stem().generic_string()); ss << modifier.str() << ".map"; p.i.map_file = ss.str(); ss.str(""); - ss << formPath(path(p.i.map_file).parent_path().generic_string(), path(p.i.map_file).stem().generic_string()); + ss << formPath(boost::filesystem::path(p.i.map_file).parent_path().generic_string(), boost::filesystem::path(p.i.map_file).stem().generic_string()); ss << ".dbid"; p.i.dbid_file = ss.str(); } @@ -2081,7 +2081,7 @@ int main(int argc, char* argv[]) // Remove duplicates and, if required, identify station pairs // separated by distances less than search_stn_radius try { - ostringstream ss_msg; + std::ostringstream ss_msg; if (p.i.search_nearby_stn) ss_msg << "+ Testing for duplicate and nearby stations... "; else @@ -2089,8 +2089,8 @@ int main(int argc, char* argv[]) if (!p.g.quiet) { - cout << ss_msg.str(); - cout.flush(); + std::cout << ss_msg.str(); + std::cout.flush(); } imp_file << ss_msg.str(); @@ -2098,7 +2098,7 @@ int main(int argc, char* argv[]) stn = parserDynaML.RemoveDuplicateStations(&vstationsTotal, &vduplicateStns, &vnearbyStns); if (!p.g.quiet) - cout << "Done. "; + std::cout << "Done. "; imp_file << "Done. "; if (stn > 0) @@ -2107,11 +2107,11 @@ int main(int argc, char* argv[]) // Create duplicate station file file_opener(dst_file, p.i.dst_file); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss_msg << "- Error: Could not open " << p.i.dst_file << ". \n Check that the file exists and that the file is not already opened." << - endl << e.what() << endl; + std::endl << e.what() << std::endl; if (!p.g.quiet) - cout << ss_msg.str(); + std::cout << ss_msg.str(); imp_file << ss_msg.str(); imp_file.close(); return EXIT_FAILURE; @@ -2125,66 +2125,66 @@ int main(int argc, char* argv[]) ss_msg << "Removed " << vduplicateStns.size() << " duplicate station" << (vduplicateStns.size() > 1 ? "s" : ""); // print message to .dst file - dst_file << ss_msg.str() << ":" << endl; + dst_file << ss_msg.str() << ":" << std::endl; for (stn=0; stn 1 ? " pairs of stations were" : " pair of station was") << - " found to be separated by less than " << setprecision(3) << p.i.search_stn_radius << "m."; + " found to be separated by less than " << std::setprecision(3) << p.i.search_stn_radius << "m."; - imp_file << endl << "- Warning: " << ss_msg.str() << endl << - " See " << p.i.dst_file << " for details." << endl << endl; + imp_file << std::endl << "- Warning: " << ss_msg.str() << std::endl << + " See " << p.i.dst_file << " for details." << std::endl << std::endl; if (!p.g.quiet) - cout << endl << "- Warning: " << ss_msg.str() << endl << - " See " << p.i.dst_file << " for details." << endl << endl; + std::cout << std::endl << "- Warning: " << ss_msg.str() << std::endl << + " See " << p.i.dst_file << " for details." << std::endl << std::endl; ss_msg.str(""); // output message - dst_file << "Nearby station search results:" << endl << ss_msg.str() << endl << endl; + dst_file << "Nearby station search results:" << std::endl << ss_msg.str() << std::endl << std::endl; dst_file << - setw(HEADER_20) << left << "First station" << - setw(HEADER_20) << "Nearby station" << - setw(HEADER_20) << right << "Separation (m)" << - setw(HEADER_20) << "Diff height (m)" << - endl; + std::setw(HEADER_20) << std::left << "First station" << + std::setw(HEADER_20) << "Nearby station" << + std::setw(HEADER_20) << std::right << "Separation (m)" << + std::setw(HEADER_20) << "Diff height (m)" << + std::endl; for (UINT32 i(0); i<(HEADER_20*4); ++i) dst_file << "-"; - dst_file << endl; + dst_file << std::endl; // dump nearby stations to dst file for (stn=0; stn 0) { measurements_mapped = true; - imp_file << "Mapped " << mapCount << " measurements to " << vStnsMap_sortName.size() - vunusedStations.size() << " stations." << endl; + imp_file << "Mapped " << mapCount << " measurements to " << vStnsMap_sortName.size() - vunusedStations.size() << " stations." << std::endl; } else - imp_file << endl; + imp_file << std::endl; if (!vunusedStations.empty()) { @@ -2335,14 +2335,14 @@ int main(int argc, char* argv[]) if (p.g.verbose > 2) { if (!p.g.quiet) - cout << "- Warning: station " << vunusedStations.at(0) << " was not associated with any measurements." << endl; - imp_file << "- Warning: station " << vunusedStations.at(0) << " was not associated with any measurements." << endl; + std::cout << "- Warning: station " << vunusedStations.at(0) << " was not associated with any measurements." << std::endl; + imp_file << "- Warning: station " << vunusedStations.at(0) << " was not associated with any measurements." << std::endl; } else { if (!p.g.quiet) - cout << "- Warning: " << vunusedStations.size() << " station was not associated with any measurements." << endl; - imp_file << "- Warning: " << vunusedStations.size() << " station was not associated with any measurements." << endl; + std::cout << "- Warning: " << vunusedStations.size() << " station was not associated with any measurements." << std::endl; + imp_file << "- Warning: " << vunusedStations.size() << " station was not associated with any measurements." << std::endl; } } else @@ -2350,21 +2350,21 @@ int main(int argc, char* argv[]) if (p.g.verbose > 2) { if (!p.g.quiet) - cout << "- Warning: The following " << vunusedStations.size() << " stations were not associated with any measurements." << endl; - imp_file << "- Warning: The following " << vunusedStations.size() << " stations were not associated with any measurements." << endl; + std::cout << "- Warning: The following " << vunusedStations.size() << " stations were not associated with any measurements." << std::endl; + imp_file << "- Warning: The following " << vunusedStations.size() << " stations were not associated with any measurements." << std::endl; _it_vstr unused; for (unused = vunusedStations.begin(); unused!=vunusedStations.end(); unused++) { if (!p.g.quiet) - outputObject(string(" - " + *unused + "\n"), cout); - outputObject(string(" - " + *unused + "\n"), imp_file); + outputObject(std::string(" - " + *unused + "\n"), std::cout); + outputObject(std::string(" - " + *unused + "\n"), imp_file); } } else { if (!p.g.quiet) - cout << "- Warning: " << vunusedStations.size() << " stations were not associated with any measurements." << endl; - imp_file << "- Warning: " << vunusedStations.size() << " stations were not associated with any measurements." << endl; + std::cout << "- Warning: " << vunusedStations.size() << " stations were not associated with any measurements." << std::endl; + imp_file << "- Warning: " << vunusedStations.size() << " stations were not associated with any measurements." << std::endl; } } } @@ -2372,25 +2372,25 @@ int main(int argc, char* argv[]) if (msrRead < mapCount && vignoredMeasurements.empty()) { if (!p.g.quiet) - cout << "- Warning: Not all measurements were mapped: " << msrRead << " msrs read vs. " << mapCount - << " msrs mapped." << endl; + std::cout << "- Warning: Not all measurements were mapped: " << msrRead << " msrs read vs. " << mapCount + << " msrs mapped." << std::endl; } else if (msrRead != mapCount && !vignoredMeasurements.empty()) { ignMsrCount = parserDynaML.ComputeMeasurementCount(&vmeasurementsTotal, vignoredMeasurements); if (!p.g.quiet) { - cout << "- Warning: " << ignMsrCount << " ignored measurements were not mapped." << endl; + std::cout << "- Warning: " << ignMsrCount << " ignored measurements were not mapped." << std::endl; if ((msrRead - mapCount) != ignMsrCount) - cout << "- " << msrRead << " m.read vs. " << mapCount << " m.mapped." << endl; + std::cout << "- " << msrRead << " m.read vs. " << mapCount << " m.mapped." << std::endl; } } if (!p.g.quiet) - cout.flush(); + std::cout.flush(); } catch (const XMLInteropException& e) { - cout << endl << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -2409,8 +2409,8 @@ int main(int argc, char* argv[]) // if (stnCount == 0) // { // if (!p.g.quiet) - // cout << "- Error: there are no stations from which to simulate measurements." << endl; - // imp_file << "- Error: there are no stations from which to simulate measurements." << endl; + // std::cout << "- Error: there are no stations from which to simulate measurements." << std::endl; + // imp_file << "- Error: there are no stations from which to simulate measurements." << std::endl; // imp_file.close(); // return EXIT_FAILURE; // } @@ -2419,22 +2419,22 @@ int main(int argc, char* argv[]) // Simulate measurements if (!p.g.quiet) { - cout << "+ Simulating and exporting measurements to " << leafStr(p.i.simulate_msrfile) << "... "; - cout.flush(); + std::cout << "+ Simulating and exporting measurements to " << leafStr(p.i.simulate_msrfile) << "... "; + std::cout.flush(); } - imp_file << "+ Simulating and exporting measurements to " << leafStr(p.i.simulate_msrfile) << "... "; + imp_file << "+ Simulating and exporting measurements to " << leafStr(p.i.simulate_msrfile) << "... "; parserDynaML.SimulateMSR( ((vdnaStnPtr*) &vstationsTotal), ((vdnaMsrPtr*) &vmeasurementsTotal), p.i.simulate_msrfile, p); if (!p.g.quiet) - cout << "Done." << endl; - imp_file << "Done." << endl; + std::cout << "Done." << std::endl; + imp_file << "Done." << std::endl; } catch (const XMLInteropException& e) { - cout.flush(); - cout << endl << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout.flush(); + std::cout << std::endl << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -2446,21 +2446,21 @@ int main(int argc, char* argv[]) try { if (!p.g.quiet) { - cout << "+ Creating association lists... "; - cout.flush(); + std::cout << "+ Creating association lists... "; + std::cout.flush(); } imp_file << "+ Creating association lists... "; parserDynaML.CompleteAssociationLists(&vmeasurementsTotal, &associatedSL, &associatedML); if (!p.g.quiet) { - cout << "Done." << endl; - cout.flush(); + std::cout << "Done." << std::endl; + std::cout.flush(); } - imp_file << "Done." << endl; + imp_file << "Done." << std::endl; } catch (const XMLInteropException& e) { - cout << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -2468,22 +2468,22 @@ int main(int argc, char* argv[]) try { if (!p.g.quiet) { - cout << "+ Serialising association lists... "; - cout.flush(); + std::cout << "+ Serialising association lists... "; + std::cout.flush(); } imp_file << "+ Serialising association lists... "; parserDynaML.SerialiseAsl(p.i.asl_file, &associatedSL); parserDynaML.SerialiseAml(p.i.aml_file, &associatedML); if (!p.g.quiet) { - cout << "Done." << endl; - cout.flush(); + std::cout << "Done." << std::endl; + std::cout.flush(); } - imp_file << "Done." << endl; + imp_file << "Done." << std::endl; } catch (const XMLInteropException& e) { - cout << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -2498,25 +2498,25 @@ int main(int argc, char* argv[]) { if (!p.g.quiet) { - cout << "+ Serialising binary station file " << leafStr(p.i.bst_file) << "... "; - cout.flush(); + std::cout << "+ Serialising binary station file " << leafStr(p.i.bst_file) << "... "; + std::cout.flush(); } - imp_file << "+ Serialising binary station file " << leafStr(p.i.bst_file) << "... "; + imp_file << "+ Serialising binary station file " << leafStr(p.i.bst_file) << "... "; parserDynaML.SerialiseBst( p.i.bst_file, ((vdnaStnPtr*) &vstationsTotal), &vunusedStations, vinput_file_meta, (p.i.flag_unused_stn ? true : false)); if (!p.g.quiet) { - cout << "Done." << endl; - cout.flush(); + std::cout << "Done." << std::endl; + std::cout.flush(); } - imp_file << "Done." << endl; + imp_file << "Done." << std::endl; } } catch (const XMLInteropException& e) { - cout << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -2531,25 +2531,25 @@ int main(int argc, char* argv[]) { if (!p.g.quiet) { - cout << "+ Serialising binary measurement file " << leafStr(p.i.bms_file) << "... "; - cout.flush(); + std::cout << "+ Serialising binary measurement file " << leafStr(p.i.bms_file) << "... "; + std::cout.flush(); } - imp_file << "+ Serialising binary measurement file " << leafStr(p.i.bms_file) << "... "; + imp_file << "+ Serialising binary measurement file " << leafStr(p.i.bms_file) << "... "; parserDynaML.SerialiseBms( p.i.bms_file, ((vdnaMsrPtr*) &vmeasurementsTotal), vinput_file_meta); if (!p.g.quiet) { - cout << "Done." << endl; - cout.flush(); + std::cout << "Done." << std::endl; + std::cout.flush(); } - imp_file << "Done." << endl; + imp_file << "Done." << std::endl; } } catch (const XMLInteropException& e) { - cout << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -2563,22 +2563,22 @@ int main(int argc, char* argv[]) { if (!p.g.quiet) { - cout << "+ Exporting associated station list to text file... "; - cout.flush(); + std::cout << "+ Exporting associated station list to text file... "; + std::cout.flush(); } imp_file << "+ Exporting associated station list to text file... "; parserDynaML.SerialiseAslTextFile(p.i.asl_file, &associatedSL, (vdnaStnPtr*) &vstationsTotal); if (!p.g.quiet) { - cout << "Done." << endl; - cout.flush(); + std::cout << "Done." << std::endl; + std::cout.flush(); } - imp_file << "Done." << endl; + imp_file << "Done." << std::endl; } } catch (const XMLInteropException& e) { - cout << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -2588,22 +2588,22 @@ int main(int argc, char* argv[]) { if (!p.g.quiet) { - cout << "+ Exporting associated measurement list to text file... "; - cout.flush(); + std::cout << "+ Exporting associated measurement list to text file... "; + std::cout.flush(); } imp_file << "+ Exporting associated measurement list to text file... "; parserDynaML.SerialiseAmlTextFile(p.i.bms_file, p.i.aml_file, &associatedML, &associatedSL, (vdnaStnPtr*) &vstationsTotal); if (!p.g.quiet) { - cout << "Done." << endl; - cout.flush(); + std::cout << "Done." << std::endl; + std::cout.flush(); } - imp_file << "Done." << endl; + imp_file << "Done." << std::endl; } } catch (const XMLInteropException& e) { - cout << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -2612,20 +2612,20 @@ int main(int argc, char* argv[]) { if (!p.g.quiet) { - cout << "+ Testing internal integrity of ASL, AML and binary files... "; - cout.flush(); + std::cout << "+ Testing internal integrity of ASL, AML and binary files... "; + std::cout.flush(); } - std::ifstream binaryMS(p.i.bms_file.c_str(), ios::in | ios::binary | std::ifstream::ate); /// Open and seek to end immediately after opening. + std::ifstream binaryMS(p.i.bms_file.c_str(), std::ios::in | std::ios::binary | std::ifstream::ate); /// Open and seek to end immediately after opening. if (!binaryMS.good()) { - cout << endl << "- Could not open binary file for reading." << endl; - imp_file << endl << "- Could not open binary file for reading." << endl; + std::cout << std::endl << "- Could not open binary file for reading." << std::endl; + imp_file << std::endl << "- Could not open binary file for reading." << std::endl; imp_file.close(); return EXIT_FAILURE; } // get size, then go back to beginning size_t sFileSize = (size_t)binaryMS.tellg(); - binaryMS.seekg(0, ios::beg); + binaryMS.seekg(0, std::ios::beg); measurement_t measRecord; @@ -2640,16 +2640,16 @@ int main(int argc, char* argv[]) amlindex = associatedSL.at(stn).get()->GetAMLStnIndex() + msr; if (associatedML.at(amlindex) * sizeof(measurement_t) >= sFileSize) { - cout << "Error: index " << associatedML.at(amlindex) << " is out of range for the binary file." << endl; + std::cout << "Error: index " << associatedML.at(amlindex) << " is out of range for the binary file." << std::endl; continue; } - binaryMS.seekg(sizeof(UINT32) + associatedML.at(amlindex) * sizeof(measurement_t), ios::beg); + binaryMS.seekg(sizeof(UINT32) + associatedML.at(amlindex) * sizeof(measurement_t), std::ios::beg); binaryMS.read(reinterpret_cast(&measRecord), sizeof(measurement_t)); } } binaryMS.close(); if (!p.g.quiet) - cout << "OK." << endl; + std::cout << "OK." << std::endl; } } @@ -2658,9 +2658,9 @@ int main(int argc, char* argv[]) PrintMeasurementstoStations(&parsemsrTally, &parserDynaML, &p, &associatedSL); } catch (const XMLInteropException& e) { - cout.flush(); - cout << endl << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout.flush(); + std::cout << std::endl << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -2674,7 +2674,7 @@ int main(int argc, char* argv[]) } else { - p.i.dbid_file = formPath(p.g.output_folder, p.g.network_name, "dbid"); + p.i.dbid_file = formPath(p.g.output_folder, p.g.network_name, "dbid"); parserDynaML.SerialiseDatabaseId(p.i.dbid_file, &vmeasurementsTotal); } @@ -2685,9 +2685,9 @@ int main(int argc, char* argv[]) &vstationsTotal, &vmeasurementsTotal, stnCount, msrCount); } catch (const XMLInteropException& e) { - cout.flush(); - cout << endl << "- Error: " << e.what() << endl; - imp_file << endl << "- Error: " << e.what() << endl; + std::cout.flush(); + std::cout << std::endl << "- Error: " << e.what() << std::endl; + imp_file << std::endl << "- Error: " << e.what() << std::endl; imp_file.close(); return EXIT_FAILURE; } @@ -2703,7 +2703,7 @@ int main(int argc, char* argv[]) // Update the import settings. // Print the project file. If it doesn't exist, it will be created. CDnaProjectFile projectFile; - if (exists(p.g.project_file)) + if (boost::filesystem::exists(p.g.project_file)) projectFile.LoadProjectFile(p.g.project_file); projectFile.UpdateSettingsImport(p); @@ -2713,45 +2713,45 @@ int main(int argc, char* argv[]) if (msrCount == 0) { - cout << "- Warning: there are no measurements to process." << endl; - imp_file << "- Warning: there are no measurements to process." << endl; + std::cout << "- Warning: there are no measurements to process." << std::endl; + imp_file << "- Warning: there are no measurements to process." << std::endl; } if (errorCount) { if (!p.g.quiet) - cout << "- Warning: some files were not parsed - please read the log file for more details." << endl; - imp_file << "- Warning: some files were not parsed - please read the log file for more details." << endl; + std::cout << "- Warning: some files were not parsed - please read the log file for more details." << std::endl; + imp_file << "- Warning: some files were not parsed - please read the log file for more details." << std::endl; } // Produce a warning if an ensemble is set as the default reference frame if (isEpsgWGS84Ensemble(epsgCode)) { - stringstream ssEnsembleWarning; - ssEnsembleWarning << endl << - "- Warning: The '" << p.i.reference_frame << "' reference frame set for this project refers to the" << endl << - " \"World Geodetic System 1984 (WGS 84) ensemble\". The WGS 84 ensemble is" << endl << - " only suitable for low accuracy (metre level) positioning and does not" << endl << - " provide for precise transformations to other well-known reference frames." << endl << - " To achieve reliable adjustment results from data on WGS 84, please refer" << endl << - " to \"Configuring import options\" in the DynAdjust User's Guide." << endl; + std::stringstream ssEnsembleWarning; + ssEnsembleWarning << std::endl << + "- Warning: The '" << p.i.reference_frame << "' reference frame set for this project refers to the" << std::endl << + " \"World Geodetic System 1984 (WGS 84) ensemble\". The WGS 84 ensemble is" << std::endl << + " only suitable for low accuracy (metre level) positioning and does not" << std::endl << + " provide for precise transformations to other well-known reference frames." << std::endl << + " To achieve reliable adjustment results from data on WGS 84, please refer" << std::endl << + " to \"Configuring import options\" in the DynAdjust User's Guide." << std::endl; if (!p.g.quiet) - cout << ssEnsembleWarning.str(); + std::cout << ssEnsembleWarning.str(); imp_file << ssEnsembleWarning.str(); } - milliseconds elapsed_time(milliseconds(time.elapsed().wall/MILLI_TO_NANO)); - string time_message = formatedElapsedTime(&elapsed_time, "+ Total file handling process took "); + boost::posix_time::milliseconds elapsed_time(boost::posix_time::milliseconds(time.elapsed().wall/MILLI_TO_NANO)); + std::string time_message = formatedElapsedTime(&elapsed_time, "+ Total file handling process took "); if (!p.g.quiet) - cout << endl << time_message << endl; - imp_file << endl << time_message << endl; + std::cout << std::endl << time_message << std::endl; + imp_file << std::endl << time_message << std::endl; if (stnCount > 0 && msrCount > 0) { if (!p.g.quiet) - cout << "+ Binary station and measurement files are now ready for processing." << endl << endl; - imp_file << "+ Binary station and measurement files are now ready for processing." << endl << endl; + std::cout << "+ Binary station and measurement files are now ready for processing." << std::endl << std::endl; + imp_file << "+ Binary station and measurement files are now ready for processing." << std::endl << std::endl; } imp_file.close(); diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.hpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.hpp index 30eb93cd..fb28ad4d 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.hpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.hpp @@ -56,16 +56,6 @@ #include #include -using namespace std; -using namespace boost; -using namespace boost::filesystem; -using namespace boost::timer; -using namespace boost::posix_time; -using namespace boost::program_options; -using namespace boost::iostreams::detail; - -namespace po = boost::program_options; - #include #include #include @@ -88,44 +78,44 @@ extern boost::mutex cout_mutex; class dna_import_thread { public: - dna_import_thread(dna_import* dnaParse, project_settings* p, const string& filename, + dna_import_thread(dna_import* dnaParse, project_settings* p, const std::string& filename, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, - PUINT32 clusterID, input_file_meta_t* input_file_meta, bool firstFile, string* status_msg, - milliseconds* ms) + PUINT32 clusterID, input_file_meta_t* input_file_meta, bool firstFile, std::string* status_msg, + boost::posix_time::milliseconds* ms) : _dnaParse(dnaParse), _p(p), _filename(filename) , _vStations(vStations), _stnCount(stnCount), _vMeasurements(vMeasurements), _msrCount(msrCount) , _clusterID(clusterID), _input_file_meta(input_file_meta), _firstFile(firstFile) , _status_msg(status_msg), _ms(ms) {}; void operator()() { - cpu_timer time; // constructor of boost::timer::cpu_timer calls start() + boost::timer::cpu_timer time; // constructor of boost::timer::cpu_timer calls start() try { _dnaParse->ParseInputFile(_filename, _vStations, _stnCount, _vMeasurements, _msrCount, _clusterID, _input_file_meta, _firstFile, _status_msg, _p); - *_ms = milliseconds(time.elapsed().wall/MILLI_TO_NANO); + *_ms = boost::posix_time::milliseconds(time.elapsed().wall/MILLI_TO_NANO); } catch (const XMLInteropException& e) { running = false; - boost::this_thread::sleep(milliseconds(50)); - stringstream err_msg; + boost::this_thread::sleep(boost::posix_time::milliseconds(50)); + std::stringstream err_msg; cout_mutex.lock(); - err_msg << endl << "- Error: " << e.what() << endl; - cout << err_msg.str(); + err_msg << std::endl << "- Error: " << e.what() << std::endl; + std::cout << err_msg.str(); *_status_msg = err_msg.str(); cout_mutex.unlock(); return; } running = false; } - inline void SetFile(const string& file) { _filename = file; } + inline void SetFile(const std::string& file) { _filename = file; } private: dna_import* _dnaParse; project_settings* _p; - string _filename; + std::string _filename; vdnaStnPtr* _vStations; PUINT32 _stnCount; vdnaMsrPtr* _vMeasurements; @@ -133,8 +123,8 @@ class dna_import_thread PUINT32 _clusterID; input_file_meta_t* _input_file_meta; bool _firstFile; - string* _status_msg; - milliseconds* _ms; + std::string* _status_msg; + boost::posix_time::milliseconds* _ms; }; class dna_import_progress_thread @@ -145,7 +135,7 @@ class dna_import_progress_thread void operator()() { double percentComplete(0.); - ostringstream ss; + std::ostringstream ss; int is_terminal(isatty(fileno(stdout))); @@ -159,13 +149,13 @@ class dna_import_progress_thread if (is_terminal && !_p->g.quiet) { ss.str(""); - ss << setw(3) << fixed << setprecision(0) << right << percentComplete << "%"; + ss << std::setw(3) << std::fixed << std::setprecision(0) << std::right << percentComplete << "%"; cout_mutex.lock(); - cout << PROGRESS_BACKSPACE_04 << setw(PROGRESS_PERCENT_04) << ss.str(); - cout.flush(); + std::cout << PROGRESS_BACKSPACE_04 << std::setw(PROGRESS_PERCENT_04) << ss.str(); + std::cout.flush(); cout_mutex.unlock(); } - boost::this_thread::sleep(milliseconds(10)); + boost::this_thread::sleep(boost::posix_time::milliseconds(10)); percentComplete = _dnaParse->GetProgress(); } } diff --git a/dynadjust/dynadjust/dnaplot/dnaplot.cpp b/dynadjust/dynadjust/dnaplot/dnaplot.cpp index 529d89cf..1b6479e4 100644 --- a/dynadjust/dynadjust/dnaplot/dnaplot.cpp +++ b/dynadjust/dynadjust/dnaplot/dnaplot.cpp @@ -132,7 +132,7 @@ void dna_plot::CleanupGnuplotFiles(const plotGraphMode& graphMode) if (pprj_->p._keep_gen_files) return; - stringstream ss; + std::stringstream ss; ss << _DELETE_CMD_; // remove gnuplot command file @@ -152,7 +152,7 @@ void dna_plot::CleanupGnuplotFiles(const plotGraphMode& graphMode) } // delete - string system_file_cmd = ss.str(); + std::string system_file_cmd = ss.str(); std::system(system_file_cmd.c_str()); } @@ -163,9 +163,9 @@ void dna_plot::CreategnuplotGraphEnvironment(project_settings* pprj, const plotG // Set up the environment pprj_ = pprj; - if (!exists(pprj_->g.output_folder)) + if (!boost::filesystem::exists(pprj_->g.output_folder)) { - stringstream ss("CreategnuplotGraphEnvironment(): Output path does not exist... \n\n "); + std::stringstream ss("CreategnuplotGraphEnvironment(): Output path does not exist... \n\n "); ss << pprj_->g.output_folder << "."; SignalExceptionPlot(ss.str(), 0, NULL); } @@ -175,9 +175,9 @@ void dna_plot::CreategnuplotGraphEnvironment(project_settings* pprj, const plotG ///////////////////////////////////////////////////////// // create gnuplot command file and set gnuplot parameters - string gnuplot_cmd_filename("graph_" + network_name_); + std::string gnuplot_cmd_filename("graph_" + network_name_); - string gnuplot_pic_name; + std::string gnuplot_pic_name; switch (graphMode) { case StationsMode: @@ -191,7 +191,7 @@ void dna_plot::CreategnuplotGraphEnvironment(project_settings* pprj, const plotG } gnuplot_cmd_filename.append(_CMD_EXT_); - string gnuplot_cmd_file(output_folder_ + FOLDER_SLASH + gnuplot_cmd_filename); + std::string gnuplot_cmd_file(output_folder_ + FOLDER_SLASH + gnuplot_cmd_filename); pprj_->p._gnuplot_cmd_file = gnuplot_cmd_file; @@ -215,7 +215,7 @@ void dna_plot::CreategnuplotGraphEnvironment(project_settings* pprj, const plotG void dna_plot::InvokeGnuplot() { // Invoke gnuplot using absolute path - string system_file_cmd = "gnuplot " + absolute(pprj_->p._gnuplot_cmd_file).string(); + std::string system_file_cmd = "gnuplot " + boost::filesystem::absolute(pprj_->p._gnuplot_cmd_file).string(); // set up a thread group to execute the gnuplot in parallel boost::thread gnuplot_thread{dna_create_threaded_process(system_file_cmd)}; @@ -236,27 +236,27 @@ void dna_plot::PlotGnuplotDatFileStns() // Create gnuplot station segment data file. Throws runtime_error on failure. file_opener(seg_data, seg_stn_graph_file_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } - stringstream ss(""), st(""); - ss << "\"Max block size (" << setprecision(0) << blockThreshold_ << ")\" "; + std::stringstream ss(""), st(""); + ss << "\"Max block size (" << std::setprecision(0) << blockThreshold_ << ")\" "; st << "\"Min inner stns (" << minInnerStns_ << ")\" "; - seg_data << setw(HEADER_18) << left << "Block" << - setw(HEADER_32) << left << ss.str() << - setw(HEADER_32) << left << st.str() << - setw(HEADER_25) << left << "\"Total block size\"" << - setw(HEADER_18) << left << "\"Inner stns\"" << - setw(HEADER_18) << left << "\"Junction stns\"" << endl; + seg_data << std::setw(HEADER_18) << std::left << "Block" << + std::setw(HEADER_32) << std::left << ss.str() << + std::setw(HEADER_32) << std::left << st.str() << + std::setw(HEADER_25) << std::left << "\"Total block size\"" << + std::setw(HEADER_18) << std::left << "\"Inner stns\"" << + std::setw(HEADER_18) << std::left << "\"Junction stns\"" << std::endl; for (UINT32 block=0; block(_combined_msr_list.at(c)) << " (" << + ss << "\"" << measurement_name(_combined_msr_list.at(c)) << " (" << parsemsrTally_.MeasurementCount(_combined_msr_list.at(c)) << ")\""; - seg_data << setw(PRINT_VAR_PAD) << left << ss.str(); + seg_data << std::setw(PRINT_VAR_PAD) << std::left << ss.str(); } - seg_data << endl; + seg_data << std::endl; // Tally up measurement types for each block ComputeMeasurementCount(); @@ -301,8 +301,8 @@ void dna_plot::PlotGnuplotDatFileMsrs() UINT32 block; for (block=0; blockp._pdf_file_name << "'" << endl; + gnuplotbat_file_ << "set output '" << pprj_->p._pdf_file_name << "'" << std::endl; // histogram style - gnuplotbat_file_ << "set style fill transparent solid 0.4" << endl; - gnuplotbat_file_ << "set boxwidth 0.5" << endl; + gnuplotbat_file_ << "set style fill transparent solid 0.4" << std::endl; + gnuplotbat_file_ << "set boxwidth 0.5" << std::endl; UINT32 upperLimit(0), block(0); @@ -447,11 +447,11 @@ void dna_plot::PrintGnuplotCommandFile(const string& gnuplot_cmd_file, const plo if (upperLimit < (v_ISL_.at(block).size() + v_JSL_.at(block).size())) upperLimit = static_cast(v_ISL_.at(block).size() + v_JSL_.at(block).size()); - upperLimit = max(blockThreshold_, upperLimit); + upperLimit = std::max(blockThreshold_, upperLimit); - gnuplotbat_file_ << "set title \"" << "Station segmentation summary for " << network_name_ << "\" font \"Calibri,16\" noenhanced" << endl << endl; - gnuplotbat_file_ << "set key outside center bottom horizontal Left reverse enhanced autotitles samplen 2.5 font \"Calibri,8\"" << endl; - gnuplotbat_file_ << "set key width -2 height 2.5" << endl << endl; + gnuplotbat_file_ << "set title \"" << "Station segmentation summary for " << network_name_ << "\" font \"Calibri,16\" noenhanced" << std::endl << std::endl; + gnuplotbat_file_ << "set key outside center bottom horizontal Left reverse enhanced autotitles samplen 2.5 font \"Calibri,8\"" << std::endl; + gnuplotbat_file_ << "set key width -2 height 2.5" << std::endl << std::endl; break; case MeasurementsMode: @@ -459,63 +459,63 @@ void dna_plot::PrintGnuplotCommandFile(const string& gnuplot_cmd_file, const plo if (upperLimit < v_msr_tally_.at(block).TotalCount()) upperLimit = v_msr_tally_.at(block).TotalCount(); - gnuplotbat_file_ << "set title \"" << "Measurement segmentation summary for " << network_name_ << "\" font \"Calibri,20\" noenhanced" << endl << endl; - //gnuplotbat_file_ << "set key outside right top vertical Left reverse enhanced autotitles columnhead box samplen 2.5 font \"Calibri,8\"" << endl; - gnuplotbat_file_ << "set key outside center bottom horizontal Left reverse enhanced autotitles columnhead samplen 2.5 font \"Calibri,8\"" << endl; - //gnuplotbat_file_ << "set key width -15 height 0" << endl << endl; - gnuplotbat_file_ << "set key width -2 height 2.5" << endl << endl; - - gnuplotbat_file_ << "set style histogram rowstacked title offset character 0, 0, 0" << endl; - gnuplotbat_file_ << "set style data histograms" << endl; - gnuplotbat_file_ << "set datafile missing '-'" << endl; - gnuplotbat_file_ << endl; + gnuplotbat_file_ << "set title \"" << "Measurement segmentation summary for " << network_name_ << "\" font \"Calibri,20\" noenhanced" << std::endl << std::endl; + //gnuplotbat_file_ << "set key outside right top vertical Left reverse enhanced autotitles columnhead box samplen 2.5 font \"Calibri,8\"" << std::endl; + gnuplotbat_file_ << "set key outside center bottom horizontal Left reverse enhanced autotitles columnhead samplen 2.5 font \"Calibri,8\"" << std::endl; + //gnuplotbat_file_ << "set key width -15 height 0" << std::endl << std::endl; + gnuplotbat_file_ << "set key width -2 height 2.5" << std::endl << std::endl; + + gnuplotbat_file_ << "set style histogram rowstacked title offset character 0, 0, 0" << std::endl; + gnuplotbat_file_ << "set style data histograms" << std::endl; + gnuplotbat_file_ << "set datafile missing '-'" << std::endl; + gnuplotbat_file_ << std::endl; break; } upperLimit = upperLimit + upperLimit / 10; - gnuplotbat_file_ << "set format x '%.0f'" << endl; - gnuplotbat_file_ << "set format y '%.0f'" << endl; - gnuplotbat_file_ << "set yrange[0:" << upperLimit << "]" << endl; - gnuplotbat_file_ << "set auto x" << endl; - gnuplotbat_file_ << "set ytics scale 0.25 font \"Calibri,8\"" << endl; + gnuplotbat_file_ << "set format x '%.0f'" << std::endl; + gnuplotbat_file_ << "set format y '%.0f'" << std::endl; + gnuplotbat_file_ << "set yrange[0:" << upperLimit << "]" << std::endl; + gnuplotbat_file_ << "set auto x" << std::endl; + gnuplotbat_file_ << "set ytics scale 0.25 font \"Calibri,8\"" << std::endl; - gnuplotbat_file_ << "set xtics scale 0.25 nomirror" << endl; + gnuplotbat_file_ << "set xtics scale 0.25 nomirror" << std::endl; UINT32 fontSize(8); if (blockCount_ > 5000) { fontSize = 5; - gnuplotbat_file_ << "set xtics 0,500 font \"Calibri,6\"" << endl << endl; + gnuplotbat_file_ << "set xtics 0,500 font \"Calibri,6\"" << std::endl << std::endl; } else if (blockCount_ > 1000) { fontSize = 5; - gnuplotbat_file_ << "set xtics 0,100 font \"Calibri,6\"" << endl << endl; + gnuplotbat_file_ << "set xtics 0,100 font \"Calibri,6\"" << std::endl << std::endl; } else if (blockCount_ > 500) { fontSize = 5; - gnuplotbat_file_ << "set xtics 0,50 font \"Calibri,5\"" << endl << endl; + gnuplotbat_file_ << "set xtics 0,50 font \"Calibri,5\"" << std::endl << std::endl; } else if (blockCount_ > 100) { fontSize = 5; - gnuplotbat_file_ << "set xtics 0,10 font \"Calibri,6\"" << endl << endl; + gnuplotbat_file_ << "set xtics 0,10 font \"Calibri,6\"" << std::endl << std::endl; } else if (blockCount_ > 50) { fontSize = 6; - gnuplotbat_file_ << "set xtics 0,5 font \"Calibri,8\"" << endl << endl; + gnuplotbat_file_ << "set xtics 0,5 font \"Calibri,8\"" << std::endl << std::endl; } else - gnuplotbat_file_ << "set xtics 0,1 font \"Calibri,8\"" << endl << endl; + gnuplotbat_file_ << "set xtics 0,1 font \"Calibri,8\"" << std::endl << std::endl; // x-axis label - stringstream ss(""); - ss << "Segmented Network Blocks (Total " << fixed << setprecision(0) << blockCount_ << ")"; - gnuplotbat_file_ << "set xlabel '" << ss.str() << "' font \"Calibri,10\"" << endl; + std::stringstream ss(""); + ss << "Segmented Network Blocks (Total " << std::fixed << std::setprecision(0) << blockCount_ << ")"; + gnuplotbat_file_ << "set xlabel '" << ss.str() << "' font \"Calibri,10\"" << std::endl; switch (graphMode) { @@ -532,37 +532,37 @@ void dna_plot::PrintGnuplotCommandFile(const string& gnuplot_cmd_file, const plo void dna_plot::PrintGnuplotCommandFileStns(const UINT32& fontSize) { - stringstream ss(""); - ss << "Station Count (Total " << fixed << setprecision(0) << stationCount_ << ")"; - gnuplotbat_file_ << "set ylabel '" << ss.str() << "' font \"Calibri,10\"" << endl << endl; + std::stringstream ss(""); + ss << "Station Count (Total " << std::fixed << std::setprecision(0) << stationCount_ << ")"; + gnuplotbat_file_ << "set ylabel '" << ss.str() << "' font \"Calibri,10\"" << std::endl << std::endl; // All colours based on a palette: // https://coolors.co/ffd275-235789-da5552-43aa8b-39a9db - gnuplotbat_file_ << "set style line 1 lw 0.75 lt 1 pt 7 ps 0.25 lc rgb \"#35A7FF\" # total block size" << endl; // royalblue - gnuplotbat_file_ << "set style line 2 lw 2 lt 5 pt 7 ps 0.25 lc rgb \"#43AA8B\" # threshold" << endl; // zomp (green) - gnuplotbat_file_ << "set style line 3 lw 2 lt 5 pt 7 ps 0.25 lc rgb \"#FFD275\" # minimum inner size" << endl; // orange yellow crayola - gnuplotbat_file_ << "set style line 4 lw 2 lt 1 pt 7 ps 0.25 lc rgb \"#235789\" # inners" << endl; // bdazzled blue - gnuplotbat_file_ << "set style line 5 lw 2 lt 1 pt 7 ps 0.25 lc rgb \"#DA5552\" # junctions" << endl << endl; // indian red + gnuplotbat_file_ << "set style line 1 lw 0.75 lt 1 pt 7 ps 0.25 lc rgb \"#35A7FF\" # total block size" << std::endl; // royalblue + gnuplotbat_file_ << "set style line 2 lw 2 lt 5 pt 7 ps 0.25 lc rgb \"#43AA8B\" # threshold" << std::endl; // zomp (green) + gnuplotbat_file_ << "set style line 3 lw 2 lt 5 pt 7 ps 0.25 lc rgb \"#FFD275\" # minimum inner size" << std::endl; // orange yellow crayola + gnuplotbat_file_ << "set style line 4 lw 2 lt 1 pt 7 ps 0.25 lc rgb \"#235789\" # inners" << std::endl; // bdazzled blue + gnuplotbat_file_ << "set style line 5 lw 2 lt 1 pt 7 ps 0.25 lc rgb \"#DA5552\" # junctions" << std::endl << std::endl; // indian red - gnuplotbat_file_ << "plot '" << seg_stn_graph_file_ << "' using 1:4 with boxes ls 1 title columnheader(4), \\" << endl; + gnuplotbat_file_ << "plot '" << seg_stn_graph_file_ << "' using 1:4 with boxes ls 1 title columnheader(4), \\" << std::endl; gnuplotbat_file_ << " '" << seg_stn_graph_file_ << "' using 1:4:(sprintf(\"%.0f\",$4)) with labels font \"Calibri," << - fontSize << "\" center offset 0,0.5 notitle, \\" << endl; - gnuplotbat_file_ << " '" << seg_stn_graph_file_ << "' using 1:2 with lines ls 2 title columnheader(2), \\" << endl; - gnuplotbat_file_ << " '" << seg_stn_graph_file_ << "' using 1:3 with lines ls 3 title columnheader(3), \\" << endl; - gnuplotbat_file_ << " '" << seg_stn_graph_file_ << "' using 1:5 with linespoints ls 4 title columnheader(5), \\" << endl; + fontSize << "\" center offset 0,0.5 notitle, \\" << std::endl; + gnuplotbat_file_ << " '" << seg_stn_graph_file_ << "' using 1:2 with lines ls 2 title columnheader(2), \\" << std::endl; + gnuplotbat_file_ << " '" << seg_stn_graph_file_ << "' using 1:3 with lines ls 3 title columnheader(3), \\" << std::endl; + gnuplotbat_file_ << " '" << seg_stn_graph_file_ << "' using 1:5 with linespoints ls 4 title columnheader(5), \\" << std::endl; gnuplotbat_file_ << " '" << seg_stn_graph_file_ << "' using 1:5:(sprintf(\"%.0f\",$5)) with labels tc ls 4 font \"Calibri," << - fontSize << "\" center offset 1,0 notitle, \\" << endl; - gnuplotbat_file_ << " '" << seg_stn_graph_file_ << "' using 1:6 with linespoints ls 5 title columnheader(6), \\" << endl; + fontSize << "\" center offset 1,0 notitle, \\" << std::endl; + gnuplotbat_file_ << " '" << seg_stn_graph_file_ << "' using 1:6 with linespoints ls 5 title columnheader(6), \\" << std::endl; gnuplotbat_file_ << " '" << seg_stn_graph_file_ << "' using 1:6:(sprintf(\"%.0f\",$6)) with labels tc ls 5 font \"Calibri," << - fontSize << "\" center offset 1,0 notitle" << endl << endl; + fontSize << "\" center offset 1,0 notitle" << std::endl << std::endl; } void dna_plot::PrintGnuplotCommandFileMsrs(const UINT32& fontSize) { - stringstream ss(""); - ss << "Measurement Count (Total " << fixed << setprecision(0) << measurementCount_ << ")"; - gnuplotbat_file_ << "set ylabel '" << ss.str() << "' font \"Calibri,10\"" << endl << endl; + std::stringstream ss(""); + ss << "Measurement Count (Total " << std::fixed << std::setprecision(0) << measurementCount_ << ")"; + gnuplotbat_file_ << "set ylabel '" << ss.str() << "' font \"Calibri,10\"" << std::endl << std::endl; // All colours based on a palette: // https://coolors.co/ffd275-235789-da5552-43aa8b-39a9db @@ -570,14 +570,14 @@ void dna_plot::PrintGnuplotCommandFileMsrs(const UINT32& fontSize) UINT32 line(1); ss.str(""); ss << "\"#4169e1\""; - gnuplotbat_file_ << "set style line " << line++ << " lw 1 lt 1 pt 7 ps 0.5 lc rgb " << left << setw(PRINT_VAR_PAD) << ss.str() << " # total block size" << endl; // royalblue + gnuplotbat_file_ << "set style line " << line++ << " lw 1 lt 1 pt 7 ps 0.5 lc rgb " << std::left << std::setw(PRINT_VAR_PAD) << ss.str() << " # total block size" << std::endl; // royalblue // print measurements for each block UINT32 c; - string colour; + std::string colour; it_pair_string _it_colour; - sort(pprj_->p._msr_colours.begin(), pprj_->p._msr_colours.end(), ComparePairFirst()); + std::sort(pprj_->p._msr_colours.begin(), pprj_->p._msr_colours.end(), ComparePairFirst()); for (c=0; c<_combined_msr_list.size(); c++) { @@ -585,7 +585,7 @@ void dna_plot::PrintGnuplotCommandFileMsrs(const UINT32& fontSize) continue; colour = _combined_msr_list.at(c); _it_colour = equal_range(pprj_->p._msr_colours.begin(), pprj_->p._msr_colours.end(), - colour, ComparePairFirst()); + colour, ComparePairFirst()); if (_it_colour.first == _it_colour.second) colour = "light-gray"; @@ -594,11 +594,11 @@ void dna_plot::PrintGnuplotCommandFileMsrs(const UINT32& fontSize) ss.str(""); ss << "\"" << colour << "\""; - gnuplotbat_file_ << "set style line " << line++ << " lw 1 lt 1 pt 7 ps 0.5 lc rgb " << left << setw(PRINT_VAR_PAD) << ss.str() << - " # \"" << measurement_name(_combined_msr_list.at(c)) << "\"" << endl; + gnuplotbat_file_ << "set style line " << line++ << " lw 1 lt 1 pt 7 ps 0.5 lc rgb " << std::left << std::setw(PRINT_VAR_PAD) << ss.str() << + " # \"" << measurement_name(_combined_msr_list.at(c)) << "\"" << std::endl; } - gnuplotbat_file_ << endl; + gnuplotbat_file_ << std::endl; //UINT32 block(0); //if (v_msr_tally_.at(block).MeasurementCount(_combined_msr_list.at(c)) == 0) @@ -615,14 +615,14 @@ void dna_plot::PrintGnuplotCommandFileMsrs(const UINT32& fontSize) if (parsemsrTally_.MeasurementCount(_combined_msr_list.at(c)) < 1) continue; if (msrs++ > 0) - gnuplotbat_file_ << ", \\" << endl << " '"; + gnuplotbat_file_ << ", \\" << std::endl << " '"; gnuplotbat_file_ << seg_msr_graph_file_ << "' using " << line++ << ":xtic(1) ls " << linestyle++; measurementCategories_++; } - gnuplotbat_file_ << ", \\" << endl << " '" << seg_msr_graph_file_ << + gnuplotbat_file_ << ", \\" << std::endl << " '" << seg_msr_graph_file_ << "' using 0:2:(sprintf(\"%d\",$2)) with labels font \"Calibri," << - fontSize << "\" center offset 0,0.5 notitle" << endl; + fontSize << "\" center offset 0,0.5 notitle" << std::endl; } @@ -630,9 +630,9 @@ void dna_plot::PrintGnuplotCommandFileMsrs(const UINT32& fontSize) void dna_plot::InitialiseGMTParameters() { // Set initial parameters - if (!exists(pprj_->g.output_folder)) + if (!boost::filesystem::exists(pprj_->g.output_folder)) { - stringstream ss("InitialiseGMTParameters(): Output path does not exist... \n\n "); + std::stringstream ss("InitialiseGMTParameters(): Output path does not exist... \n\n "); ss << pprj_->g.output_folder << "."; SignalExceptionPlot(ss.str(), 0, NULL); } @@ -688,15 +688,15 @@ void dna_plot::FinaliseGMTParameters() if (rightDeg_ < leftDeg_) { - stringstream ss; - ss << "Right limit cannot be less than left limit." << endl; + std::stringstream ss; + ss << "Right limit cannot be less than left limit." << std::endl; throw NetPlotException(ss.str(), 0); } if (upperDeg_ < lowerDeg_) { - stringstream ss; - ss << "Upper limit cannot be less than lower limit." << endl; + std::stringstream ss; + ss << "Upper limit cannot be less than lower limit." << std::endl; throw NetPlotException(ss.str(), 0); } @@ -711,7 +711,7 @@ void dna_plot::FinaliseGMTParameters() dWidth_ += seconds15; // capture smallest dimension - dDimension_ = (min(dWidth_, dHeight_)); + dDimension_ = (std::min(dWidth_, dHeight_)); // Determine a buffer to envelope the entire plot, set to // 10% of the width/height (whichever is smaller) @@ -1059,7 +1059,7 @@ void dna_plot::InitialiseGMTFilenames() // create__block_n.[bat|sh] v_gmt_cmd_filenames_.clear(); v_gmt_pdf_filenames_.clear(); - string gmt_filename, gmt_cmd_basename("create_" + network_name_ + "_block_"); + std::string gmt_filename, gmt_cmd_basename("create_" + network_name_ + "_block_"); UINT32 block; bool oneBlockOnly = InitialiseandValidateStartingBlock(block); @@ -1074,7 +1074,7 @@ void dna_plot::InitialiseGMTFilenames() gmt_filename = pprj_->g.output_folder + FOLDER_SLASH + gmt_filename; // Create absolute path - gmt_filename = absolute(gmt_filename).string(); + gmt_filename = boost::filesystem::absolute(gmt_filename).string(); // Add to the list v_gmt_cmd_filenames_.push_back(gmt_filename); @@ -1126,12 +1126,12 @@ void dna_plot::CreateGMTCommandFiles() // Create GMT batch file. Throws runtime_error on failure. file_opener(gmtbat_file_, v_gmt_cmd_filenames_.at(block)); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } // set header - gmtbat_file_ << _CMD_HEADER_ << endl; + gmtbat_file_ << _CMD_HEADER_ << std::endl; // GMT bat file is printed last to reflect the options and dimensions as determined // by PrintStationsDataFile and PrintMeasurementsDatFiles @@ -1142,7 +1142,7 @@ void dna_plot::CreateGMTCommandFiles() // change file permission to executable #if defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) - string system_file_cmd = _CHMOD_CMD_ + v_gmt_cmd_filenames_.at(block); + std::string system_file_cmd = _CHMOD_CMD_ + v_gmt_cmd_filenames_.at(block); std::system(system_file_cmd.c_str()); #endif @@ -1164,53 +1164,53 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) double error_ellipse_scale(uncertainty_legend_length_/largest_uncertainty_); UINT32 uncertainty_legend_precision(4); - string psTempFile("tmp-"); + std::string psTempFile("tmp-"); psTempFile.append(StringFromT(block)).append(".ps"); - string pdfTempFile("tmp-"); + std::string pdfTempFile("tmp-"); pdfTempFile.append(StringFromT(block)).append(".pdf"); - string legendTempFile("map-block"); + std::string legendTempFile("map-block"); legendTempFile.append(StringFromT(block)).append(".legend"); // make temporary directory for gmt.conf gmt.history to prevent corruption of // gmt.conf and gmt.history during parallel processing - gmtbat_file_ << endl << _COMMENT_PREFIX_ << "Create temporary folder for gmt.conf and gmt.history" << endl; + gmtbat_file_ << std::endl << _COMMENT_PREFIX_ << "Create temporary folder for gmt.conf and gmt.history" << std::endl; #if defined(_WIN32) || defined(__WIN32__) // set, create and provide access to temporary folder for gmt.conf file - gmtbat_file_ << _MAKEENV_CMD_ << _GMT_TMP_DIR_ << "=%TEMP%\\gmt.block-" << block << endl; - gmtbat_file_ << _MAKEDIR_CMD_ << _ENV_GMT_TMP_DIR_ << endl; - //gmtbat_file_ << "icacls " << _ENV_GMT_TMP_DIR_ << " /grant Everyone:(f)" << endl; + gmtbat_file_ << _MAKEENV_CMD_ << _GMT_TMP_DIR_ << "=%TEMP%\\gmt.block-" << block << std::endl; + gmtbat_file_ << _MAKEDIR_CMD_ << _ENV_GMT_TMP_DIR_ << std::endl; + //gmtbat_file_ << "icacls " << _ENV_GMT_TMP_DIR_ << " /grant Everyone:(f)" << std::endl; #elif defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) // temporary gmt.conf file location - gmtbat_file_ << _MAKEENV_CMD_ << _GMT_TMP_DIR_ << "=$(" << _MAKETEMP_CMD_ << "-d ${TMPDIR:-/tmp}/gmt.XXXXXX)" << endl << endl; + gmtbat_file_ << _MAKEENV_CMD_ << _GMT_TMP_DIR_ << "=$(" << _MAKETEMP_CMD_ << "-d ${TMPDIR:-/tmp}/gmt.XXXXXX)" << std::endl << std::endl; #endif UINT32 colours(0), columns(5); if (plotBlocks_) - gmtbat_file_ << endl << - _COMMENT_PREFIX_ << "GMT command file for segmented network block " << (block + 1) << endl; + gmtbat_file_ << std::endl << + _COMMENT_PREFIX_ << "GMT command file for segmented network block " << (block + 1) << std::endl; else - gmtbat_file_ << endl << - _COMMENT_PREFIX_ << "GMT command file for simultaneous network" << endl << endl; + gmtbat_file_ << std::endl << + _COMMENT_PREFIX_ << "GMT command file for simultaneous network" << std::endl << std::endl; // write GMT parameters PrintGMTParameters(); if (isLandscape) - gmtbat_file_ << _APP_GMTSET_ << " PS_PAGE_ORIENTATION landscape" << endl << endl; + gmtbat_file_ << _APP_GMTSET_ << " PS_PAGE_ORIENTATION landscape" << std::endl << std::endl; else - gmtbat_file_ << _APP_GMTSET_ << " PS_PAGE_ORIENTATION portrait" << endl << endl; + gmtbat_file_ << _APP_GMTSET_ << " PS_PAGE_ORIENTATION portrait" << std::endl << std::endl; - gmtbat_file_ << _APP_GMTSET_ << " FONT_ANNOT " << fixed << setprecision(1) << annot_font_size_primary << "p" << endl; - gmtbat_file_ << _APP_GMTSET_ << " FONT_ANNOT_PRIMARY " << fixed << setprecision(1) << annot_font_size_primary << "p" << endl; - gmtbat_file_ << _APP_GMTSET_ << " FONT_LABEL " << fixed << setprecision(1) << label_font_size << "p" << endl; + gmtbat_file_ << _APP_GMTSET_ << " FONT_ANNOT " << std::fixed << std::setprecision(1) << annot_font_size_primary << "p" << std::endl; + gmtbat_file_ << _APP_GMTSET_ << " FONT_ANNOT_PRIMARY " << std::fixed << std::setprecision(1) << annot_font_size_primary << "p" << std::endl; + gmtbat_file_ << _APP_GMTSET_ << " FONT_LABEL " << std::fixed << std::setprecision(1) << label_font_size << "p" << std::endl; if (graticule_width_ < 60./3600.) - gmtbat_file_ << _APP_GMTSET_ << " FORMAT_GEO_MAP ddd:mm:ss.x" << endl << endl; + gmtbat_file_ << _APP_GMTSET_ << " FORMAT_GEO_MAP ddd:mm:ss.x" << std::endl << std::endl; else - gmtbat_file_ << _APP_GMTSET_ << " FORMAT_GEO_MAP ddd:mm" << endl << endl; + gmtbat_file_ << _APP_GMTSET_ << " FORMAT_GEO_MAP ddd:mm" << std::endl << std::endl; page_width_ = pprj_->p._page_width; @@ -1231,13 +1231,13 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) gmtbat_file_ << _APP_PSCOAST_ << " -Rg" << // Carree Cylindrical equidistant projection, which looks the nicest " -JQ" << page_width_ << "c -B60g30 -D" << coastResolution_ << - " -A10000 -W0.75p,16/169/243 -G245/245/245 -K > " << psTempFile << endl; + " -A10000 -W0.75p,16/169/243 -G245/245/245 -K > " << psTempFile << std::endl; // // Miller's Cylindrical projection, which is neither equal nor conformal. All meridians and parallels are straight lines. - // " -JJ" << page_width << "c -B60g30 -D" << coastResolution << " -A10000 -W0.75p,16/169/243 -G245/245/245 -P -K > " << psTempFile << endl; + // " -JJ" << page_width << "c -B60g30 -D" << coastResolution << " -A10000 -W0.75p,16/169/243 -G245/245/245 -P -K > " << psTempFile << std::endl; // // Cylindrical equal-area projection - //" -JY" << page_width << "c -B60g30 -D" << coastResolution << " -A10000 -W0.75p,16/169/243 -G245/245/245 -P -K > " << psTempFile << endl; + //" -JY" << page_width << "c -B60g30 -D" << coastResolution << " -A10000 -W0.75p,16/169/243 -G245/245/245 -P -K > " << psTempFile << std::endl; break; // // Orthographic projection @@ -1252,10 +1252,10 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) pprj_->p._label_font_size = 5; gmtbat_file_ << _APP_PSCOAST_ << " -Rg -JG" << - fixed << setprecision(7) << centre_width_ << "/" << // longitude - fixed << setprecision(7) << centre_height_ << "/" << // latitude - fixed << setprecision(1) << page_width_ << "c -B30g15 -D" << coastResolution_ << - " -A10000 -W0.75p,16/169/243 -G245/245/245 -P -K > " << psTempFile << endl; + std::fixed << std::setprecision(7) << centre_width_ << "/" << // longitude + std::fixed << std::setprecision(7) << centre_height_ << "/" << // latitude + std::fixed << std::setprecision(1) << page_width_ << "c -B30g15 -D" << coastResolution_ << + " -A10000 -W0.75p,16/169/243 -G245/245/245 -P -K > " << psTempFile << std::endl; break; // // Mercator projection @@ -1264,23 +1264,23 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) pprj_->p._label_font_size = 6; gmtbat_file_ << _APP_PSCOAST_ << " -R" << - fixed << setprecision(7) << leftDeg_ << "/" << - fixed << setprecision(7) << lowerDeg_ << "/" << - fixed << setprecision(7) << rightDeg_ << "/" << - fixed << setprecision(7) << upperDeg_; + std::fixed << std::setprecision(7) << leftDeg_ << "/" << + std::fixed << std::setprecision(7) << lowerDeg_ << "/" << + std::fixed << std::setprecision(7) << rightDeg_ << "/" << + std::fixed << std::setprecision(7) << upperDeg_; // example: -Jm1.2e-2i - gmtbat_file_ << "r -JM" << fixed << setprecision(1) << page_width_ << "c"; + gmtbat_file_ << "r -JM" << std::fixed << std::setprecision(1) << page_width_ << "c"; gmtbat_file_ << " -D" << coastResolution_ << " -N2/0.25p -W0.75p,16/169/243 -G255/255/255 -S233/246/255 -Lf" << - fixed << setprecision(5) << centre_width_ << "/" << fixed << setprecision(5) << dScaleLat_ << "/" << - fixed << setprecision(5) << centre_height_ << "/" << fixed << setprecision(scale_precision_) << scale_bar_width_ << "k+lKilometres+jt " << + std::fixed << std::setprecision(5) << centre_width_ << "/" << std::fixed << std::setprecision(5) << dScaleLat_ << "/" << + std::fixed << std::setprecision(5) << centre_height_ << "/" << std::fixed << std::setprecision(scale_precision_) << scale_bar_width_ << "k+lKilometres+jt " << "-B" << - fixed << setprecision(graticule_width_precision_) << graticule_width_ << "g" << fixed << setprecision(graticule_width_precision_) << graticule_width_ << "/" << - fixed << setprecision(graticule_width_precision_) << graticule_width_ << "g" << fixed << setprecision(graticule_width_precision_) << graticule_width_; + std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "g" << std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "/" << + std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "g" << std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_; if (!isLandscape) gmtbat_file_ << " -P"; - gmtbat_file_ << " -K > " << psTempFile << endl; + gmtbat_file_ << " -K > " << psTempFile << std::endl; break; // @@ -1290,27 +1290,27 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) pprj_->p._label_font_size = 6; gmtbat_file_ << _APP_PSCOAST_ << " -R" << - fixed << setprecision(7) << leftDeg_ << "/" << - fixed << setprecision(7) << lowerDeg_ << "/" << - fixed << setprecision(7) << rightDeg_ << "/" << - fixed << setprecision(7) << upperDeg_; + std::fixed << std::setprecision(7) << leftDeg_ << "/" << + std::fixed << std::setprecision(7) << lowerDeg_ << "/" << + std::fixed << std::setprecision(7) << rightDeg_ << "/" << + std::fixed << std::setprecision(7) << upperDeg_; // example: -Jt139.9944444/-24.1486111/1:1000000 - //gmtbat_file_ << "r -Jt" << fixed << setprecision(7) << centre_width_ << "/" << - // fixed << setprecision(7) << centre_height_ << "/1:" << fixed << setprecision(0) << scale; - gmtbat_file_ << "r -JT" << fixed << setprecision(7) << centre_width_ << "/" << - fixed << setprecision(1) << page_width_ << "c"; + //gmtbat_file_ << "r -Jt" << std::fixed << std::setprecision(7) << centre_width_ << "/" << + // std::fixed << std::setprecision(7) << centre_height_ << "/1:" << std::fixed << std::setprecision(0) << scale; + gmtbat_file_ << "r -JT" << std::fixed << std::setprecision(7) << centre_width_ << "/" << + std::fixed << std::setprecision(1) << page_width_ << "c"; gmtbat_file_ << " -D" << coastResolution_ << " -N2/0.25p -W0.75p,16/169/243 -G255/255/255 -S233/246/255 -Lf" << - fixed << setprecision(5) << centre_width_ << "/" << fixed << setprecision(5) << dScaleLat_ << "/" << - fixed << setprecision(5) << centre_height_ << "/" << fixed << setprecision(scale_precision_) << scale_bar_width_ << "k+lKilometres+jt " << + std::fixed << std::setprecision(5) << centre_width_ << "/" << std::fixed << std::setprecision(5) << dScaleLat_ << "/" << + std::fixed << std::setprecision(5) << centre_height_ << "/" << std::fixed << std::setprecision(scale_precision_) << scale_bar_width_ << "k+lKilometres+jt " << "-B" << - fixed << setprecision(graticule_width_precision_) << graticule_width_ << "g" << fixed << setprecision(graticule_width_precision_) << graticule_width_ << "/" << - fixed << setprecision(graticule_width_precision_) << graticule_width_ << "g" << fixed << setprecision(graticule_width_precision_) << graticule_width_; + std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "g" << std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "/" << + std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "g" << std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_; if (!isLandscape) gmtbat_file_ << " -P"; - gmtbat_file_ << " -K > " << psTempFile << endl; + gmtbat_file_ << " -K > " << psTempFile << std::endl; break; // @@ -1320,34 +1320,34 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) pprj_->p._label_font_size = 6; gmtbat_file_ << _APP_PSCOAST_ << " -R" << - fixed << setprecision(7) << leftDeg_ << "/" << - fixed << setprecision(7) << lowerDeg_ << "/" << - fixed << setprecision(7) << rightDeg_ << "/" << - fixed << setprecision(7) << upperDeg_; + std::fixed << std::setprecision(7) << leftDeg_ << "/" << + std::fixed << std::setprecision(7) << lowerDeg_ << "/" << + std::fixed << std::setprecision(7) << rightDeg_ << "/" << + std::fixed << std::setprecision(7) << upperDeg_; // example: -Jb136.5/-36/-18/-36/1:45000000 - //gmtbat_file_ << "r -Jb" << fixed << setprecision(7) << centre_width_ << "/" << - // fixed << setprecision(7) << centre_height_ << "/" << - // fixed << setprecision(7) << upperDeg_ - fabs(dHeight/3.) << "/" << - // fixed << setprecision(7) << lowerDeg_ + fabs(dHeight/3.) << "/" << - // "1:" << fixed << setprecision(0) << scale; - gmtbat_file_ << "r -JB" << fixed << setprecision(7) << centre_width_ << "/" << - fixed << setprecision(7) << centre_height_ << "/" << - fixed << setprecision(7) << upperDeg_ - fabs(dHeight_/3.) << "/" << - fixed << setprecision(7) << lowerDeg_ + fabs(dHeight_/3.) << "/" << - fixed << setprecision(1) << page_width_ << "c"; + //gmtbat_file_ << "r -Jb" << std::fixed << std::setprecision(7) << centre_width_ << "/" << + // std::fixed << std::setprecision(7) << centre_height_ << "/" << + // std::fixed << std::setprecision(7) << upperDeg_ - fabs(dHeight/3.) << "/" << + // std::fixed << std::setprecision(7) << lowerDeg_ + fabs(dHeight/3.) << "/" << + // "1:" << std::fixed << std::setprecision(0) << scale; + gmtbat_file_ << "r -JB" << std::fixed << std::setprecision(7) << centre_width_ << "/" << + std::fixed << std::setprecision(7) << centre_height_ << "/" << + std::fixed << std::setprecision(7) << upperDeg_ - fabs(dHeight_/3.) << "/" << + std::fixed << std::setprecision(7) << lowerDeg_ + fabs(dHeight_/3.) << "/" << + std::fixed << std::setprecision(1) << page_width_ << "c"; gmtbat_file_ << " -D" << coastResolution_ << " -N2/0.25p -W0.75p,16/169/243 -G255/255/255 -S233/246/255 -Lf" << - fixed << setprecision(5) << centre_width_ << "/" << fixed << setprecision(5) << dScaleLat_ << "/" << - fixed << setprecision(5) << centre_height_ << "/" << fixed << setprecision(scale_precision_) << scale_bar_width_ << "k+lKilometres+jt " << + std::fixed << std::setprecision(5) << centre_width_ << "/" << std::fixed << std::setprecision(5) << dScaleLat_ << "/" << + std::fixed << std::setprecision(5) << centre_height_ << "/" << std::fixed << std::setprecision(scale_precision_) << scale_bar_width_ << "k+lKilometres+jt " << "-B" << - //fixed << setprecision(7) << DmstoDeg(0.3) << "g" << fixed << setprecision(7) << DmstoDeg(0.3) << " -K > " << psTempFile << endl; - fixed << setprecision(graticule_width_precision_) << graticule_width_ << "g" << fixed << setprecision(graticule_width_precision_) << graticule_width_ << "/" << - fixed << setprecision(graticule_width_precision_) << graticule_width_ << "g" << fixed << setprecision(graticule_width_precision_) << graticule_width_; + //fixed << std::setprecision(7) << DmstoDeg(0.3) << "g" << std::fixed << std::setprecision(7) << DmstoDeg(0.3) << " -K > " << psTempFile << std::endl; + std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "g" << std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "/" << + std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "g" << std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_; if (!isLandscape) gmtbat_file_ << " -P"; - gmtbat_file_ << " -K > " << psTempFile << endl; + gmtbat_file_ << " -K > " << psTempFile << std::endl; break; // // Lambert Azimuthal Equal-Area @@ -1356,26 +1356,26 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) pprj_->p._label_font_size = 6; gmtbat_file_ << _APP_PSCOAST_ << " -R" << - fixed << setprecision(7) << leftDeg_ << "/" << - fixed << setprecision(7) << lowerDeg_ << "/" << - fixed << setprecision(7) << rightDeg_ << "/" << - fixed << setprecision(7) << upperDeg_; + std::fixed << std::setprecision(7) << leftDeg_ << "/" << + std::fixed << std::setprecision(7) << lowerDeg_ << "/" << + std::fixed << std::setprecision(7) << rightDeg_ << "/" << + std::fixed << std::setprecision(7) << upperDeg_; // example: -JA30/-30/4.5i - gmtbat_file_ << "r -JA" << fixed << setprecision(7) << centre_width_ << "/" << - fixed << setprecision(7) << centre_height_ << "/" << - fixed << setprecision(1) << page_width_ << "c"; + gmtbat_file_ << "r -JA" << std::fixed << std::setprecision(7) << centre_width_ << "/" << + std::fixed << std::setprecision(7) << centre_height_ << "/" << + std::fixed << std::setprecision(1) << page_width_ << "c"; gmtbat_file_ << " -D" << coastResolution_ << " -N2/0.25p -W0.75p,16/169/243 -G255/255/255 -S233/246/255 -Lf" << - fixed << setprecision(5) << centre_width_ << "/" << fixed << setprecision(5) << dScaleLat_ << "/" << - fixed << setprecision(5) << centre_height_ << "/" << fixed << setprecision(scale_precision_) << scale_bar_width_ << "k+lKilometres+jt " << + std::fixed << std::setprecision(5) << centre_width_ << "/" << std::fixed << std::setprecision(5) << dScaleLat_ << "/" << + std::fixed << std::setprecision(5) << centre_height_ << "/" << std::fixed << std::setprecision(scale_precision_) << scale_bar_width_ << "k+lKilometres+jt " << "-B" << - fixed << setprecision(graticule_width_precision_) << graticule_width_ << "g" << fixed << setprecision(graticule_width_precision_) << graticule_width_ << "/" << - fixed << setprecision(graticule_width_precision_) << graticule_width_ << "g" << fixed << setprecision(graticule_width_precision_) << graticule_width_; + std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "g" << std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "/" << + std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "g" << std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_; if (!isLandscape) gmtbat_file_ << " -P"; - gmtbat_file_ << " -K > " << psTempFile << endl; + gmtbat_file_ << " -K > " << psTempFile << std::endl; break; // @@ -1385,26 +1385,26 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) pprj_->p._label_font_size = 6; gmtbat_file_ << _APP_PSCOAST_ << " -R" << - fixed << setprecision(7) << leftDeg_ << "/" << - fixed << setprecision(7) << lowerDeg_ << "/" << - fixed << setprecision(7) << rightDeg_ << "/" << - fixed << setprecision(7) << upperDeg_; + std::fixed << std::setprecision(7) << leftDeg_ << "/" << + std::fixed << std::setprecision(7) << lowerDeg_ << "/" << + std::fixed << std::setprecision(7) << rightDeg_ << "/" << + std::fixed << std::setprecision(7) << upperDeg_; // example: -R100/-40/160/-10r -JS130/-30/4i - gmtbat_file_ << "r -JS" << fixed << setprecision(7) << centre_width_ << "/" << - fixed << setprecision(7) << centre_height_ << "/" << - fixed << setprecision(1) << page_width_ << "c"; + gmtbat_file_ << "r -JS" << std::fixed << std::setprecision(7) << centre_width_ << "/" << + std::fixed << std::setprecision(7) << centre_height_ << "/" << + std::fixed << std::setprecision(1) << page_width_ << "c"; gmtbat_file_ << " -D" << coastResolution_ << " -N2/0.25p -W0.75p,16/169/243 -G255/255/255 -S233/246/255 -Lf" << - fixed << setprecision(5) << centre_width_ << "/" << fixed << setprecision(5) << dScaleLat_ << "/" << - fixed << setprecision(5) << centre_height_ << "/" << fixed << setprecision(scale_precision_) << scale_bar_width_ << "k+lKilometres+jt " << + std::fixed << std::setprecision(5) << centre_width_ << "/" << std::fixed << std::setprecision(5) << dScaleLat_ << "/" << + std::fixed << std::setprecision(5) << centre_height_ << "/" << std::fixed << std::setprecision(scale_precision_) << scale_bar_width_ << "k+lKilometres+jt " << "-B" << - fixed << setprecision(graticule_width_precision_) << graticule_width_ << "g" << fixed << setprecision(graticule_width_precision_) << graticule_width_ << "/" << - fixed << setprecision(graticule_width_precision_) << graticule_width_ << "g" << fixed << setprecision(graticule_width_precision_) << graticule_width_; + std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "g" << std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "/" << + std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_ << "g" << std::fixed << std::setprecision(graticule_width_precision_) << graticule_width_; if (!isLandscape) gmtbat_file_ << " -P"; - gmtbat_file_ << " -K > " << psTempFile << endl; + gmtbat_file_ << " -K > " << psTempFile << std::endl; break; // Robinson projection @@ -1426,16 +1426,16 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) gmtbat_file_ << _APP_PSCOAST_ << " -R" << (centre_width_-180) << "/" << (centre_width_+180) << "/-90/90" " -JN" << page_width_ << "c -B60g30 -D" << coastResolution_ << - " -A10000 -W0.75p,16/169/243 -G245/245/245 -K > " << psTempFile << endl; + " -A10000 -W0.75p,16/169/243 -G245/245/245 -K > " << psTempFile << std::endl; } - sort(pprj_->p._msr_colours.begin(), pprj_->p._msr_colours.end(), ComparePairFirst()); + std::sort(pprj_->p._msr_colours.begin(), pprj_->p._msr_colours.end(), ComparePairFirst()); if (pprj_->p._plot_plate_boundaries) { // print plate boundaries first gmtbat_file_ << _APP_PSXY_ << " -R -J \"" << v_tectonic_plate_file_.at(block) << - "\" -W0.75p,#DA5552 -O -K >> " << psTempFile << endl; + "\" -W0.75p,#DA5552 -O -K >> " << psTempFile << std::endl; } // Does the user want to print measurements? @@ -1468,20 +1468,20 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) circle_radius_2_ = circle_radius_ * 3.0; _it_colour = equal_range(pprj_->p._msr_colours.begin(), pprj_->p._msr_colours.end(), - v_msr_file_.at(block).at(i).second, ComparePairFirst()); + v_msr_file_.at(block).at(i).second, ComparePairFirst()); if (_it_colour.first == _it_colour.second) { - gmtbat_file_ << _APP_PSXY_ << " -R -J -Skcircle/" << fixed << setprecision(2) << circle_radius_2_ << - " \"" << v_msr_file_.at(block).at(i).first << "\" -W" << setprecision(2) << circle_line_width_ << + gmtbat_file_ << _APP_PSXY_ << " -R -J -Skcircle/" << std::fixed << std::setprecision(2) << circle_radius_2_ << + " \"" << v_msr_file_.at(block).at(i).first << "\" -W" << std::setprecision(2) << circle_line_width_ << "p,darkgray -Glightgray"; - gmtbat_file_ << " -O -K >> " << psTempFile << endl; + gmtbat_file_ << " -O -K >> " << psTempFile << std::endl; } else { colours++; - gmtbat_file_ << _APP_PSXY_ << " -R -J -Skcircle/" << fixed << setprecision(2) << circle_radius_2_ << - " \"" << v_msr_file_.at(block).at(i).first << "\" -W" << setprecision(2) << circle_line_width_ << + gmtbat_file_ << _APP_PSXY_ << " -R -J -Skcircle/" << std::fixed << std::setprecision(2) << circle_radius_2_ << + " \"" << v_msr_file_.at(block).at(i).first << "\" -W" << std::setprecision(2) << circle_line_width_ << "p,"; // Line colour @@ -1500,31 +1500,31 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) gmtbat_file_ << _it_colour.first->second; // Fill colour - gmtbat_file_ << " -G" << _it_colour.first->second << " -O -K >> " << psTempFile << endl; + gmtbat_file_ << " -G" << _it_colour.first->second << " -O -K >> " << psTempFile << std::endl; } } } // print stations first to enable measurements to be seen - gmtbat_file_ << _APP_PSXY_ << " -R -J -Skcircle/" << fixed << setprecision(2) << circle_radius_ << - " \"" << v_isl_pts_file_.at(block) << "\" -W" << setprecision(2) << circle_line_width_ << - "p,#235789 -Gwhite -O -K >> " << psTempFile << endl; + gmtbat_file_ << _APP_PSXY_ << " -R -J -Skcircle/" << std::fixed << std::setprecision(2) << circle_radius_ << + " \"" << v_isl_pts_file_.at(block) << "\" -W" << std::setprecision(2) << circle_line_width_ << + "p,#235789 -Gwhite -O -K >> " << psTempFile << std::endl; if (plotConstraints_) // don't plot line, just fill - gmtbat_file_ << _APP_PSXY_ << " -R -J -Skcircle/" << fixed << setprecision(2) << circle_radius_ << - " \"" << v_isl_const_file_.at(block) << "\" -G#235789 -O -K >> " << psTempFile << endl; + gmtbat_file_ << _APP_PSXY_ << " -R -J -Skcircle/" << std::fixed << std::setprecision(2) << circle_radius_ << + " \"" << v_isl_const_file_.at(block) << "\" -G#235789 -O -K >> " << psTempFile << std::endl; if (plotBlocks_) { - gmtbat_file_ << _APP_PSXY_ << " -R -J -Skcircle/" << fixed << setprecision(2) << circle_radius_ << - " \"" << v_jsl_pts_file_.at(block) << "\" -W" << setprecision(2) << circle_line_width_ * 2.0 << - "p,#DA5552 -Gwhite -O -K >> " << psTempFile << endl; + gmtbat_file_ << _APP_PSXY_ << " -R -J -Skcircle/" << std::fixed << std::setprecision(2) << circle_radius_ << + " \"" << v_jsl_pts_file_.at(block) << "\" -W" << std::setprecision(2) << circle_line_width_ * 2.0 << + "p,#DA5552 -Gwhite -O -K >> " << psTempFile << std::endl; if (plotConstraints_) // don't plot line, just fill - gmtbat_file_ << _APP_PSXY_ << " -R -J -Skcircle/" << fixed << setprecision(2) << circle_radius_ << - " \"" << v_jsl_const_file_.at(block) << "\" -G#DA5552 -O -K >> " << psTempFile << endl; + gmtbat_file_ << _APP_PSXY_ << " -R -J -Skcircle/" << std::fixed << std::setprecision(2) << circle_radius_ << + " \"" << v_jsl_const_file_.at(block) << "\" -G#DA5552 -O -K >> " << psTempFile << std::endl; } // Does the user want to print measurements? @@ -1549,26 +1549,26 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) continue; _it_colour = equal_range(pprj_->p._msr_colours.begin(), pprj_->p._msr_colours.end(), - v_msr_file_.at(block).at(i).second, ComparePairFirst()); + v_msr_file_.at(block).at(i).second, ComparePairFirst()); if (_it_colour.first == _it_colour.second) { gmtbat_file_ << _APP_PSXY_ << " -R -J \"" << v_msr_file_.at(block).at(i).first << - "\" " << "-W" << setprecision(2) << line_width_ << + "\" " << "-W" << std::setprecision(2) << line_width_ << "p,lightgray"; //if (v_msr_file_.at(block).at(i).second == "Y") // not a vector measurement, so represent as dashed // gmtbat_file_ << ",6_8:1p"; - gmtbat_file_ << " -O -K >> " << psTempFile << endl; + gmtbat_file_ << " -O -K >> " << psTempFile << std::endl; } else { colours++; gmtbat_file_ << _APP_PSXY_ << " -R -J \"" << v_msr_file_.at(block).at(i).first << - "\" " << "-W" << setprecision(2) << line_width_ << + "\" " << "-W" << std::setprecision(2) << line_width_ << "p," << _it_colour.first->second; //if (v_msr_file_.at(block).at(i).second == "Y") // not a vector measurement, so represent as dashed // gmtbat_file_ << ",6_8:1p"; - gmtbat_file_ << " -O -K >> " << psTempFile << endl; + gmtbat_file_ << " -O -K >> " << psTempFile << std::endl; } } } @@ -1596,30 +1596,30 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) { // print positional uncertainty gmtbat_file_ << _APP_PSVELO_ << " -R -J \"" << v_stn_apu_file_.at(block) << - "\" -Sr" << error_ellipse_scale << "/0.95/0c -L -W1.25p,#FFD275 -O -K >> " << psTempFile << endl; + "\" -Sr" << error_ellipse_scale << "/0.95/0c -L -W1.25p,#FFD275 -O -K >> " << psTempFile << std::endl; // Shift plot north to account for error ellipse legend if (pprj_->p._plot_error_ellipses) gmtbat_file_ << _APP_PSXY_ << " -R -J -T -Y" << label_font_size * 1.5 << "p " << - " -O -K >> " << psTempFile << endl; + " -O -K >> " << psTempFile << std::endl; // Add text for positional uncertainty legend gmtbat_file_ << _ECHO_CMD_ << - setprecision(precision) << fixed << left << uncertainty_legend_long_ << " " << - setprecision(precision) << fixed << left << uncertainty_legend_lat_ << " " << + std::setprecision(precision) << std::fixed << std::left << uncertainty_legend_long_ << " " << + std::setprecision(precision) << std::fixed << std::left << uncertainty_legend_lat_ << " " << " 95% positional uncertainty " << // the label - setprecision(uncertainty_legend_precision) << // '' - fixed << largest_uncertainty_ / pprj_->p._pu_ellipse_scale << " radius \\(m\\)" << // radius + std::setprecision(uncertainty_legend_precision) << // '' + std::fixed << largest_uncertainty_ / pprj_->p._pu_ellipse_scale << " radius \\(m\\)" << // radius " | "; // Push to pstext gmtbat_file_ << _APP_PSTEXT_ << " -R -J -F+f" << - fixed << setprecision(0) << + std::fixed << std::setprecision(0) << pprj_->p._label_font_size * 2.0 << "p,Helvetica" << // font size and face "=~" << pprj_->p._label_font_size/2.0 << "p,white" << // outline (or glow) "+jLM " << // justification "-Dj" << pprj_->p._label_font_size * 2.0 << // x shift - "p/0p -O -K >> " << psTempFile << endl; // y shift + "p/0p -O -K >> " << psTempFile << std::endl; // y shift } if (pprj_->p._plot_error_ellipses) @@ -1628,7 +1628,7 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) if (pprj_->p._plot_positional_uncertainty) gmtbat_file_ << _APP_PSXY_ << " -R -J -T -Y-" << label_font_size * 1.5 << "p " << - " -O -K >> " << psTempFile << endl; + " -O -K >> " << psTempFile << std::endl; double ellipse_scale(1.); @@ -1641,27 +1641,27 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) // print error ellipses in indian red gmtbat_file_ << _APP_PSVELO_ << " -R -J \"" << v_stn_err_file_.at(block) << - "\" -Sr" << error_ellipse_scale << "/0.95/0c -L -W0.75p,#DA5552 -O -K >> " << psTempFile << endl; + "\" -Sr" << error_ellipse_scale << "/0.95/0c -L -W0.75p,#DA5552 -O -K >> " << psTempFile << std::endl; // Add text for error ellipse legend gmtbat_file_ << _ECHO_CMD_ << - setprecision(precision) << fixed << left << uncertainty_legend_long_ << " " << - setprecision(precision) << fixed << left << uncertainty_legend_lat_ << " " << + std::setprecision(precision) << std::fixed << std::left << uncertainty_legend_long_ << " " << + std::setprecision(precision) << std::fixed << std::left << uncertainty_legend_lat_ << " " << " 1 sigma error ellipse " << // the label - setprecision(uncertainty_legend_precision) << // '' - fixed << largest_uncertainty_ / ellipse_scale / pprj_->p._pu_ellipse_scale << // semi-major + std::setprecision(uncertainty_legend_precision) << // '' + std::fixed << largest_uncertainty_ / ellipse_scale / pprj_->p._pu_ellipse_scale << // semi-major ", " << - fixed << largest_uncertainty_ / 3.0 / ellipse_scale / pprj_->p._pu_ellipse_scale << // semi-minor (make it third the height) + std::fixed << largest_uncertainty_ / 3.0 / ellipse_scale / pprj_->p._pu_ellipse_scale << // semi-minor (make it third the height) " \\(m\\)" << " | "; // Push to pstext gmtbat_file_ << _APP_PSTEXT_ << " -R -J -F+f" << - fixed << setprecision(0) << + std::fixed << std::setprecision(0) << pprj_->p._label_font_size * 2.0 << "p,Helvetica" << // font size and face "=~" << pprj_->p._label_font_size/2.0 << "p,white" << // outline (or glow) "+jLM " << // justification "-Dj" << pprj_->p._label_font_size * 2.0 << // x shift - "p/0p -O -K >> " << psTempFile << endl; // y shift + "p/0p -O -K >> " << psTempFile << std::endl; // y shift } if (pprj_->p._plot_correction_arrows) @@ -1688,52 +1688,52 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) // print text in black (no arrows) if (pprj_->p._plot_correction_labels) gmtbat_file_ << _APP_PSVELO_ << " -R -J \"" << v_stn_cor_file_.at(block) << - "\" -Se0.0001/0.95+f" << setprecision(0) << pprj_->p._label_font_size << - "p,Helvetica,black -L -A0.0001/0.0001/0.0001c -O -K >> " << psTempFile << endl; + "\" -Se0.0001/0.95+f" << std::setprecision(0) << pprj_->p._label_font_size << + "p,Helvetica,black -L -A0.0001/0.0001/0.0001c -O -K >> " << psTempFile << std::endl; // print arrows (without black outline!) gmtbat_file_ << _APP_PSVELO_ << " -R -J \"" << v_stn_cor_file_.at(block) << "\" -Se" << correction_arrow_scale << "/0.95/0c -L -A" << line_width_ / 2.0 * CM_TO_INCH << - "/0.5/0.1c -G#DA5552 -W0.0p,#DA5552 -O -K >> " << psTempFile << endl; + "/0.5/0.1c -G#DA5552 -W0.0p,#DA5552 -O -K >> " << psTempFile << std::endl; // Add text below the corrections arrow legend gmtbat_file_ << _ECHO_CMD_ << - setprecision(precision) << fixed << left << arrow_legend_long_ << " " << - setprecision(precision) << fixed << left << arrow_legend_lat_ << " " << - setprecision(correction_legend_precision) << // the label - fixed << average_correction_ / pprj_->p._correction_scale << " \\(m\\)" << // '' + std::setprecision(precision) << std::fixed << std::left << arrow_legend_long_ << " " << + std::setprecision(precision) << std::fixed << std::left << arrow_legend_lat_ << " " << + std::setprecision(correction_legend_precision) << // the label + std::fixed << average_correction_ / pprj_->p._correction_scale << " \\(m\\)" << // '' " | "; // Push to pstext gmtbat_file_ << _APP_PSTEXT_ << " -R -J -F+f" << - fixed << setprecision(0) << + std::fixed << std::setprecision(0) << pprj_->p._label_font_size * 2.0 << "p,Helvetica" << // font size and face "=~" << pprj_->p._label_font_size/2.0 << "p,white" << // outline (or glow) "+jRM " << // justification "-Dj" << pprj_->p._label_font_size * 2.0 << // x shift - "p/0p -O -K >> " << psTempFile << endl; // y shift + "p/0p -O -K >> " << psTempFile << std::endl; // y shift gmtbat_file_ << _APP_PSXY_ << " -R -J -T -Y-" << label_font_size * 1.5 << "p " << - " -O -K >> " << psTempFile << endl; + " -O -K >> " << psTempFile << std::endl; // Add text above for corrections legend gmtbat_file_ << _ECHO_CMD_ << - setprecision(precision) << fixed << left << arrow_legend_long_ << " " << - setprecision(precision) << fixed << left << arrow_legend_lat_ << " " << + std::setprecision(precision) << std::fixed << std::left << arrow_legend_long_ << " " << + std::setprecision(precision) << std::fixed << std::left << arrow_legend_lat_ << " " << "Corrections scale" << // the label " | "; // Push to pstext gmtbat_file_ << _APP_PSTEXT_ << " -R -J -F+f" << - fixed << setprecision(0) << + std::fixed << std::setprecision(0) << pprj_->p._label_font_size * 2.0 << "p,Helvetica" << // font size and face "=~" << pprj_->p._label_font_size/2.0 << "p,white" << // outline (or glow) "+jCM " << // justification "-Dj-" << pprj_->p._label_font_size * 2.0 << // x shift - "p/0p -O -K >> " << psTempFile << endl; // y shift + "p/0p -O -K >> " << psTempFile << std::endl; // y shift gmtbat_file_ << _APP_PSXY_ << " -R -J -T -Y" << label_font_size * 1.5 << "p " << - " -O -K >> " << psTempFile << endl; + " -O -K >> " << psTempFile << std::endl; } if (pprj_->p._plot_station_labels) @@ -1742,14 +1742,14 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) // print shadow gmtbat_file_ << " -F+f" << - fixed << setprecision(0) << + std::fixed << std::setprecision(0) << pprj_->p._label_font_size << "p,Helvetica" << // font size and face "=~" << pprj_->p._label_font_size/3.0 << "p,white" << // outline (or glow) "+jLM " << // justification "-Dj" << pprj_->p._label_font_size + sqrt(pprj_->p._label_font_size) << // x shift "p/" << pprj_->p._label_font_size/2.0 << // y shift - "p -O -K >> " << psTempFile << endl; + "p -O -K >> " << psTempFile << std::endl; if (plotBlocks_) { @@ -1757,14 +1757,14 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) // print shadow gmtbat_file_ << " -F+f" << - fixed << setprecision(0) << + std::fixed << std::setprecision(0) << pprj_->p._label_font_size << "p,Helvetica" << // font size and face "=~" << pprj_->p._label_font_size/3.0 << "p,white" << // outline (or glow) "+jLM " << // justification "-Dj" << pprj_->p._label_font_size + sqrt(pprj_->p._label_font_size) << // x shift "p/" << pprj_->p._label_font_size/2.0 << // y shift - "p -O -K >> " << psTempFile << endl; + "p -O -K >> " << psTempFile << std::endl; } } @@ -1772,7 +1772,7 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) // any plotting output (depending on whether a title block is required) gmtbat_file_ << _APP_PSXY_ << " -R -J -T -O"; - string legendCommand1(_LEGEND_CMD_1_), legendCommand2(_LEGEND_CMD_2_); + std::string legendCommand1(_LEGEND_CMD_1_), legendCommand2(_LEGEND_CMD_2_); #if defined(_WIN32) || defined(__WIN32__) // temporary legend files @@ -1784,27 +1784,27 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) if (pprj_->p._omit_title_block) { // Terminate a sequence of GMT plotting commands without producing any plotting output - gmtbat_file_ << " >> " << psTempFile << endl << endl; + gmtbat_file_ << " >> " << psTempFile << std::endl << std::endl; } else { - gmtbat_file_ << " -K >> " << psTempFile << endl << endl; + gmtbat_file_ << " -K >> " << psTempFile << std::endl << std::endl; // legend - gmtbat_file_ << _APP_GMTSET_ << " FONT_TITLE 1" << endl; + gmtbat_file_ << _APP_GMTSET_ << " FONT_TITLE 1" << std::endl; gmtbat_file_ << _APP_GMTSET_ << " FONT_ANNOT_PRIMARY " << label_font_size * 1.1 << "p"; - gmtbat_file_ << endl; + gmtbat_file_ << std::endl; #if defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) - gmtbat_file_ << "cat > " << legendTempFile << " << END" << endl; + gmtbat_file_ << "cat > " << legendTempFile << " << END" << std::endl; #endif - bool isnameaNumber(is_number(pprj_->p._title)); + bool isnameaNumber(is_number(pprj_->p._title)); - gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand1 << endl; - gmtbat_file_ << _LEGEND_ECHO_ << "N 1" << legendCommand2 << endl; - gmtbat_file_ << _LEGEND_ECHO_ << "H " << fixed << setprecision(0) << label_font_size * 2.0 << "p,Helvetica-Bold "; + gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand1 << std::endl; + gmtbat_file_ << _LEGEND_ECHO_ << "N 1" << legendCommand2 << std::endl; + gmtbat_file_ << _LEGEND_ECHO_ << "H " << std::fixed << std::setprecision(0) << label_font_size * 2.0 << "p,Helvetica-Bold "; if (isnameaNumber) gmtbat_file_ << "'" << pprj_->p._title << "'"; else @@ -1816,12 +1816,12 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) if (!pprj_->p._plot_station_centre.empty()) gmtbat_file_ << " centred on " << pprj_->p._plot_station_centre; - gmtbat_file_ << legendCommand2 << endl; - gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand2 << endl; + gmtbat_file_ << legendCommand2 << std::endl; + gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand2 << std::endl; // Print stations legend - gmtbat_file_ << _LEGEND_ECHO_ << "D 0 1p" << legendCommand2 << endl; // horizontal line - gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand2 << endl; // space + gmtbat_file_ << _LEGEND_ECHO_ << "D 0 1p" << legendCommand2 << std::endl; // horizontal line + gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand2 << std::endl; // space UINT32 station_count(1); // Simultaneous or ISL @@ -1838,32 +1838,32 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) //if (pprj_->p._plot_correction_arrows) // station_count++; // Corrections to station coordinates - gmtbat_file_ << _LEGEND_ECHO_ << "N " << station_count << legendCommand2 << endl; - gmtbat_file_ << _LEGEND_ECHO_ << "V 0 1p" << legendCommand2 << endl; // vertical line + gmtbat_file_ << _LEGEND_ECHO_ << "N " << station_count << legendCommand2 << std::endl; + gmtbat_file_ << _LEGEND_ECHO_ << "V 0 1p" << legendCommand2 << std::endl; // vertical line circle_radius_2_ = circle_radius_ * 1.75; // Simultaneous stations or Phased inner stations gmtbat_file_ << _LEGEND_ECHO_ << - "S " << fixed << setprecision(1) << symbol_offset << " c " << + "S " << std::fixed << std::setprecision(1) << symbol_offset << " c " << circle_radius_2_ << " white " << circle_line_width_ * 2 << "p,#235789 " << - fixed << setprecision(1) << label_offset; + std::fixed << std::setprecision(1) << label_offset; if (plotBlocks_) gmtbat_file_ << " Free Inner stations "; else gmtbat_file_ << " Free Stations"; - gmtbat_file_ << legendCommand2 << endl; + gmtbat_file_ << legendCommand2 << std::endl; // Simultaneous stations or Phased inner stations if (plotBlocks_) { gmtbat_file_ << _LEGEND_ECHO_ << - "S " << fixed << setprecision(1) << symbol_offset << " c " << + "S " << std::fixed << std::setprecision(1) << symbol_offset << " c " << circle_radius_2_ << " white " << circle_line_width_ * 2 << "p,#DA5552 " << - fixed << setprecision(1) << label_offset << - " Free Junction stations" << legendCommand2 << endl; + std::fixed << std::setprecision(1) << label_offset << + " Free Junction stations" << legendCommand2 << std::endl; } if (plotConstraints_) @@ -1871,25 +1871,25 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) if (plotBlocks_) { gmtbat_file_ << _LEGEND_ECHO_ << - "S " << fixed << setprecision(1) << symbol_offset << " c " << + "S " << std::fixed << std::setprecision(1) << symbol_offset << " c " << circle_radius_2_ << " #235789 " << circle_line_width_ * 2 << "p,#235789 " << - fixed << setprecision(1) << label_offset << - " Constrained inner stations" << legendCommand2 << endl; + std::fixed << std::setprecision(1) << label_offset << + " Constrained inner stations" << legendCommand2 << std::endl; gmtbat_file_ << _LEGEND_ECHO_ << - "S " << fixed << setprecision(1) << symbol_offset << " c " << + "S " << std::fixed << std::setprecision(1) << symbol_offset << " c " << circle_radius_2_ << " #DA5552 " << circle_line_width_ * 2 << "p,#DA5552 " << - fixed << setprecision(1) << label_offset << - " Constrained junction stations" << legendCommand2 << endl; + std::fixed << std::setprecision(1) << label_offset << + " Constrained junction stations" << legendCommand2 << std::endl; } else gmtbat_file_ << _LEGEND_ECHO_ << - "S " << fixed << setprecision(1) << symbol_offset << " c " << + "S " << std::fixed << std::setprecision(1) << symbol_offset << " c " << circle_radius_2_ << " #235789 " << circle_line_width_ * 2 << "p,#235789 " << - fixed << setprecision(1) << label_offset << - " Constraint stations" << legendCommand2 << endl; + std::fixed << std::setprecision(1) << label_offset << + " Constraint stations" << legendCommand2 << std::endl; } title_block_height_ = 5; @@ -1898,33 +1898,33 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) { // // Add corrections to end of stations legend // gmtbat_file_ << _LEGEND_ECHO_ << - // "S " << fixed << setprecision(1) << symbol_offset << + // "S " << std::fixed << std::setprecision(1) << symbol_offset << // " v 1.5c/0.04/0.5/0.1 red " << // arrowlength/linewidth/arrowheadwidth/arrowheadlength // line_width * 2 << "p,#DA5552 " - // << fixed << setprecision(1) << label_offset * 1.5 << " Corrections to stations" << legendCommand2 << endl; + // << std::fixed << std::setprecision(1) << label_offset * 1.5 << " Corrections to stations" << legendCommand2 << std::endl; } // If corrections are not being printed, then print measurements legend else { - gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand2 << endl; // space - gmtbat_file_ << _LEGEND_ECHO_ << "D 0 1p" << legendCommand2 << endl; // horizontal line - gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand2 << endl; // space + gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand2 << std::endl; // space + gmtbat_file_ << _LEGEND_ECHO_ << "D 0 1p" << legendCommand2 << std::endl; // horizontal line + gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand2 << std::endl; // space if (v_msr_file_.at(block).size() > columns) - gmtbat_file_ << _LEGEND_ECHO_ << "N " << columns << legendCommand2 << endl; + gmtbat_file_ << _LEGEND_ECHO_ << "N " << columns << legendCommand2 << std::endl; else - gmtbat_file_ << _LEGEND_ECHO_ << "N " << v_msr_file_.at(block).size() << legendCommand2 << endl; + gmtbat_file_ << _LEGEND_ECHO_ << "N " << v_msr_file_.at(block).size() << legendCommand2 << std::endl; bool bOtherTypes(false); for (UINT32 i=0; ip._msr_colours.begin(), pprj_->p._msr_colours.end(), - v_msr_file_.at(block).at(i).second, ComparePairFirst()); + v_msr_file_.at(block).at(i).second, ComparePairFirst()); if (_it_colour.first != _it_colour.second) { - gmtbat_file_ << _LEGEND_ECHO_ << "S " << fixed << setprecision(1) << symbol_offset; + gmtbat_file_ << _LEGEND_ECHO_ << "S " << std::fixed << std::setprecision(1) << symbol_offset; circle_radius_2_ = circle_radius_ * 1.75; @@ -1959,8 +1959,8 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) else gmtbat_file_ << _it_colour.first->second; - gmtbat_file_ << " " << fixed << setprecision(1) << label_offset << " " << - measurement_name(static_cast(_it_colour.first->first.at(0))) << legendCommand2 << endl; + gmtbat_file_ << " " << std::fixed << std::setprecision(1) << label_offset << " " << + measurement_name(static_cast(_it_colour.first->first.at(0))) << legendCommand2 << std::endl; } else bOtherTypes = true; @@ -1968,30 +1968,30 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) if (bOtherTypes) gmtbat_file_ << _LEGEND_ECHO_ << - "S " << fixed << setprecision(1) << symbol_offset << " - 0.5 lightgray " << line_width_ * 2.5 << "p,lightgray " - << fixed << setprecision(1) << label_offset << " All other types" << legendCommand2 << endl; + "S " << std::fixed << std::setprecision(1) << symbol_offset << " - 0.5 lightgray " << line_width_ * 2.5 << "p,lightgray " + << std::fixed << std::setprecision(1) << label_offset << " All other types" << legendCommand2 << std::endl; title_block_height_ += floor(((double)colours)/columns) * 0.25; } - gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand2 << endl; // space - gmtbat_file_ << _LEGEND_ECHO_ << "D 0 1p" << legendCommand2 << endl; // horizontal line - gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand2 << endl; // space - gmtbat_file_ << _LEGEND_ECHO_ << "N 5" << legendCommand2 << endl; - gmtbat_file_ << _LEGEND_ECHO_ << "S 0.01 c 0.01 white 1p,white 1 " << pprj_->p._title_block_subname << legendCommand2 << endl; - gmtbat_file_ << _LEGEND_ECHO_ << "S 0.01 c 0.01 white 1p,white 0 " << pprj_->p._title_block_name << legendCommand2 << endl; - gmtbat_file_ << _LEGEND_ECHO_ << "S 0.01 c 0.01 white 1p,white 3 " << reference_frame_ << legendCommand2 << endl; - gmtbat_file_ << _LEGEND_ECHO_ << "S 0.01 c 0.01 white 1p,white 0 " << projectionTypes[pprj_->p._projection] << " projection" << legendCommand2 << endl; - gmtbat_file_ << _LEGEND_ECHO_ << "S 0.01 c 0.01 white 1p,white 1 Scale 1:" << static_cast(scale_) << " (A3)" << legendCommand2 << endl; + gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand2 << std::endl; // space + gmtbat_file_ << _LEGEND_ECHO_ << "D 0 1p" << legendCommand2 << std::endl; // horizontal line + gmtbat_file_ << _LEGEND_ECHO_ << "G 0.25" << legendCommand2 << std::endl; // space + gmtbat_file_ << _LEGEND_ECHO_ << "N 5" << legendCommand2 << std::endl; + gmtbat_file_ << _LEGEND_ECHO_ << "S 0.01 c 0.01 white 1p,white 1 " << pprj_->p._title_block_subname << legendCommand2 << std::endl; + gmtbat_file_ << _LEGEND_ECHO_ << "S 0.01 c 0.01 white 1p,white 0 " << pprj_->p._title_block_name << legendCommand2 << std::endl; + gmtbat_file_ << _LEGEND_ECHO_ << "S 0.01 c 0.01 white 1p,white 3 " << reference_frame_ << legendCommand2 << std::endl; + gmtbat_file_ << _LEGEND_ECHO_ << "S 0.01 c 0.01 white 1p,white 0 " << projectionTypes[pprj_->p._projection] << " projection" << legendCommand2 << std::endl; + gmtbat_file_ << _LEGEND_ECHO_ << "S 0.01 c 0.01 white 1p,white 1 Scale 1:" << static_cast(scale_) << " (A3)" << legendCommand2 << std::endl; #if defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) - gmtbat_file_ << "END" << endl << endl; + gmtbat_file_ << "END" << std::endl << std::endl; #endif - gmtbat_file_ << _APP_PSLEGEND_ << " -R -J -DJTL+w" << fixed << setprecision(1) << page_width_ << + gmtbat_file_ << _APP_PSLEGEND_ << " -R -J -DJTL+w" << std::fixed << std::setprecision(1) << page_width_ << "c+jBL+l1.5+o0/1.5c -C0.3/0.3 -O -F+p+gwhite " << - legendTempFile << " -P >> " << psTempFile << endl; + legendTempFile << " -P >> " << psTempFile << std::endl; } @@ -2000,42 +2000,42 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) // conversion to PDF // - gmtbat_file_ << endl << _COMMENT_PREFIX_ << "convert ps to pdf" << endl; + gmtbat_file_ << std::endl << _COMMENT_PREFIX_ << "convert ps to pdf" << std::endl; size_t lastindex = v_gmt_pdf_filenames_.at(block).find_last_of("."); - string pdf_filename = v_gmt_pdf_filenames_.at(block).substr(0, lastindex); - gmtbat_file_ << _APP_PSCONVERT_ << " -A0.2c+white -Tf -F\"" << pdf_filename << "\" " << psTempFile << endl << endl; + std::string pdf_filename = v_gmt_pdf_filenames_.at(block).substr(0, lastindex); + gmtbat_file_ << _APP_PSCONVERT_ << " -A0.2c+white -Tf -F\"" << pdf_filename << "\" " << psTempFile << std::endl << std::endl; if (pprj_->p._export_png) { - gmtbat_file_ << endl << _COMMENT_PREFIX_ << "convert ps to png" << endl; - gmtbat_file_ << _APP_PSCONVERT_ << " -A0.2c+white -Tg -F\"" << pdf_filename << "\" " << psTempFile << endl << endl; + gmtbat_file_ << std::endl << _COMMENT_PREFIX_ << "convert ps to png" << std::endl; + gmtbat_file_ << _APP_PSCONVERT_ << " -A0.2c+white -Tg -F\"" << pdf_filename << "\" " << psTempFile << std::endl << std::endl; } //////////////////////////////////////////////// //////////////////////////////////////////////// // clean up legend files - gmtbat_file_ << _COMMENT_PREFIX_ << "cleanup" << endl; + gmtbat_file_ << _COMMENT_PREFIX_ << "cleanup" << std::endl; gmtbat_file_ << _DELETE_CMD_ << psTempFile; if (!pprj_->p._omit_title_block) - gmtbat_file_ << " " << legendTempFile << endl; + gmtbat_file_ << " " << legendTempFile << std::endl; else - gmtbat_file_ << endl; + gmtbat_file_ << std::endl; //////////////////////////////////////////////// // remove temporary directory for gmt.conf and gmt.history - gmtbat_file_ << _RMDIR_CMD_ << _ENV_GMT_TMP_DIR_ << endl; + gmtbat_file_ << _RMDIR_CMD_ << _ENV_GMT_TMP_DIR_ << std::endl; #if defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) - gmtbat_file_ << "unset " << _GMT_TMP_DIR_ << endl; + gmtbat_file_ << "unset " << _GMT_TMP_DIR_ << std::endl; #endif - gmtbat_file_ << endl; + gmtbat_file_ << std::endl; ////////////////////////////////////////////////////////////////////////////////////////// // delete data files @@ -2081,13 +2081,13 @@ void dna_plot::CreateGMTCommandFile(const UINT32& block) if (pprj_->p._plot_plate_boundaries) gmtbat_file_ << " \"" << v_tectonic_plate_file_.at(block) << "\""; - gmtbat_file_ << endl; + gmtbat_file_ << std::endl; } else - gmtbat_file_ << endl; + gmtbat_file_ << std::endl; ////////////////////////////////////////////////////////////////////////////////////////// - gmtbat_file_ << endl; + gmtbat_file_ << std::endl; } @@ -2120,7 +2120,7 @@ void dna_plot::CreateGMTPlotEnvironment(project_settings* pprj) void dna_plot::InvokeGMT() { // set up a thread group to execute the GMT scripts in parallel - thread_group gmt_plot_threads; + boost::thread_group gmt_plot_threads; for (UINT32 plot=0; plotp._keep_gen_files) return; - stringstream ss; + std::stringstream ss; ss << _DELETE_CMD_; // shell scripts for_each(v_gmt_cmd_filenames_.begin(), v_gmt_cmd_filenames_.end(), - [&ss](const string& gmt_cmd_file) { + [&ss](const std::string& gmt_cmd_file) { ss << " \"" << gmt_cmd_file << "\""; }); @@ -2193,13 +2193,13 @@ void dna_plot::CleanupGMTFiles() { // PDF files for each block (except simultaneous) for_each(v_gmt_pdf_filenames_.begin(), v_gmt_pdf_filenames_.end(), - [&ss](const string& gmt_pdf_file) { + [&ss](const std::string& gmt_pdf_file) { ss << " \"" << gmt_pdf_file << "\""; }); } // delete - string clean_up_gmt_config_files = ss.str(); + std::string clean_up_gmt_config_files = ss.str(); std::system(clean_up_gmt_config_files.c_str()); } @@ -2233,7 +2233,7 @@ void dna_plot::CalculateLimitsFromStation() if (_it_stnmap.first == _it_stnmap.second) { - stringstream ss; + std::stringstream ss; ss.str(""); ss << pprj_->p._plot_station_centre << " is not in the list of network stations."; SignalExceptionPlot(ss.str(), 0, NULL); @@ -2272,15 +2272,15 @@ void dna_plot::CalculateLimitsFromPoint() void dna_plot::FormGMTDataFileNames(const UINT32& block) { - string firstPartISL = pprj_->g.output_folder + FOLDER_SLASH + network_name_; - string firstPartSTN = pprj_->g.output_folder + FOLDER_SLASH + network_name_; + std::string firstPartISL = pprj_->g.output_folder + FOLDER_SLASH + network_name_; + std::string firstPartSTN = pprj_->g.output_folder + FOLDER_SLASH + network_name_; firstPartSTN.append("_stn"); if (plotBlocks_) { - stringstream firstPart; - string firstPartJSL; + std::stringstream firstPart; + std::string firstPartJSL; // add isl and jsl filenames for this block firstPart << firstPartSTN << "_block" << block + 1; @@ -2333,7 +2333,7 @@ void dna_plot::PrintStationsDataFileBlock(const UINT32& block) file_opener(isl_const, v_isl_const_file_.at(block_index)); file_opener(jsl_const, v_jsl_const_file_.at(block_index)); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } @@ -2402,11 +2402,11 @@ void dna_plot::PrintStationsDataFile() // Create constraint stations data file. Throws runtime_error on failure. file_opener(stn_const, v_isl_const_file_.at(0)); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } - stringstream ss; + std::stringstream ss; for (it_vstn_t_const _it_stn(bstBinaryRecords_.begin()); _it_stninitialLongitude << " " << - _it_stn->initialLatitude << endl; + os << std::setprecision(10) << std::fixed << _it_stn->initialLongitude << " " << + _it_stn->initialLatitude << std::endl; } -void dna_plot::PrintStationLabel(ostream& os, it_vstn_t_const _it_stn) +void dna_plot::PrintStationLabel(std::ostream& os, it_vstn_t_const _it_stn) { if (_it_stn->unusedStation) return; // Print longitude, latitude and label - os << setprecision(10) << fixed << + os << std::setprecision(10) << std::fixed << _it_stn->initialLongitude << " " << // E/W _it_stn->initialLatitude << " "; // N/S // Print the label, default is station name (i.e. 200100350) - string label(_it_stn->stationName); + std::string label(_it_stn->stationName); // plot alternate name? if (pprj_->p._plot_alt_name) @@ -2492,7 +2492,7 @@ void dna_plot::PrintStationLabel(ostream& os, it_vstn_t_const _it_stn) _it_stn->stationConst[1] == 'C' || _it_stn->stationConst[2] == 'C') os << " (" << _it_stn->stationConst << ")"; - os << endl; + os << std::endl; } void dna_plot::PrintStationLabels() @@ -2502,7 +2502,7 @@ void dna_plot::PrintStationLabels() // Create stations data file. Throws runtime_error on failure. file_opener(stn_lbl, v_isl_lbl_file_.at(0)); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } @@ -2515,7 +2515,7 @@ void dna_plot::PrintStationLabels() // sort stations on longitude so labels to the left are placed last CompareStnLongitude stnorderCompareFunc(&bstBinaryRecords_, false); - sort(stnList.begin(), stnList.end(), stnorderCompareFunc); + std::sort(stnList.begin(), stnList.end(), stnorderCompareFunc); it_vstn_t _it_bstn; @@ -2542,13 +2542,13 @@ void dna_plot::PrintStationLabelsBlock(const UINT32& block) // Create stations data file. Throws runtime_error on failure. file_opener(isl_lbl, v_isl_lbl_file_.at(block_index)); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } // sort ISLs on longitude so labels to the left are placed last CompareStnLongitude stnorderCompareFunc(&bstBinaryRecords_, false); - sort(v_ISL_.at(block).begin(), v_ISL_.at(block).end(), stnorderCompareFunc); + std::sort(v_ISL_.at(block).begin(), v_ISL_.at(block).end(), stnorderCompareFunc); it_vstn_t _it_bstn; @@ -2565,7 +2565,7 @@ void dna_plot::PrintStationLabelsBlock(const UINT32& block) isl_lbl.close(); // return to former sort order - sort(v_ISL_.at(block).begin(), v_ISL_.at(block).end()); + std::sort(v_ISL_.at(block).begin(), v_ISL_.at(block).end()); std::ofstream jsl_lbl; @@ -2573,12 +2573,12 @@ void dna_plot::PrintStationLabelsBlock(const UINT32& block) // Create stations data file. Throws runtime_error on failure. file_opener(jsl_lbl, v_jsl_lbl_file_.at(block_index)); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } // sort JSLs on longitude so labels to the left are placed last - sort(v_JSL_.at(block).begin(), v_JSL_.at(block).end(), stnorderCompareFunc); + std::sort(v_JSL_.at(block).begin(), v_JSL_.at(block).end(), stnorderCompareFunc); for (it_vUINT32 _it_jsl(v_JSL_.at(block).begin()); _it_jsl_longitude << " " << - setw(MSR) << setprecision(precision) << fixed << left << _it_pu->_latitude << " " << + std::setw(MSR) << std::setprecision(precision) << std::fixed << std::left << _it_pu->_longitude << " " << + std::setw(MSR) << std::setprecision(precision) << std::fixed << std::left << _it_pu->_latitude << " " << " 0 0 " << - setw(MSR) << setprecision(4) << scientific << right << _it_pu->_hzPosU * pprj_->p._pu_ellipse_scale << - setw(MSR) << setprecision(4) << scientific << right << _it_pu->_hzPosU * pprj_->p._pu_ellipse_scale << - setw(MSR) << setprecision(1) << fixed << right << "0." << endl; + std::setw(MSR) << std::setprecision(4) << std::scientific << std::right << _it_pu->_hzPosU * pprj_->p._pu_ellipse_scale << + std::setw(MSR) << std::setprecision(4) << std::scientific << std::right << _it_pu->_hzPosU * pprj_->p._pu_ellipse_scale << + std::setw(MSR) << std::setprecision(1) << std::fixed << std::right << "0." << std::endl; } stn_apu.close(); @@ -2673,7 +2673,7 @@ void dna_plot::PrintErrorEllipses(const UINT32& block) // Create error ellipse file. Throws runtime_error on failure. file_opener(stn_err, v_stn_err_file_.at(block_index)); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } @@ -2694,15 +2694,15 @@ void dna_plot::PrintErrorEllipses(const UINT32& block) // Print uncertainty legend, using average xx length. See LoadPosUncertaintyFile(). stn_err << - setw(MSR) << setprecision(precision) << fixed << left << uncertainty_legend_long_ << " " << - setw(MSR) << setprecision(precision) << fixed << left << uncertainty_legend_lat_ << " " << + std::setw(MSR) << std::setprecision(precision) << std::fixed << std::left << uncertainty_legend_long_ << " " << + std::setw(MSR) << std::setprecision(precision) << std::fixed << std::left << uncertainty_legend_lat_ << " " << " 0 0 " << - setw(MSR) << setprecision(4) << scientific << right << + std::setw(MSR) << std::setprecision(4) << std::scientific << std::right << largest_uncertainty_ / ellipse_scale << // semi-major - setw(MSR) << setprecision(4) << scientific << right << + std::setw(MSR) << std::setprecision(4) << std::scientific << std::right << largest_uncertainty_ / 3.0 / ellipse_scale << // semi-minor - setw(MSR) << setprecision(2) << fixed << right << - "45.0" << endl; // orientation from e-axis + std::setw(MSR) << std::setprecision(2) << std::fixed << std::right << + "45.0" << std::endl; // orientation from e-axis double angle; @@ -2736,12 +2736,12 @@ void dna_plot::PrintErrorEllipses(const UINT32& block) angle = DegtoDms(90. - DmstoDeg(_it_pu->_orientation)); stn_err << - setw(MSR) << setprecision(precision) << fixed << left << _it_pu->_longitude << " " << - setw(MSR) << setprecision(precision) << fixed << left << _it_pu->_latitude << " " << + std::setw(MSR) << std::setprecision(precision) << std::fixed << std::left << _it_pu->_longitude << " " << + std::setw(MSR) << std::setprecision(precision) << std::fixed << std::left << _it_pu->_latitude << " " << " 0 0 " << - setw(MSR) << setprecision(4) << scientific << right << _it_pu->_semimMajor * pprj_->p._pu_ellipse_scale << - setw(MSR) << setprecision(4) << scientific << right << _it_pu->_semimMinor * pprj_->p._pu_ellipse_scale << - setw(MSR) << setprecision(4) << fixed << right << angle << endl; + std::setw(MSR) << std::setprecision(4) << std::scientific << std::right << _it_pu->_semimMajor * pprj_->p._pu_ellipse_scale << + std::setw(MSR) << std::setprecision(4) << std::scientific << std::right << _it_pu->_semimMinor * pprj_->p._pu_ellipse_scale << + std::setw(MSR) << std::setprecision(4) << std::fixed << std::right << angle << std::endl; } stn_err.close(); @@ -2759,7 +2759,7 @@ void dna_plot::PrintCorrectionArrows(const UINT32& block) // Create corrections file. Throws runtime_error on failure. file_opener(stn_cor, v_stn_cor_file_.at(block_index)); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } @@ -2771,11 +2771,11 @@ void dna_plot::PrintCorrectionArrows(const UINT32& block) // Print correction legend, using average correction length. See LoadCorrectionsFile(). stn_cor << - setw(MSR) << setprecision(precision) << fixed << left << arrow_legend_long_ << " " << - setw(MSR) << setprecision(precision) << fixed << left << arrow_legend_lat_ << " " << - setw(MSR) << setprecision(4) << scientific << right << average_correction_ << - setw(MSR) << setprecision(2) << fixed << right << 0.0 << - " 0 0 0 " << endl; + std::setw(MSR) << std::setprecision(precision) << std::fixed << std::left << arrow_legend_long_ << " " << + std::setw(MSR) << std::setprecision(precision) << std::fixed << std::left << arrow_legend_lat_ << " " << + std::setw(MSR) << std::setprecision(4) << std::scientific << std::right << average_correction_ << + std::setw(MSR) << std::setprecision(2) << std::fixed << std::right << 0.0 << + " 0 0 0 " << std::endl; for (_it_cor=v_stn_corrs_.begin(); _it_cor!=v_stn_corrs_.end(); @@ -2802,17 +2802,17 @@ void dna_plot::PrintCorrectionArrows(const UINT32& block) continue; stn_cor << - setw(MSR) << setprecision(precision) << fixed << left << bstBinaryRecords_.at(_it_stnmap.first->second).initialLongitude << " " << - setw(MSR) << setprecision(precision) << fixed << left << bstBinaryRecords_.at(_it_stnmap.first->second).initialLatitude << " " << - setw(MSR) << setprecision(4) << scientific << right << _it_cor->_east * pprj_->p._correction_scale << - setw(MSR) << setprecision(4) << scientific << right << _it_cor->_north * pprj_->p._correction_scale << + std::setw(MSR) << std::setprecision(precision) << std::fixed << std::left << bstBinaryRecords_.at(_it_stnmap.first->second).initialLongitude << " " << + std::setw(MSR) << std::setprecision(precision) << std::fixed << std::left << bstBinaryRecords_.at(_it_stnmap.first->second).initialLatitude << " " << + std::setw(MSR) << std::setprecision(4) << std::scientific << std::right << _it_cor->_east * pprj_->p._correction_scale << + std::setw(MSR) << std::setprecision(4) << std::scientific << std::right << _it_cor->_north * pprj_->p._correction_scale << " 0 0 0 "; if (pprj_->p._plot_correction_labels) stn_cor << - setw(HEIGHT) << setprecision(3) << fixed << right << _it_cor->_east << "e," << - setprecision(3) << fixed << _it_cor->_north << "n "; - stn_cor << endl; + std::setw(HEIGHT) << std::setprecision(3) << std::fixed << std::right << _it_cor->_east << "e," << + std::setprecision(3) << std::fixed << _it_cor->_north << "n "; + stn_cor << std::endl; } stn_cor.close(); @@ -2826,17 +2826,17 @@ void dna_plot::PrintPlateBoundaries(const UINT32& block) // Tectonic plate boundaries v_string_v_doubledouble_pair global_plates; - stringstream ss; - ss << "PrintPlateBoundaries(): An error was encountered when loading tectonic plate information." << endl; + std::stringstream ss; + ss << "PrintPlateBoundaries(): An error was encountered when loading tectonic plate information." << std::endl; try { // Load tectonic plate polygons. Throws runtime_error on failure. tpb.load_tpb_file(pprj_->r.tpb_file, global_plates); - sort(global_plates.begin(), global_plates.end()); + std::sort(global_plates.begin(), global_plates.end()); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } UINT32 block_index(block); @@ -2848,19 +2848,19 @@ void dna_plot::PrintPlateBoundaries(const UINT32& block) // Create corrections file. Throws runtime_error on failure. file_opener(tectonic_plate, v_tectonic_plate_file_.at(block_index)); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } for_each(global_plates.begin(), global_plates.end(), [&tectonic_plate](const string_v_doubledouble_pair& plate){ - tectonic_plate << ">" << endl; + tectonic_plate << ">" << std::endl; for_each(plate.second.begin(), plate.second.end(), [&tectonic_plate](const doubledouble_pair& coordinate){ - tectonic_plate << fixed << setprecision(3) << - setw(10) << right << coordinate.first << "," << - setw(10) << right << coordinate.second << endl; + tectonic_plate << std::fixed << std::setprecision(3) << + std::setw(10) << std::right << coordinate.first << "," << + std::setw(10) << std::right << coordinate.second << std::endl; }); }); @@ -2874,8 +2874,8 @@ void dna_plot::PrintMeasurementsDatFilesBlock(const UINT32& block) { v_msr_file_.at(block).clear(); - string type; - stringstream ss, filename; + std::string type; + std::stringstream ss, filename; std::ofstream msr_file_stream; @@ -2897,7 +2897,7 @@ void dna_plot::PrintMeasurementsDatFilesBlock(const UINT32& block) // Create msr data file. Throws runtime_error on failure. file_opener(msr_file_stream, v_msr_def_file_.back()); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } @@ -2916,7 +2916,7 @@ void dna_plot::PrintMeasurementsDatFilesBlock(const UINT32& block) } } - vector::const_iterator _it_type; + std::vector::const_iterator _it_type; bool printOtherTypes(false); for (_it_type=_combined_msr_list.begin(); _it_type!=_combined_msr_list.end(); ++_it_type) { @@ -2945,7 +2945,7 @@ void dna_plot::PrintMeasurementsDatFilesBlock(const UINT32& block) // Create msr data file. Throws runtime_error on failure. file_opener(msr_file_stream, v_msr_all_file_.back()); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } @@ -2986,13 +2986,13 @@ void dna_plot::PrintMeasurementsDatFiles() //vector::iterator _it_type(_combined_msr_list.end()); - string msr_file_name; + std::string msr_file_name; v_msr_file_.at(0).clear(); YClusterStations_.clear(); - string type; - stringstream ss; + std::string type; + std::stringstream ss; std::ofstream msr_file_stream; @@ -3012,7 +3012,7 @@ void dna_plot::PrintMeasurementsDatFiles() // Create msr data file. Throws runtime_error on failure. file_opener(msr_file_stream, msr_file_name); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } @@ -3031,7 +3031,7 @@ void dna_plot::PrintMeasurementsDatFiles() } } - vector::const_iterator _it_type; + std::vector::const_iterator _it_type; bool printOtherTypes(false); for (_it_type=_combined_msr_list.begin(); _it_type!=_combined_msr_list.end(); ++_it_type) { @@ -3059,7 +3059,7 @@ void dna_plot::PrintMeasurementsDatFiles() // Create msr data file. Throws runtime_error on failure. file_opener(msr_file_stream, msr_file_name); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } @@ -3088,13 +3088,13 @@ void dna_plot::PrintMeasurementsDatFileBlock(const UINT32& block, char msrType, UINT32 precision(10); bool FirstisWithinLimits, SecondisWithinLimits, ThirdisWithinLimits; - stringstream ss; + std::stringstream ss; it_vUINT32 _it_block_msr(v_CML_.at(block).begin()); vUINT32 msrIndices; it_vmsr_t _it_msr; - (*msr_file_stream) << ">" << endl; + (*msr_file_stream) << ">" << std::endl; for (_it_block_msr=v_CML_.at(block).begin(); _it_block_msrstation3).initialLongitude; + ss << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station3).initialLongitude; ss << " "; - ss << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station3).initialLatitude; - ss << endl; + ss << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station3).initialLatitude; + ss << std::endl; // test if point is within limits of custom defined box if (!default_limits_) @@ -3170,16 +3170,16 @@ void dna_plot::PrintMeasurementsDatFileBlock(const UINT32& block, char msrType, (*msr_file_stream) << ss.str(); // First - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(bmsBinaryRecords_.at(*msr).station1).initialLongitude; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(bmsBinaryRecords_.at(*msr).station1).initialLongitude; (*msr_file_stream) << " "; - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(bmsBinaryRecords_.at(*msr).station1).initialLatitude; - (*msr_file_stream) << endl; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(bmsBinaryRecords_.at(*msr).station1).initialLatitude; + (*msr_file_stream) << std::endl; // Second - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(bmsBinaryRecords_.at(*msr).station2).initialLongitude; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(bmsBinaryRecords_.at(*msr).station2).initialLongitude; (*msr_file_stream) << " "; - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(bmsBinaryRecords_.at(*msr).station2).initialLatitude; - (*msr_file_stream) << endl << ">" << endl; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(bmsBinaryRecords_.at(*msr).station2).initialLatitude; + (*msr_file_stream) << std::endl << ">" << std::endl; } break; @@ -3197,10 +3197,10 @@ void dna_plot::PrintMeasurementsDatFileBlock(const UINT32& block, char msrType, continue; // First - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station1).initialLongitude; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station1).initialLongitude; (*msr_file_stream) << " "; - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station1).initialLatitude; - (*msr_file_stream) << endl << ">" << endl; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station1).initialLatitude; + (*msr_file_stream) << std::endl << ">" << std::endl; break; @@ -3221,10 +3221,10 @@ void dna_plot::PrintMeasurementsDatFileBlock(const UINT32& block, char msrType, continue; // First - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(bmsBinaryRecords_.at(*msr).station1).initialLongitude; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(bmsBinaryRecords_.at(*msr).station1).initialLongitude; (*msr_file_stream) << " "; - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(bmsBinaryRecords_.at(*msr).station1).initialLatitude; - (*msr_file_stream) << endl << ">" << endl; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(bmsBinaryRecords_.at(*msr).station1).initialLatitude; + (*msr_file_stream) << std::endl << ">" << std::endl; } } } @@ -3240,9 +3240,9 @@ void dna_plot::PrintMeasurementsDatFile(char msrType, std::ofstream* msr_file_st UINT32 precision(10); bool FirstisWithinLimits, SecondisWithinLimits, ThirdisWithinLimits; - stringstream ss; + std::stringstream ss; - (*msr_file_stream) << ">" << endl; + (*msr_file_stream) << ">" << std::endl; for (_it_msr=bmsBinaryRecords_.begin(); _it_msr!=bmsBinaryRecords_.end(); _it_msr++) { @@ -3261,10 +3261,10 @@ void dna_plot::PrintMeasurementsDatFile(char msrType, std::ofstream* msr_file_st // Print 3 - 1 - 2 // // Third - ss << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station3).initialLongitude; + ss << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station3).initialLongitude; ss << " "; - ss << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station3).initialLatitude; - ss << endl; + ss << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station3).initialLatitude; + ss << std::endl; // test if point is within limits of custom defined box if (!default_limits_) @@ -3307,16 +3307,16 @@ void dna_plot::PrintMeasurementsDatFile(char msrType, std::ofstream* msr_file_st (*msr_file_stream) << ss.str(); // First - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station1).initialLongitude; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station1).initialLongitude; (*msr_file_stream) << " "; - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station1).initialLatitude; - (*msr_file_stream) << endl; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station1).initialLatitude; + (*msr_file_stream) << std::endl; // Second - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station2).initialLongitude; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station2).initialLongitude; (*msr_file_stream) << " "; - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station2).initialLatitude; - (*msr_file_stream) << endl << ">" << endl; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station2).initialLatitude; + (*msr_file_stream) << std::endl << ">" << std::endl; break; // single station @@ -3335,10 +3335,10 @@ void dna_plot::PrintMeasurementsDatFile(char msrType, std::ofstream* msr_file_st } // First - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station1).initialLongitude; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station1).initialLongitude; (*msr_file_stream) << " "; - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station1).initialLatitude; - (*msr_file_stream) << endl << ">" << endl; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station1).initialLatitude; + (*msr_file_stream) << std::endl << ">" << std::endl; break; case 'Y': // GPS point cluster @@ -3366,13 +3366,13 @@ void dna_plot::PrintMeasurementsDatFile(char msrType, std::ofstream* msr_file_st continue; YClusterStations_.push_back(_it_msr->station1); - sort(YClusterStations_.begin(), YClusterStations_.end()); + std::sort(YClusterStations_.begin(), YClusterStations_.end()); // First - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station1).initialLongitude; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station1).initialLongitude; (*msr_file_stream) << " "; - (*msr_file_stream) << setprecision(precision) << fixed << bstBinaryRecords_.at(_it_msr->station1).initialLatitude; - (*msr_file_stream) << endl << ">" << endl; + (*msr_file_stream) << std::setprecision(precision) << std::fixed << bstBinaryRecords_.at(_it_msr->station1).initialLatitude; + (*msr_file_stream) << std::endl << ">" << std::endl; } } @@ -3386,11 +3386,11 @@ void dna_plot::PrintGMTParameters() try { for (; _it_vpstr!=pprj_->p._gmt_params.end(); _it_vpstr++) - gmtbat_file_ << _APP_GMTSET_ << " " << _it_vpstr->first << " " << _it_vpstr->second << endl; - gmtbat_file_ << endl; + gmtbat_file_ << _APP_GMTSET_ << " " << _it_vpstr->first << " " << _it_vpstr->second << std::endl; + gmtbat_file_ << std::endl; } - catch (const ios_base::failure& f) { - SignalExceptionPlot(static_cast(f.what()), 0, "o", &gmtbat_file_); + catch (const std::ios_base::failure& f) { + SignalExceptionPlot(static_cast(f.what()), 0, "o", &gmtbat_file_); } } @@ -3445,14 +3445,14 @@ void dna_plot::LoadBinaryFiles() dna_io_bms bms; bms.load_bms_file(projectSettings_.i.bms_file, &bmsBinaryRecords_, bms_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } reference_frame_ = projectSettings_.i.reference_frame; try { - reference_frame_ = datumFromEpsgString(bst_meta_.epsgCode); + reference_frame_ = datumFromEpsgString(bst_meta_.epsgCode); } catch (...) { // do nothing @@ -3560,7 +3560,7 @@ void dna_plot::LoadStationMap() dna_io_map map; map.load_map_file(projectSettings_.i.map_file, &stnsMap_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } } @@ -3582,7 +3582,7 @@ void dna_plot::LoadStationMap() // } // // // sort on station name (i.e. first of the pair) -// sort(stnsMap_.begin(), stnsMap_.end(), StationNameIDCompareName()); +// std::sort(stnsMap_.begin(), stnsMap_.end(), StationNameIDCompareName()); // // if (stnsMap_.size() < stnCount) // SignalExceptionPlot("SortandMapStations(): Could not allocate sufficient memory for the Station map.", 0, NULL); @@ -3602,17 +3602,17 @@ void dna_plot::LoadSegmentationFile() &v_measurementCount_, &v_unknownsCount_, &v_ContiguousNetList, &v_parameterStationCount); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } if (projectSettings_.p._plot_block_number > blockCount_) { - stringstream ss; + std::stringstream ss; ss << "Specified block number (" << projectSettings_.p._plot_block_number << ") exceeds the total number of blocks (" << - blockCount_ << ")." << endl; + blockCount_ << ")." << std::endl; SignalExceptionPlot(ss.str(), 0, NULL); } @@ -3627,15 +3627,15 @@ void dna_plot::LoadPosUncertaintyFile() std::ifstream apu_file; try { // Load apu file. Throws runtime_error on failure. - file_opener(apu_file, projectSettings_.o._apu_file, ios::in, ascii, true); + file_opener(apu_file, projectSettings_.o._apu_file, std::ios::in, ascii, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } bool fullCovarianceMatrix(false); UINT32 block(0), stn(0), stn_cov, blockstnCount; - string strLine; + std::string strLine; stationPosUncertainty_t posUnc; v_stn_pu_.resize(blockCount_); @@ -3662,39 +3662,39 @@ void dna_plot::LoadPosUncertaintyFile() apu_file.ignore(PRINT_LINE_LENGTH, '\n'); // PU Confidence interval apu_file.getline(line, PRINT_LINE_LENGTH); // Stations printed in blocks - strLine = trimstr(string(line)); - if (!iequals(strLine.substr(0, 16), "Stations printed")) + strLine = trimstr(std::string(line)); + if (!boost::iequals(strLine.substr(0, 16), "Stations printed")) { - stringstream ss; - ss << "LoadPosUncertaintyFile(): " << projectSettings_.o._apu_file << " is corrupt." << endl; - ss << " Expected to find 'Stations printed in blocks' field." << endl; + std::stringstream ss; + ss << "LoadPosUncertaintyFile(): " << projectSettings_.o._apu_file << " is corrupt." << std::endl; + ss << " Expected to find 'Stations printed in blocks' field." << std::endl; SignalExceptionPlot(ss.str(), 0, "i", &apu_file); } - if ((dataBlocks = yesno_uint(strLine.substr(PRINT_VAR_PAD)))) + if ((dataBlocks = yesno_uint(strLine.substr(PRINT_VAR_PAD)))) v_stn_pu_.resize(bstBinaryRecords_.size()); else v_stn_pu_.reserve(bstBinaryRecords_.size()); apu_file.getline(line, PRINT_LINE_LENGTH); // Variance matrix units - strLine = trimstr(string(line)); - if (iequals(strLine.substr(PRINT_VAR_PAD, 3), "XYZ")) + strLine = trimstr(std::string(line)); + if (boost::iequals(strLine.substr(PRINT_VAR_PAD, 3), "XYZ")) vcv_units = XYZ_apu_ui; else vcv_units = ENU_apu_ui; apu_file.getline(line, PRINT_LINE_LENGTH); // Full covariance matrix - strLine = trimstr(string(line)); - if (!iequals(strLine.substr(0, 15), "Full covariance")) + strLine = trimstr(std::string(line)); + if (!boost::iequals(strLine.substr(0, 15), "Full covariance")) { - stringstream ss; - ss << "LoadPosUncertaintyFile(): " << projectSettings_.o._apu_file << " is corrupt." << endl; - ss << " Expected to find 'Full covariance matrix' field." << endl; + std::stringstream ss; + ss << "LoadPosUncertaintyFile(): " << projectSettings_.o._apu_file << " is corrupt." << std::endl; + ss << " Expected to find 'Full covariance matrix' field." << std::endl; SignalExceptionPlot(ss.str(), 0, "i", &apu_file); } - fullCovarianceMatrix = yesno_uint(strLine.substr(PRINT_VAR_PAD)); + fullCovarianceMatrix = yesno_uint(strLine.substr(PRINT_VAR_PAD)); // If covariances are printed, then the data will appear in blocks if (fullCovarianceMatrix) @@ -3714,21 +3714,21 @@ void dna_plot::LoadPosUncertaintyFile() apu_file.ignore(PRINT_LINE_LENGTH, '\n'); // apu_file.getline(line, PRINT_LINE_LENGTH); // Block # - strLine = trimstr(string(line)); + strLine = trimstr(std::string(line)); - if (!iequals(strLine.substr(0, 5), "Block")) + if (!boost::iequals(strLine.substr(0, 5), "Block")) { - stringstream ss; - ss << "LoadPosUncertaintyFile(): " << projectSettings_.o._apu_file << " is corrupt." << endl; - ss << " Expected to read Block data, but found " << strLine << endl; + std::stringstream ss; + ss << "LoadPosUncertaintyFile(): " << projectSettings_.o._apu_file << " is corrupt." << std::endl; + ss << " Expected to read Block data, but found " << strLine << std::endl; SignalExceptionPlot(ss.str(), 0, "i", &apu_file); } if (LongFromString(strLine.substr(6)) != block + 1) { - stringstream ss; - ss << "LoadPosUncertaintyFile(): " << projectSettings_.o._apu_file << " is corrupt." << endl; - ss << " Expected to read data for block " << strLine.substr(6) << ", but found " << strLine << endl; + std::stringstream ss; + ss << "LoadPosUncertaintyFile(): " << projectSettings_.o._apu_file << " is corrupt." << std::endl; + ss << " Expected to read data for block " << strLine.substr(6) << ", but found " << strLine << std::endl; SignalExceptionPlot(ss.str(), 0, "i", &apu_file); } } @@ -3745,7 +3745,7 @@ void dna_plot::LoadPosUncertaintyFile() { apu_file.getline(line, PRINT_LINE_LENGTH); // Now the data... - strLine = trimstr(string(line)); + strLine = trimstr(std::string(line)); if (strLine.length() < STATION) { if (apu_file.eof()) @@ -3767,7 +3767,7 @@ void dna_plot::LoadPosUncertaintyFile() // get yy from next row of variance matrix apu_file.getline(line, PRINT_LINE_LENGTH); - strLine = string(line); + strLine = std::string(line); posUnc._yy = DoubleFromString(trimstr(strLine.substr(STATION+PAD2+LAT_EAST+LON_NORTH+STAT+STAT+PREC+PREC+PREC+MSR, MSR))); posUnc._yz = DoubleFromString(trimstr(strLine.substr(STATION+PAD2+LAT_EAST+LON_NORTH+STAT+STAT+PREC+PREC+PREC+MSR+MSR, MSR))); @@ -3786,7 +3786,7 @@ void dna_plot::LoadPosUncertaintyFile() { // get yy from next row of variance matrix apu_file.getline(line, PRINT_LINE_LENGTH); - strLine = trimstr(string(line)); + strLine = trimstr(std::string(line)); posUnc._zz = DoubleFromString(trimstr(strLine)); vcv_cart.put(0, 0, posUnc._xx); @@ -3838,11 +3838,11 @@ void dna_plot::LoadPosUncertaintyFile() } } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if (!apu_file.eof()) { - stringstream ss; - ss << "LoadPosUncertaintyFile(): An error was encountered when reading " << projectSettings_.o._apu_file << "." << endl << " " << f.what(); + std::stringstream ss; + ss << "LoadPosUncertaintyFile(): An error was encountered when reading " << projectSettings_.o._apu_file << "." << std::endl << " " << f.what(); SignalExceptionPlot(ss.str(), 0, "i", &apu_file); } } @@ -3979,7 +3979,7 @@ void dna_plot::BuildParameterStationList() v_parameterStationList_.at(block) = v_ISL_.at(block); v_parameterStationList_.at(block).insert(v_parameterStationList_.at(block).end(), v_JSL_.at(block).begin(), v_JSL_.at(block).end()); - sort(v_parameterStationList_.at(block).begin(), v_parameterStationList_.at(block).end()); + std::sort(v_parameterStationList_.at(block).begin(), v_parameterStationList_.at(block).end()); } } @@ -3998,15 +3998,15 @@ void dna_plot::LoadCorrectionsFile() std::ifstream cor_file; try { // Load corrections file. Throws runtime_error on failure. - file_opener(cor_file, projectSettings_.o._cor_file, ios::in, ascii, true); + file_opener(cor_file, projectSettings_.o._cor_file, std::ios::in, ascii, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionPlot(e.what(), 0, NULL); } UINT32 correction_count(0); UINT32 block(0), stn(0), blockstnCount, corFileBlockCount(blockCount_); - string strLine; + std::string strLine; stationCorrections_t stnCor; average_correction_ = 0.0; @@ -4029,20 +4029,20 @@ void dna_plot::LoadCorrectionsFile() cor_file.getline(line, PRINT_LINE_LENGTH); // Stations printed in blocks // Get the yes/no string and convert to bool - strLine = trimstr(string(line)); - if (!iequals(strLine.substr(0, 16), "Stations printed")) + strLine = trimstr(std::string(line)); + if (!boost::iequals(strLine.substr(0, 16), "Stations printed")) { - stringstream ss; + std::stringstream ss; // TODO - make use of Boost current function // http://www.boost.org/doc/libs/1_58_0/boost/current_function.hpp // and if required, print the filename and line number using __FILE__ and __LINE__ // https://stackoverflow.com/questions/15305310/predefined-macros-for-function-name-func - ss << "LoadCorrectionsFile(): " << projectSettings_.o._cor_file << " is corrupt." << endl; - ss << " Expected to find 'Stations printed in blocks' field." << endl; + ss << "LoadCorrectionsFile(): " << projectSettings_.o._cor_file << " is corrupt." << std::endl; + ss << " Expected to find 'Stations printed in blocks' field." << std::endl; SignalExceptionPlot(ss.str(), 0, "i", &cor_file); } - if ((dataBlocks = yesno_uint(strLine.substr(PRINT_VAR_PAD)))) // Data printed in blocks? + if ((dataBlocks = yesno_uint(strLine.substr(PRINT_VAR_PAD)))) // Data printed in blocks? v_stn_corrs_.resize(bstBinaryRecords_.size()); else { @@ -4063,21 +4063,21 @@ void dna_plot::LoadCorrectionsFile() cor_file.ignore(PRINT_LINE_LENGTH, '\n'); // cor_file.getline(line, PRINT_LINE_LENGTH); // Block # - strLine = trimstr(string(line)); + strLine = trimstr(std::string(line)); - if (!iequals(strLine.substr(0, 5), "Block")) + if (!boost::iequals(strLine.substr(0, 5), "Block")) { - stringstream ss; - ss << "LoadCorrectionsFile(): " << projectSettings_.o._cor_file << " is corrupt." << endl; - ss << " Expected to read Block data, but found " << strLine << endl; + std::stringstream ss; + ss << "LoadCorrectionsFile(): " << projectSettings_.o._cor_file << " is corrupt." << std::endl; + ss << " Expected to read Block data, but found " << strLine << std::endl; SignalExceptionPlot(ss.str(), 0, "i", &cor_file); } if (LongFromString(strLine.substr(6)) != block + 1) { - stringstream ss; - ss << "LoadCorrectionsFile(): " << projectSettings_.o._cor_file << " is corrupt." << endl; - ss << " Expected to read data for block " << strLine.substr(6) << ", but found " << strLine << endl; + std::stringstream ss; + ss << "LoadCorrectionsFile(): " << projectSettings_.o._cor_file << " is corrupt." << std::endl; + ss << " Expected to read data for block " << strLine.substr(6) << ", but found " << strLine << std::endl; SignalExceptionPlot(ss.str(), 0, "i", &cor_file); } } @@ -4094,7 +4094,7 @@ void dna_plot::LoadCorrectionsFile() { cor_file.getline(line, PRINT_LINE_LENGTH); // Now the data... - strLine = trimstr(string(line)); + strLine = trimstr(std::string(line)); if (strLine.length() < STATION) { if (cor_file.eof()) @@ -4104,15 +4104,15 @@ void dna_plot::LoadCorrectionsFile() //// print... //// station and constraint - //os << setw(STATION) << left << bstBinaryRecords_.at(stn).stationName << setw(PAD2) << " "; + //os << std::setw(STATION) << std::left << bstBinaryRecords_.at(stn).stationName << std::setw(PAD2) << " "; //// data - //os << setw(MSR) << right << FormatDmsString(RadtoDms(azimuth), 4, true, false) << - // setw(MSR) << right << FormatDmsString(RadtoDms(vertical_angle), 4, true, false) << - // setw(MSR) << setprecision(PRECISION_MTR_STN) << fixed << right << slope_distance << - // setw(MSR) << setprecision(PRECISION_MTR_STN) << fixed << right << horiz_distance << - // setw(HEIGHT) << setprecision(PRECISION_MTR_STN) << fixed << right << local_12e << - // setw(HEIGHT) << setprecision(PRECISION_MTR_STN) << fixed << right << local_12n << - // setw(HEIGHT) << setprecision(PRECISION_MTR_STN) << fixed << right << local_12up << endl; + //os << std::setw(MSR) << std::right << FormatDmsString(RadtoDms(azimuth), 4, true, false) << + // std::setw(MSR) << std::right << FormatDmsString(RadtoDms(vertical_angle), 4, true, false) << + // std::setw(MSR) << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << slope_distance << + // std::setw(MSR) << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << horiz_distance << + // std::setw(HEIGHT) << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << local_12e << + // std::setw(HEIGHT) << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << local_12n << + // std::setw(HEIGHT) << std::setprecision(PRECISION_MTR_STN) << std::fixed << std::right << local_12up << std::endl; stnCor._station = trimstr(strLine.substr(0, STATION)); stnCor._azimuth = ParseDmsString(trimstr(strLine.substr(STATION+PAD2, MSR)), " "); @@ -4143,11 +4143,11 @@ void dna_plot::LoadCorrectionsFile() } } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if (!cor_file.eof()) { - stringstream ss; - ss << "LoadCorrectionsFile(): An error was encountered when reading " << projectSettings_.o._cor_file << "." << endl << " " << f.what(); + std::stringstream ss; + ss << "LoadCorrectionsFile(): An error was encountered when reading " << projectSettings_.o._cor_file << "." << std::endl << " " << f.what(); SignalExceptionPlot(ss.str(), 0, "i", &cor_file); } } @@ -4163,7 +4163,7 @@ void dna_plot::LoadCorrectionsFile() // Purpose: Closes all files (if file pointers are passed in) and throws runtime_error // Called by: Any // Calls: runtime_error() -void dna_plot::SignalExceptionPlot(const string& msg, const int& line_no, const char *streamType, ...) +void dna_plot::SignalExceptionPlot(const std::string& msg, const int& line_no, const char *streamType, ...) { plotStatus_ = PLOT_EXCEPTION_RAISED; @@ -4213,8 +4213,8 @@ void dna_plot::SignalExceptionPlot(const string& msg, const int& line_no, const // UINT32 precision; // _COORD_TYPE_ ctType; // -// vector* vdirns; -// vector* vgpsBsls; +// std::vector* vdirns; +// std::vector* vgpsBsls; // // for (; _it_msr!=vMeasurements->end(); _it_msr++) // { @@ -4229,23 +4229,23 @@ void dna_plot::SignalExceptionPlot(const string& msg, const int& line_no, const // // if (it_stnmap_range.first == it_stnmap_range.second) // { -// cout << _it_msr->get()->GetTarget2() << " is not in the list of network stations."; +// std::cout << _it_msr->get()->GetTarget2() << " is not in the list of network stations."; // continue; // } // precision = 3; // if ((ctType = vStations->at(it_stnmap_range.first->second)->GetMyCoordTypeC()) == LLH_type_i) // precision = 10; // -// osMsr << setprecision(precision) << fixed << +// osMsr << std::setprecision(precision) << std::fixed << // (ctType == LLH_type_i ? // Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()) : // vStations->at(it_stnmap_range.first->second)->GetYAxis()); // osMsr << " "; -// osMsr << setprecision(precision) << fixed << +// osMsr << std::setprecision(precision) << std::fixed << // (ctType == LLH_type_i ? // Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()) : // vStations->at(it_stnmap_range.first->second)->GetXAxis()); -// osMsr << endl; +// osMsr << std::endl; // case 'B': // Geodetic azimuth // case 'K': // Astronomic azimuth // case 'C': // Chord dist @@ -4261,17 +4261,17 @@ void dna_plot::SignalExceptionPlot(const string& msg, const int& line_no, const // // if (it_stnmap_range.first == it_stnmap_range.second) // { -// cout << _it_msr->get()->GetFirst() << " is not in the list of network stations."; +// std::cout << _it_msr->get()->GetFirst() << " is not in the list of network stations."; // continue; // } // precision = 3; // if ((ctType = vStations->at(it_stnmap_range.first->second)->GetMyCoordTypeC()) == LLH_type_i) // precision = 10; // -// osMsr << setprecision(precision) << fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()): vStations->at(it_stnmap_range.first->second)->GetYAxis()); +// osMsr << std::setprecision(precision) << std::fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()): vStations->at(it_stnmap_range.first->second)->GetYAxis()); // osMsr << " "; -// osMsr << setprecision(precision) << fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()): vStations->at(it_stnmap_range.first->second)->GetXAxis()); -// osMsr << endl; +// osMsr << std::setprecision(precision) << std::fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()): vStations->at(it_stnmap_range.first->second)->GetXAxis()); +// osMsr << std::endl; // // // Second // it_stnmap_range = equal_range(stnsMap_.begin(), stnsMap_.end(), @@ -4279,17 +4279,17 @@ void dna_plot::SignalExceptionPlot(const string& msg, const int& line_no, const // // if (it_stnmap_range.first == it_stnmap_range.second) // { -// cout << _it_msr->get()->GetTarget() << " is not in the list of network stations."; +// std::cout << _it_msr->get()->GetTarget() << " is not in the list of network stations."; // continue; // } // precision = 3; // if ((ctType = vStations->at(it_stnmap_range.first->second)->GetMyCoordTypeC()) == LLH_type_i) // precision = 10; // -// osMsr << setprecision(precision) << fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()): vStations->at(it_stnmap_range.first->second)->GetYAxis()); +// osMsr << std::setprecision(precision) << std::fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()): vStations->at(it_stnmap_range.first->second)->GetYAxis()); // osMsr << " "; -// osMsr << setprecision(precision) << fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()): vStations->at(it_stnmap_range.first->second)->GetXAxis()); -// osMsr << endl << "#" << endl; +// osMsr << std::setprecision(precision) << std::fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()): vStations->at(it_stnmap_range.first->second)->GetXAxis()); +// osMsr << std::endl << "#" << std::endl; // break; // case 'D': // Direction set // vdirns = _it_msr->get()->GetDirections_ptr(); @@ -4305,9 +4305,9 @@ void dna_plot::SignalExceptionPlot(const string& msg, const int& line_no, const //} // // -//void dna_plot::PrintGMTPlotCoords_D(vdnaStnPtr* vStations, vector* vDirections, ostream& osMsr) +//void dna_plot::PrintGMTPlotCoords_D(vdnaStnPtr* vStations, std::vector* vDirections, ostream& osMsr) //{ -// vector::iterator _it_dirn(vDirections->begin()); +// std::vector::iterator _it_dirn(vDirections->begin()); // //v_string_uint32_pair::iterator _it_stnmap(stnsMap_.begin()); // // UINT32 precision; @@ -4321,17 +4321,17 @@ void dna_plot::SignalExceptionPlot(const string& msg, const int& line_no, const // // if (it_stnmap_range.first == it_stnmap_range.second) // { -// cout << _it_dirn->GetFirst() << " is not in the list of network stations."; +// std::cout << _it_dirn->GetFirst() << " is not in the list of network stations."; // continue; // } // precision = 3; // if ((ctType = vStations->at(it_stnmap_range.first->second)->GetMyCoordTypeC()) == LLH_type_i) // precision = 10; // -// osMsr << setprecision(precision) << fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()): vStations->at(it_stnmap_range.first->second)->GetYAxis()); +// osMsr << std::setprecision(precision) << std::fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()): vStations->at(it_stnmap_range.first->second)->GetYAxis()); // osMsr << " "; -// osMsr << setprecision(precision) << fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()): vStations->at(it_stnmap_range.first->second)->GetXAxis()); -// osMsr << endl; +// osMsr << std::setprecision(precision) << std::fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()): vStations->at(it_stnmap_range.first->second)->GetXAxis()); +// osMsr << std::endl; // // // Second // it_stnmap_range = equal_range(stnsMap_.begin(), stnsMap_.end(), @@ -4339,24 +4339,24 @@ void dna_plot::SignalExceptionPlot(const string& msg, const int& line_no, const // // if (it_stnmap_range.first == it_stnmap_range.second) // { -// cout << _it_dirn->GetTarget() << " is not in the list of network stations."; +// std::cout << _it_dirn->GetTarget() << " is not in the list of network stations."; // continue; // } // precision = 3; // if ((ctType = vStations->at(it_stnmap_range.first->second)->GetMyCoordTypeC()) == LLH_type_i) // precision = 10; // -// osMsr << setprecision(precision) << fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()): vStations->at(it_stnmap_range.first->second)->GetYAxis()); +// osMsr << std::setprecision(precision) << std::fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()): vStations->at(it_stnmap_range.first->second)->GetYAxis()); // osMsr << " "; -// osMsr << setprecision(precision) << fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()): vStations->at(it_stnmap_range.first->second)->GetXAxis()); -// osMsr << endl << "#" << endl; +// osMsr << std::setprecision(precision) << std::fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()): vStations->at(it_stnmap_range.first->second)->GetXAxis()); +// osMsr << std::endl << "#" << std::endl; // } //} // // -//void dna_plot::PrintGMTPlotCoords_GX(vdnaStnPtr* vStations, vector* vGPSBaselines, ostream& osMsr) +//void dna_plot::PrintGMTPlotCoords_GX(vdnaStnPtr* vStations, std::vector* vGPSBaselines, ostream& osMsr) //{ -// vector::iterator _it_bsl(vGPSBaselines->begin()); +// std::vector::iterator _it_bsl(vGPSBaselines->begin()); // //v_string_uint32_pair::iterator _it_stnmap(stnsMap_.begin()); // // UINT32 precision; @@ -4370,17 +4370,17 @@ void dna_plot::SignalExceptionPlot(const string& msg, const int& line_no, const // // if (it_stnmap_range.first == it_stnmap_range.second) // { -// cout << _it_bsl->GetFirst() << " is not in the list of network stations."; +// std::cout << _it_bsl->GetFirst() << " is not in the list of network stations."; // continue; // } // precision = 3; // if ((ctType = vStations->at(it_stnmap_range.first->second)->GetMyCoordTypeC()) == LLH_type_i) // precision = 10; // -// osMsr << setprecision(precision) << fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()): vStations->at(it_stnmap_range.first->second)->GetYAxis()); +// osMsr << std::setprecision(precision) << std::fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()): vStations->at(it_stnmap_range.first->second)->GetYAxis()); // osMsr << " "; -// osMsr << setprecision(precision) << fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()): vStations->at(it_stnmap_range.first->second)->GetXAxis()); -// osMsr << endl; +// osMsr << std::setprecision(precision) << std::fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()): vStations->at(it_stnmap_range.first->second)->GetXAxis()); +// osMsr << std::endl; // // // Second // it_stnmap_range = equal_range(stnsMap_.begin(), stnsMap_.end(), @@ -4388,17 +4388,17 @@ void dna_plot::SignalExceptionPlot(const string& msg, const int& line_no, const // // if (it_stnmap_range.first == it_stnmap_range.second) // { -// cout << _it_bsl->GetTarget() << " is not in the list of network stations."; +// std::cout << _it_bsl->GetTarget() << " is not in the list of network stations."; // continue; // } // precision = 3; // if ((ctType = vStations->at(it_stnmap_range.first->second)->GetMyCoordTypeC()) == LLH_type_i) // precision = 10; // -// osMsr << setprecision(precision) << fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()): vStations->at(it_stnmap_range.first->second)->GetYAxis()); +// osMsr << std::setprecision(precision) << std::fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetYAxis()): vStations->at(it_stnmap_range.first->second)->GetYAxis()); // osMsr << " "; -// osMsr << setprecision(precision) << fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()): vStations->at(it_stnmap_range.first->second)->GetXAxis()); -// osMsr << endl << "#" << endl; +// osMsr << std::setprecision(precision) << std::fixed << (ctType == LLH_type_i ? Degrees(vStations->at(it_stnmap_range.first->second)->GetXAxis()): vStations->at(it_stnmap_range.first->second)->GetXAxis()); +// osMsr << std::endl << "#" << std::endl; // } //} @@ -4550,7 +4550,7 @@ void dna_plot::NormaliseGraticule(double& graticule_width_, UINT32& graticule_wi graticule_width_ = graticule / 3600.; } -void dna_plot::SelectCoastlineResolution(const double& dDimension, string& coastResolution, plot_settings* plotCriteria) +void dna_plot::SelectCoastlineResolution(const double& dDimension, std::string& coastResolution, plot_settings* plotCriteria) { plotCriteria->_coasline_resolution = low; coastResolution = "l"; diff --git a/dynadjust/dynadjust/dnaplot/dnaplot.hpp b/dynadjust/dynadjust/dnaplot/dnaplot.hpp index 295e6790..af70332a 100644 --- a/dynadjust/dynadjust/dnaplot/dnaplot.hpp +++ b/dynadjust/dynadjust/dnaplot/dnaplot.hpp @@ -83,11 +83,6 @@ #include #include -using namespace std; -using namespace boost; -using namespace boost::posix_time; -using namespace boost::filesystem; - using namespace dynadjust::measurements; using namespace dynadjust::epsg; using namespace dynadjust::exception; @@ -140,7 +135,7 @@ class dna_plot { // Gnuplot plotting methods void PlotGnuplotDatFileStns(); void PlotGnuplotDatFileMsrs(); - void PrintGnuplotCommandFile(const string& gnuplot_cmd_file, const plotGraphMode& graphMode); + void PrintGnuplotCommandFile(const std::string& gnuplot_cmd_file, const plotGraphMode& graphMode); void PrintGnuplotCommandFileStns(const UINT32& fontSize); void PrintGnuplotCommandFileMsrs(const UINT32& fontSize); @@ -179,11 +174,11 @@ class dna_plot { void FormGMTDataFileNames(const UINT32& block=0); void PrintGMTParameters(); - void PrintStationDataFile(ostream& os, it_vstn_t_const _it_stn); + void PrintStationDataFile(std::ostream& os, it_vstn_t_const _it_stn); void PrintStationsDataFile(); void PrintStationsDataFileBlock(const UINT32& block); - void PrintStationLabel(ostream& os, it_vstn_t_const _it_stn); + void PrintStationLabel(std::ostream& os, it_vstn_t_const _it_stn); void PrintStationLabels(); void PrintStationLabelsBlock(const UINT32& block); @@ -199,21 +194,21 @@ class dna_plot { void PrintMeasurementsDatFileBlock(const UINT32& block, char msrType, std::ofstream* msr_file_stream); //void PrintGMTPlotCoords(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, ostream& osStn, ostream& osStn2, ostream& osMsr); - //void PrintGMTPlotCoords_D(vdnaStnPtr* vStations, vector* vDirections, ostream& osMsr); - //void PrintGMTPlotCoords_GX(vdnaStnPtr* vStations, vector* vBaselines, ostream& osMsr); + //void PrintGMTPlotCoords_D(vdnaStnPtr* vStations, std::vector* vDirections, ostream& osMsr); + //void PrintGMTPlotCoords_GX(vdnaStnPtr* vStations, std::vector* vBaselines, ostream& osMsr); void CalculateLimitsFromStation(); void CalculateLimitsFromPoint(); void DetermineBoundingBox(); - void SignalExceptionPlot(const string& msg, const int& line_no, const char *streamType, ...); + void SignalExceptionPlot(const std::string& msg, const int& line_no, const char *streamType, ...); void ReduceStationCoordinates(station_t* stationRecord); void NormaliseScale(double& scale); void NormaliseScaleBar(double& scale_bar_width); void NormaliseGraticule(double& graticule_width, UINT32& graticule_width_precision); - void SelectCoastlineResolution(const double& dDimension, string& coastResolution, plot_settings* plotCriteria); + void SelectCoastlineResolution(const double& dDimension, std::string& coastResolution, plot_settings* plotCriteria); bool WithinLimits(const double& latitude, const double& longitude); @@ -225,19 +220,19 @@ class dna_plot { std::ofstream gnuplotbat_file_; MsrTally parsemsrTally_; // total network tally - vector v_msr_tally_; // per block tally + std::vector v_msr_tally_; // per block tally vstn_t bstBinaryRecords_; vmsr_t bmsBinaryRecords_; binary_file_meta_t bst_meta_; binary_file_meta_t bms_meta_; - string output_folder_; - string network_name_; + std::string output_folder_; + std::string network_name_; v_string_uint32_pair stnsMap_; // Station Name Map sorted on name (string) _PLOT_STATUS_ plotStatus_; project_settings projectSettings_; project_settings* pprj_; - string reference_frame_; + std::string reference_frame_; double lowerDeg_; double leftDeg_; @@ -267,8 +262,8 @@ class dna_plot { double default_paper_width_; double default_paper_height_; - string seg_stn_graph_file_; - string seg_msr_graph_file_; + std::string seg_stn_graph_file_; + std::string seg_msr_graph_file_; vstring v_isl_pts_file_; vstring v_isl_const_file_; @@ -311,34 +306,34 @@ class dna_plot { vUINT32 v_measurementCount_; // number of raw measurements and constrained stations vUINT32 v_unknownsCount_; // number of all stations (constrained and free) - string _APP_GMTSET_; - string _APP_PSCOAST_; - string _APP_PSCONVERT_; - string _APP_PSTEXT_; - string _APP_PSVELO_; - string _APP_PSXY_; - string _APP_PSLEGEND_; - string _PDF_AGGREGATE_; - string _CMD_EXT_; - string _ECHO_CMD_; - string _LEGEND_ECHO_; - string _LEGEND_CMD_1_; - string _LEGEND_CMD_2_; - - string _COMMENT_PREFIX_; - - string _CMD_HEADER_; - string _DELETE_CMD_; - string _CHMOD_CMD_; - string _COPY_CMD_; - string _MOVE_CMD_; - string _NULL_OUTPUT_; - string _MAKEDIR_CMD_; - string _RMDIR_CMD_; - string _MAKEENV_CMD_; - string _MAKETEMP_CMD_; - string _ENV_GMT_TMP_DIR_; - string _GMT_TMP_DIR_; + std::string _APP_GMTSET_; + std::string _APP_PSCOAST_; + std::string _APP_PSCONVERT_; + std::string _APP_PSTEXT_; + std::string _APP_PSVELO_; + std::string _APP_PSXY_; + std::string _APP_PSLEGEND_; + std::string _PDF_AGGREGATE_; + std::string _CMD_EXT_; + std::string _ECHO_CMD_; + std::string _LEGEND_ECHO_; + std::string _LEGEND_CMD_1_; + std::string _LEGEND_CMD_2_; + + std::string _COMMENT_PREFIX_; + + std::string _CMD_HEADER_; + std::string _DELETE_CMD_; + std::string _CHMOD_CMD_; + std::string _COPY_CMD_; + std::string _MOVE_CMD_; + std::string _NULL_OUTPUT_; + std::string _MAKEDIR_CMD_; + std::string _RMDIR_CMD_; + std::string _MAKEENV_CMD_; + std::string _MAKETEMP_CMD_; + std::string _ENV_GMT_TMP_DIR_; + std::string _GMT_TMP_DIR_; double dWidth_; double dHeight_; @@ -357,7 +352,7 @@ class dna_plot { double circle_radius_2_; double circle_line_width_; - string coastResolution_; + std::string coastResolution_; }; diff --git a/dynadjust/dynadjust/dnaplotwrapper/dnaplotwrapper.cpp b/dynadjust/dynadjust/dnaplotwrapper/dnaplotwrapper.cpp index b520b8b8..4300d983 100644 --- a/dynadjust/dynadjust/dnaplotwrapper/dnaplotwrapper.cpp +++ b/dynadjust/dynadjust/dnaplotwrapper/dnaplotwrapper.cpp @@ -24,7 +24,7 @@ void ProcessGnuPlot(dna_plot* plotDynaML, project_settings& p, plotGraphMode mode) { - string str_mode; + std::string str_mode; switch (mode) { case StationsMode: @@ -37,34 +37,34 @@ void ProcessGnuPlot(dna_plot* plotDynaML, project_settings& p, plotGraphMode mod if (p.g.verbose > 0 || p.g.quiet != 1) { - cout << "+ Preparing the " << str_mode << " histogram via gnuplot... "; - cout.flush(); + std::cout << "+ Preparing the " << str_mode << " histogram via gnuplot... "; + std::cout.flush(); } plotDynaML->CreategnuplotGraphEnvironment(&p, mode); if (p.g.verbose > 0 || p.g.quiet != 1) { - cout << "done." << endl << endl; + std::cout << "done." << std::endl << std::endl; - cout << setw(PRINT_VAR_PAD) << "+ Plot details:" << endl; - cout << setw(PRINT_VAR_PAD) << " PDF file name:" << p.p._pdf_file_name << endl; + std::cout << std::setw(PRINT_VAR_PAD) << "+ Plot details:" << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << " PDF file name:" << p.p._pdf_file_name << std::endl; if (p.p._supress_pdf_creation || p.p._keep_gen_files) { #if defined(_WIN32) || defined(__WIN32__) - cout << setw(PRINT_VAR_PAD) << " Batch file:" << p.p._gnuplot_cmd_file << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Batch file:" << p.p._gnuplot_cmd_file << std::endl; #elif defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) - cout << setw(PRINT_VAR_PAD) << " Shell script:" << p.p._gnuplot_cmd_file << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Shell script:" << p.p._gnuplot_cmd_file << std::endl; #endif } - cout << setw(PRINT_VAR_PAD) << " Block threshold:" << plotDynaML->blockThreshold() << endl; - cout << setw(PRINT_VAR_PAD) << " Min inner stns:" << plotDynaML->minInnerStns() << endl; - cout << setw(PRINT_VAR_PAD) << " Block count:" << plotDynaML->blockCount() << endl; - cout << setw(PRINT_VAR_PAD) << " Station count:" << plotDynaML->stationCount() << endl; - cout << setw(PRINT_VAR_PAD) << " Measurement count:" << plotDynaML->measurementCount() << endl; - cout << setw(PRINT_VAR_PAD) << " Measurement categories:" << plotDynaML->measurementCategories() << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Block threshold:" << plotDynaML->blockThreshold() << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Min inner stns:" << plotDynaML->minInnerStns() << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Block count:" << plotDynaML->blockCount() << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Station count:" << plotDynaML->stationCount() << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Measurement count:" << plotDynaML->measurementCount() << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Measurement categories:" << plotDynaML->measurementCategories() << std::endl; - cout << endl; + std::cout << std::endl; } @@ -74,22 +74,22 @@ void ProcessGnuPlot(dna_plot* plotDynaML, project_settings& p, plotGraphMode mod { if (p.g.verbose > 0 || p.g.quiet != 1) { - cout << "+ The input data files and " << + std::cout << "+ The input data files and " << #if defined(_WIN32) || defined(__WIN32__) "batch file"; #elif defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) "shell script"; #endif - cout << " to create the final PDF histogram" << endl << - " via gnuplot have been generated." << endl; - cout << "+ To configure the histogram's font sizes, colours, scale, annotations, etc.," << endl << + std::cout << " to create the final PDF histogram" << std::endl << + " via gnuplot have been generated." << std::endl; + std::cout << "+ To configure the histogram's font sizes, colours, scale, annotations, etc.," << std::endl << " edit the " << #if defined(_WIN32) || defined(__WIN32__) "batch file"; #elif defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) "shell script"; #endif - cout << " directly and execute as normal." << endl << endl; + std::cout << " directly and execute as normal." << std::endl << std::endl; } return; @@ -97,8 +97,8 @@ void ProcessGnuPlot(dna_plot* plotDynaML, project_settings& p, plotGraphMode mod if (p.g.verbose > 0 || p.g.quiet != 1) { - cout << "+ Creating the PDF... "; - cout.flush(); + std::cout << "+ Creating the PDF... "; + std::cout.flush(); } // Invoke gnuplot to create the PDF plot. @@ -108,19 +108,19 @@ void ProcessGnuPlot(dna_plot* plotDynaML, project_settings& p, plotGraphMode mod if (p.g.verbose > 0 || p.g.quiet != 1) { - cout << "done." << endl << endl; - cout << "+ Open " << p.p._pdf_file_name << " to view the PDF " << - str_mode << " histogram." << endl << endl; - cout.flush(); + std::cout << "done." << std::endl << std::endl; + std::cout << "+ Open " << p.p._pdf_file_name << " to view the PDF " << + str_mode << " histogram." << std::endl << std::endl; + std::cout.flush(); } } -void ProcessGMTPlot(dna_plot* plotDynaML, project_settings& p, string& measurement_types) +void ProcessGMTPlot(dna_plot* plotDynaML, project_settings& p, std::string& measurement_types) { if (p.g.verbose > 0 || p.g.quiet != 1) { - cout << "+ Preparing shell script and data files in GMT format... "; - cout.flush(); + std::cout << "+ Preparing shell script and data files in GMT format... "; + std::cout.flush(); } p.p._gmt_params.clear(); @@ -184,72 +184,72 @@ void ProcessGMTPlot(dna_plot* plotDynaML, project_settings& p, string& measureme plotDynaML->CreateGMTPlotEnvironment(&p); if (p.g.verbose > 0 || p.g.quiet != 1) { - cout << "done." << endl << endl; + std::cout << "done." << std::endl << std::endl; - cout << setw(PRINT_VAR_PAD) << "+ Plot details:" << endl; - cout << setw(PRINT_VAR_PAD) << " PDF file name:" << p.p._pdf_file_name << endl; + std::cout << std::setw(PRINT_VAR_PAD) << "+ Plot details:" << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << " PDF file name:" << p.p._pdf_file_name << std::endl; if (p.p._export_png) - cout << setw(PRINT_VAR_PAD) << " Export to png:" << "Yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Export to png:" << "Yes" << std::endl; if (p.p._supress_pdf_creation || p.p._keep_gen_files) { #if defined(_WIN32) || defined(__WIN32__) if (p.p._plot_phased_blocks && p.p._plot_block_number < 1) - cout << setw(PRINT_VAR_PAD) << " Batch files:" << p.p._gmt_cmd_file << "..." << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Batch files:" << p.p._gmt_cmd_file << "..." << std::endl; else - cout << setw(PRINT_VAR_PAD) << " Batch file:" << p.p._gmt_cmd_file << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Batch file:" << p.p._gmt_cmd_file << std::endl; #elif defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) if (p.p._plot_phased_blocks && p.p._plot_block_number < 1) - cout << setw(PRINT_VAR_PAD) << " Shell scripts:" << p.p._gmt_cmd_file << "..." << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Shell scripts:" << p.p._gmt_cmd_file << "..." << std::endl; else - cout << setw(PRINT_VAR_PAD) << " Shell script:" << p.p._gmt_cmd_file << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Shell script:" << p.p._gmt_cmd_file << std::endl; #endif } if (!measurement_types.empty()) - cout << setw(PRINT_VAR_PAD) << left << " Measurement types: " << measurement_types << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Measurement types: " << measurement_types << std::endl; if (p.p._plot_station_labels) - cout << setw(PRINT_VAR_PAD) << " Label stations:" << "Yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Label stations:" << "Yes" << std::endl; if (p.p._plot_alt_name) - cout << setw(PRINT_VAR_PAD) << " Use alternate name:" << "Yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Use alternate name:" << "Yes" << std::endl; if (p.p._plot_station_constraints) - cout << setw(PRINT_VAR_PAD) << " Label constraints:" << "Yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Label constraints:" << "Yes" << std::endl; if (p.p._plot_correction_arrows) - cout << setw(PRINT_VAR_PAD) << " Plot correction arrows:" << "Yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Plot correction arrows:" << "Yes" << std::endl; if (p.p._plot_correction_labels) - cout << setw(PRINT_VAR_PAD) << " Label corrections:" << "Yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Label corrections:" << "Yes" << std::endl; if (p.p._plot_error_ellipses) - cout << setw(PRINT_VAR_PAD) << " Plot error ellipses:" << "Yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Plot error ellipses:" << "Yes" << std::endl; if (p.p._plot_positional_uncertainty) - cout << setw(PRINT_VAR_PAD) << " Plot positional uncertainty:" << "Yes" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Plot positional uncertainty:" << "Yes" << std::endl; if (!are_floats_equal(p.p._correction_scale, 1.)) - cout << setw(PRINT_VAR_PAD) << left << " Scale correction arrows: " << fixed << setprecision(3) << p.p._correction_scale << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Scale correction arrows: " << std::fixed << std::setprecision(3) << p.p._correction_scale << std::endl; if (!are_floats_equal(p.p._pu_ellipse_scale, 1.)) - cout << setw(PRINT_VAR_PAD) << left << " Scale uncertainties/ellipses: " << fixed << setprecision(3) << p.p._pu_ellipse_scale << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Scale uncertainties/ellipses: " << std::fixed << std::setprecision(3) << p.p._pu_ellipse_scale << std::endl; if (!p.p._bounding_box.empty()) - cout << setw(PRINT_VAR_PAD) << left << " Bounding box: " << p.p._bounding_box << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Bounding box: " << p.p._bounding_box << std::endl; else { if (!p.p._plot_station_centre.empty()) - cout << setw(PRINT_VAR_PAD) << " Centre on Station:" << p.p._plot_station_centre << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Centre on Station:" << p.p._plot_station_centre << std::endl; else { if (!are_floats_equal(p.p._plot_centre_latitude, -999.)) - cout << setw(PRINT_VAR_PAD) << " Centre latitude:" << fixed << setprecision(9) << FormatDmsString(DegtoDms(p.p._plot_centre_latitude), 4, true, true) << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Centre latitude:" << std::fixed << std::setprecision(9) << FormatDmsString(DegtoDms(p.p._plot_centre_latitude), 4, true, true) << std::endl; if (!are_floats_equal(p.p._plot_centre_longitude, -999.)) - cout << setw(PRINT_VAR_PAD) << " Centre longitude:" << fixed << setprecision(9) << FormatDmsString(DegtoDms(p.p._plot_centre_longitude), 4, true, true) << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Centre longitude:" << std::fixed << std::setprecision(9) << FormatDmsString(DegtoDms(p.p._plot_centre_longitude), 4, true, true) << std::endl; } if (!are_floats_equal(p.p._plot_area_radius, 5000.)) - cout << setw(PRINT_VAR_PAD) << " Area radius:" << fixed << setprecision(2) << p.p._plot_area_radius << " metres" << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Area radius:" << std::fixed << std::setprecision(2) << p.p._plot_area_radius << " metres" << std::endl; } - cout << setw(PRINT_VAR_PAD) << " Map projection:" << projectionTypes[p.p._projection] << endl; - cout << setw(PRINT_VAR_PAD) << " Ground width:" << fixed << setprecision(4) << p.p._ground_width / 1000. << " kilometres" << endl; - cout << setw(PRINT_VAR_PAD) << " Page width:" << fixed << setprecision(2) << p.p._page_width << " centimetres" << endl; - cout << setw(PRINT_VAR_PAD) << " Coastline resolution:" << coastResolutionTypes[p.p._coasline_resolution] << endl; - cout << setw(PRINT_VAR_PAD) << " Scale:" << "1:" << fixed << setprecision(0) << p.p._plot_scale << endl; - cout << setw(PRINT_VAR_PAD) << " Label font size:" << fixed << setprecision(0) << p.p._label_font_size << endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Map projection:" << projectionTypes[p.p._projection] << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Ground width:" << std::fixed << std::setprecision(4) << p.p._ground_width / 1000. << " kilometres" << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Page width:" << std::fixed << std::setprecision(2) << p.p._page_width << " centimetres" << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Coastline resolution:" << coastResolutionTypes[p.p._coasline_resolution] << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Scale:" << "1:" << std::fixed << std::setprecision(0) << p.p._plot_scale << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << " Label font size:" << std::fixed << std::setprecision(0) << p.p._label_font_size << std::endl; - cout << endl; + std::cout << std::endl; } // Does the user not want to create the PDf plots? @@ -257,17 +257,17 @@ void ProcessGMTPlot(dna_plot* plotDynaML, project_settings& p, string& measureme { if (p.g.verbose > 0 || p.g.quiet != 1) { - cout << "+ The input data files and " << + std::cout << "+ The input data files and " << #if defined(_WIN32) || defined(__WIN32__) "batch file"; #elif defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) "shell script"; #endif if (p.p._plot_phased_blocks && p.p._plot_block_number < 1) - cout << "s"; + std::cout << "s"; - cout << " to create the final PDF plot" << endl << " via GMT have been generated." << endl; - cout << "+ To configure the plot's font sizes, colours, scale, annotations, etc.," << endl << + std::cout << " to create the final PDF plot" << std::endl << " via GMT have been generated." << std::endl; + std::cout << "+ To configure the plot's font sizes, colours, scale, annotations, etc.," << std::endl << " edit the " << #if defined(_WIN32) || defined(__WIN32__) "batch file"; @@ -275,8 +275,8 @@ void ProcessGMTPlot(dna_plot* plotDynaML, project_settings& p, string& measureme "shell script"; #endif if (p.p._plot_phased_blocks && p.p._plot_block_number < 1) - cout << "s"; - cout << " directly and execute as normal." << endl << endl; + std::cout << "s"; + std::cout << " directly and execute as normal." << std::endl << std::endl; } return; @@ -285,8 +285,8 @@ void ProcessGMTPlot(dna_plot* plotDynaML, project_settings& p, string& measureme // create the PDF image.. if (p.g.verbose > 0 || p.g.quiet != 1) { - cout << "+ Generating PDF via GMT... "; - cout.flush(); + std::cout << "+ Generating PDF via GMT... "; + std::cout.flush(); } // Invoke concurrent GMT process to create the PDF plot. @@ -299,9 +299,9 @@ void ProcessGMTPlot(dna_plot* plotDynaML, project_settings& p, string& measureme if (p.g.verbose > 0 || p.g.quiet != 1) { - cout << "done." << endl << endl << - "+ Open " << p.p._pdf_file_name << " to view the final PDF plot." << endl << endl; - cout.flush(); + std::cout << "done." << std::endl << std::endl << + "+ Open " << p.p._pdf_file_name << " to view the final PDF plot." << std::endl << std::endl; + std::cout.flush(); } } @@ -309,52 +309,52 @@ void ProcessGMTPlot(dna_plot* plotDynaML, project_settings& p, string& measureme int main(int argc, char* argv[]) { // create banner message - string cmd_line_banner, tmp; + std::string cmd_line_banner, tmp; fileproc_help_header(&cmd_line_banner); - string stnfilename, msrfilename, measurement_types; + std::string stnfilename, msrfilename, measurement_types; project_settings p; - variables_map vm; - positional_options_description positional_options; + boost::program_options::variables_map vm; + boost::program_options::positional_options_description positional_options; - options_description standard_options("+ " + string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description config_options("+ " + string(PLOT_MODULE_CONFIG), PROGRAM_OPTIONS_LINE_LENGTH); - options_description titleblock_options("+ " + string(PLOT_MODULE_TITLEBLOCK), PROGRAM_OPTIONS_LINE_LENGTH); - options_description map_options("+ " + string(PLOT_MODULE_MAP), PROGRAM_OPTIONS_LINE_LENGTH); - options_description generic_options("+ " + string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description standard_options("+ " + std::string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description config_options("+ " + std::string(PLOT_MODULE_CONFIG), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description titleblock_options("+ " + std::string(PLOT_MODULE_TITLEBLOCK), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description map_options("+ " + std::string(PLOT_MODULE_MAP), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description generic_options("+ " + std::string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); tmp = "+ "; tmp.append(__BINARY_NAME__).append(" usage: ").append(__BINARY_NAME__).append(" ").append(NETWORK_NAME).append(" [options]"); - options_description allowable_options(tmp, PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description allowable_options(tmp, PROGRAM_OPTIONS_LINE_LENGTH); try { // Declare a group of options that will be // allowed only on command line generic_options.add_options() - (VERBOSE, value(&p.g.verbose), - string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information\n 3: Debug level information").c_str()) + (VERBOSE, boost::program_options::value(&p.g.verbose), + std::string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information\n 3: Debug level information").c_str()) (QUIET, - string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) + std::string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) (VERSION_V, "Display the current program version") (HELP_H, "Show this help message") - (HELP_MODULE_H, value(), + (HELP_MODULE_H, boost::program_options::value(), "Provide help for a specific help category.") ; standard_options.add_options() - (PROJECT_FILE_P, value(&p.g.project_file), + (PROJECT_FILE_P, boost::program_options::value(&p.g.project_file), "Project file name. Full path to project file. If none specified, a new file is created using input-folder and network-name.") - (NETWORK_NAME_N, value(&p.g.network_name), + (NETWORK_NAME_N, boost::program_options::value(&p.g.network_name), "Network name. User defined name for all output files. Default is \"network#\".") - (INPUT_FOLDER_I, value(&p.g.input_folder), + (INPUT_FOLDER_I, boost::program_options::value(&p.g.input_folder), "Path containing all input files") - (OUTPUT_FOLDER_O, value(&p.g.output_folder), // default is ./, + (OUTPUT_FOLDER_O, boost::program_options::value(&p.g.output_folder), // default is ./, "Path for all output files") - (BIN_STN_FILE, value(&p.i.bst_file), + (BIN_STN_FILE, boost::program_options::value(&p.i.bst_file), "Binary station file name. Overrides network name.") - (BIN_MSR_FILE, value(&p.i.bms_file), + (BIN_MSR_FILE, boost::program_options::value(&p.i.bms_file), "Binary measurement file name. Overrides network name.") ; @@ -362,15 +362,15 @@ int main(int argc, char* argv[]) // allowed both on command line and in // config file config_options.add_options() - (PLOT_MSRS, value(&measurement_types), + (PLOT_MSRS, boost::program_options::value(&measurement_types), "Plot the specified measurement types. arg is a non-delimited string of measurement types (eg \"GXY\").") (PLOT_MSRS_IGNORED, "Plot ignored measurements.") (PLOT_BLOCKS, "Plot the blocks of a segmented network in individual sheets. Requires a corresponding segmentation file.") - (SEG_FILE, value(&p.s.seg_file), + (SEG_FILE, boost::program_options::value(&p.s.seg_file), "Network segmentation file. Filename overrides network name.") - (BLOCK_NUMBER, value(&p.p._plot_block_number), + (BLOCK_NUMBER, boost::program_options::value(&p.p._plot_block_number), "When plotting phased adjustments, plot this block only. Zero (default) plots all blocks.") (PLOT_STN_LABELS, "Plot the station labels.") @@ -390,24 +390,24 @@ int main(int argc, char* argv[]) "Plot error ellipses.") (PLOT_POSITIONAL_UNCERTAINTY, "Plot positional uncertainty.") - (CORRECTION_SCALE, value(&p.p._correction_scale), + (CORRECTION_SCALE, boost::program_options::value(&p.p._correction_scale), "The amount by which to scale the size of the correction arrows.") - (PU_ELLIPSE_SCALE, value(&p.p._pu_ellipse_scale), + (PU_ELLIPSE_SCALE, boost::program_options::value(&p.p._pu_ellipse_scale), "The amount by which to scale the size of error ellipses and positional uncertainty cirlces.") - (BOUNDING_BOX, value(&p.p._bounding_box), + (BOUNDING_BOX, boost::program_options::value(&p.p._bounding_box), "Plot stations and measurements within bounding box. arg is a comma delimited string \"lat1,lon1,lat2,lon2\" (in dd.mmss) defining the upper-left and lower-right limits.") - (PLOT_CENTRE_LAT, value(&p.p._plot_centre_latitude), + (PLOT_CENTRE_LAT, boost::program_options::value(&p.p._plot_centre_latitude), "Centre the plot according to this latitude. Format: dd.mmsssss") - (PLOT_CENTRE_LON, value(&p.p._plot_centre_longitude), + (PLOT_CENTRE_LON, boost::program_options::value(&p.p._plot_centre_longitude), "Centre the plot according to this longitude. Format: ddd.mmsssss") - (PLOT_CENTRE_STATION, value(&p.p._plot_station_centre), - (string("The station name upon which to centre the plot. The plot area is circumscribed by ")+ - string(PLOT_AREA_RADIUS)+string(".")).c_str()) - (PLOT_AREA_RADIUS, value(&p.p._plot_area_radius), - (string("The radius (in metres) of an area to bound the plot. Default is ")+ - StringFromT(p.p._plot_area_radius)+string("m")).c_str()) - (TECTONIC_PLATE_BDY_FILE, value(&p.r.tpb_file), - string("Plot global tectonic plate boundaries.").c_str()) + (PLOT_CENTRE_STATION, boost::program_options::value(&p.p._plot_station_centre), + (std::string("The station name upon which to centre the plot. The plot area is circumscribed by ")+ + std::string(PLOT_AREA_RADIUS)+std::string(".")).c_str()) + (PLOT_AREA_RADIUS, boost::program_options::value(&p.p._plot_area_radius), + (std::string("The radius (in metres) of an area to bound the plot. Default is ")+ + StringFromT(p.p._plot_area_radius)+std::string("m")).c_str()) + (TECTONIC_PLATE_BDY_FILE, boost::program_options::value(&p.r.tpb_file), + std::string("Plot global tectonic plate boundaries.").c_str()) (GRAPH_SEGMENTATION_STNS, "Plot a graph of the block stations resulting from network segmentation.") (GRAPH_SEGMENTATION_MSRS, @@ -419,14 +419,14 @@ int main(int argc, char* argv[]) titleblock_options.add_options() (OMIT_TITLE_BLOCK, "Do not print a title block and measurements legend.") - (TITLEBLOCK_TITLE, value(&p.p._title), + (TITLEBLOCK_TITLE, boost::program_options::value(&p.p._title), "The title of the plot. Supply quotation marks if spaces are required. Default is the network name.") - (TITLEBLOCK_NAME, value(&p.p._title_block_name), - (string("The name of the organisational unit name. Default is ")+ - string(p.p._title_block_name)+string(".")).c_str()) - (TITLEBLOCK_SUBNAME, value(&p.p._title_block_subname), - (string("The name of the organisational sub-unit unit name. Default is ")+ - string(p.p._title_block_subname)+string(".")).c_str()) + (TITLEBLOCK_NAME, boost::program_options::value(&p.p._title_block_name), + (std::string("The name of the organisational unit name. Default is ")+ + std::string(p.p._title_block_name)+std::string(".")).c_str()) + (TITLEBLOCK_SUBNAME, boost::program_options::value(&p.p._title_block_subname), + (std::string("The name of the organisational sub-unit unit name. Default is ")+ + std::string(p.p._title_block_subname)+std::string(".")).c_str()) ; // mapping options @@ -440,8 +440,8 @@ int main(int argc, char* argv[]) // 6 Lambert conformal // 7 General stereographic // 8 Robinson Projection - (PROJECTION, value(&p.p._projection), - string("Map projection type.\n"). + (PROJECTION, boost::program_options::value(&p.p._projection), + std::string("Map projection type.\n"). append(" 0: Let ").append(__BINARY_NAME__).append(" choose best projection (default)\n"). append(" 1: ").append(projectionTypes[1]).append("\n"). append(" 2: ").append(projectionTypes[2]).append("\n"). @@ -451,12 +451,12 @@ int main(int argc, char* argv[]) append(" 6: ").append(projectionTypes[6]).append("\n"). append(" 7: ").append(projectionTypes[7]).append("\n"). append(" 8: ").append(projectionTypes[8]).c_str()) - (LABEL_FONT_SIZE, value(&p.p._label_font_size), - (string("Label font size for station names and constraints. Default is ")+ - StringFromT(p.p._label_font_size)+string(".")).c_str()) - (MSR_LINE_WIDTH, value(&p.p._msr_line_width), - (string("Measurement line width. Default is ")+ - StringFromT(p.p._msr_line_width)+string(".")).c_str()) + (LABEL_FONT_SIZE, boost::program_options::value(&p.p._label_font_size), + (std::string("Label font size for station names and constraints. Default is ")+ + StringFromT(p.p._label_font_size)+std::string(".")).c_str()) + (MSR_LINE_WIDTH, boost::program_options::value(&p.p._msr_line_width), + (std::string("Measurement line width. Default is ")+ + StringFromT(p.p._msr_line_width)+std::string(".")).c_str()) (DONT_CREATE_PDF, "Don't create a pdf, just the command files.") (EXPORT_PNG, @@ -468,65 +468,65 @@ int main(int argc, char* argv[]) // add "positional options" to handle command line tokens which have no option name positional_options.add(NETWORK_NAME, -1); - command_line_parser parser(argc, argv); + boost::program_options::command_line_parser parser(argc, argv); store(parser.options(allowable_options).positional(positional_options).run(), vm); notify(vm); } catch (const std::exception& e) { - cout << "- Error: " << e.what() << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << "- Error: " << e.what() << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } catch (...) { - cout << "+ Exception of unknown type!\n"; + std::cout << "+ Exception of unknown type!\n"; return EXIT_FAILURE; } if (argc < 2) { - cout << endl << "- Nothing to do - no options provided. " << endl << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << std::endl << "- Nothing to do - no options provided. " << std::endl << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } if (vm.count(VERSION)) { - cout << cmd_line_banner << endl; + std::cout << cmd_line_banner << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP)) { - cout << cmd_line_banner << allowable_options << endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP_MODULE)) { - cout << cmd_line_banner; - string original_text = vm[HELP_MODULE].as(); - string help_text = str_upper(original_text); + std::cout << cmd_line_banner; + std::string original_text = vm[HELP_MODULE].as(); + std::string help_text = str_upper(original_text); - if (str_upper(ALL_MODULE_STDOPT).find(help_text) != string::npos) { - cout << standard_options << endl; + if (str_upper(ALL_MODULE_STDOPT).find(help_text) != std::string::npos) { + std::cout << standard_options << std::endl; } - else if (str_upper(PLOT_MODULE_CONFIG).find(help_text) != string::npos) { - cout << config_options << endl; + else if (str_upper(PLOT_MODULE_CONFIG).find(help_text) != std::string::npos) { + std::cout << config_options << std::endl; } - else if (str_upper(PLOT_MODULE_TITLEBLOCK).find(help_text) != string::npos) { - cout << titleblock_options << endl; + else if (str_upper(PLOT_MODULE_TITLEBLOCK).find(help_text) != std::string::npos) { + std::cout << titleblock_options << std::endl; } - else if (str_upper(PLOT_MODULE_MAP).find(help_text) != string::npos) { - cout << map_options << endl; + else if (str_upper(PLOT_MODULE_MAP).find(help_text) != std::string::npos) { + std::cout << map_options << std::endl; } - else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != string::npos) { - cout << generic_options << endl; + else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != std::string::npos) { + std::cout << generic_options << std::endl; } else { - cout << endl << "- Error: Help module '" << - original_text << "' is not in the list of options." << endl; + std::cout << std::endl << "- Error: Help module '" << + original_text << "' is not in the list of options." << std::endl; return EXIT_FAILURE; } @@ -536,11 +536,11 @@ int main(int argc, char* argv[]) if (vm.count(QUIET)) p.g.quiet = 1; else - cout << endl << cmd_line_banner; + std::cout << std::endl << cmd_line_banner; if (!vm.count(NETWORK_NAME)) { - cout << endl << "- Nothing to do - no network name specified. " << endl << endl; + std::cout << std::endl << "- Nothing to do - no network name specified. " << std::endl << std::endl; return EXIT_FAILURE; } @@ -638,84 +638,84 @@ int main(int argc, char* argv[]) ////////////////////////////////////////////////////// // Form paths size_t lastindex; - if ((lastindex = p.g.output_folder.find_last_of("/")) != string::npos) + if ((lastindex = p.g.output_folder.find_last_of("/")) != std::string::npos) p.g.output_folder.pop_back(); - if ((lastindex = p.g.output_folder.find_last_of("\\")) != string::npos) + if ((lastindex = p.g.output_folder.find_last_of("\\")) != std::string::npos) p.g.output_folder.pop_back(); - if (equals(p.g.output_folder.substr(0, 2), "./")) + if (boost::equals(p.g.output_folder.substr(0, 2), "./")) p.g.output_folder = p.g.output_folder.substr(2); - if (equals(p.g.output_folder.substr(0, 2), ".\\")) + if (boost::equals(p.g.output_folder.substr(0, 2), ".\\")) p.g.output_folder = p.g.output_folder.substr(2); // binary station file if (!p.i.bst_file.empty()) - p.i.bst_file = formPath(p.g.input_folder, p.i.bst_file); + p.i.bst_file = formPath(p.g.input_folder, p.i.bst_file); else - p.i.bst_file = formPath(p.g.input_folder, p.g.network_name, "bst"); + p.i.bst_file = formPath(p.g.input_folder, p.g.network_name, "bst"); // binary measurement file if (!p.i.bms_file.empty()) - p.i.bms_file = formPath(p.g.input_folder, p.i.bms_file); + p.i.bms_file = formPath(p.g.input_folder, p.i.bms_file); else - p.i.bms_file = formPath(p.g.input_folder, p.g.network_name, "bms"); + p.i.bms_file = formPath(p.g.input_folder, p.g.network_name, "bms"); // station map file - p.i.map_file = formPath(p.g.input_folder, p.g.network_name, "map"); + p.i.map_file = formPath(p.g.input_folder, p.g.network_name, "map"); // segmentation file if (p.p._plot_phased_blocks) { if (vm.count(SEG_FILE)) - p.s.seg_file = formPath(p.g.input_folder, p.s.seg_file); + p.s.seg_file = formPath(p.g.input_folder, p.s.seg_file); else - p.s.seg_file = formPath(p.g.input_folder, p.g.network_name, "seg"); + p.s.seg_file = formPath(p.g.input_folder, p.g.network_name, "seg"); } // correction file if (p.p._plot_correction_arrows) { if (p.p._plot_phased_blocks) - p.o._cor_file = formPath(p.g.input_folder, p.g.network_name, "phased.cor"); + p.o._cor_file = formPath(p.g.input_folder, p.g.network_name, "phased.cor"); else - p.o._cor_file = formPath(p.g.input_folder, p.g.network_name, "simult.cor"); + p.o._cor_file = formPath(p.g.input_folder, p.g.network_name, "simult.cor"); } // adjusted positional uncertainty file if (p.p._plot_error_ellipses || p.p._plot_positional_uncertainty) { if (p.p._plot_phased_blocks) - p.o._apu_file = formPath(p.g.input_folder, p.g.network_name, "phased.apu"); + p.o._apu_file = formPath(p.g.input_folder, p.g.network_name, "phased.apu"); else - p.o._apu_file = formPath(p.g.input_folder, p.g.network_name, "simult.apu"); + p.o._apu_file = formPath(p.g.input_folder, p.g.network_name, "simult.apu"); } // ////////////////////////////////////////////////////// if (p.g.quiet != 1) { - cout << endl << "+ Options:" << endl; - cout << setw(PRINT_VAR_PAD) << left << " Network name: " << p.g.network_name << endl; - cout << setw(PRINT_VAR_PAD) << left << " Input folder: " << p.g.input_folder << endl; - cout << setw(PRINT_VAR_PAD) << left << " Output folder: " << p.g.output_folder << endl; - cout << setw(PRINT_VAR_PAD) << left << " Binary station file: " << p.i.bst_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Binary measurement file: " << p.i.bms_file << endl; + std::cout << std::endl << "+ Options:" << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Network name: " << p.g.network_name << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Input folder: " << p.g.input_folder << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Output folder: " << p.g.output_folder << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Binary station file: " << p.i.bst_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Binary measurement file: " << p.i.bms_file << std::endl; if (p.p._plot_phased_blocks) - cout << setw(PRINT_VAR_PAD) << left << " Segmentation file: " << p.s.seg_file << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Segmentation file: " << p.s.seg_file << std::endl; if (p.p._plot_correction_arrows && !p.p._compute_corrections) - cout << setw(PRINT_VAR_PAD) << left << " Corrections file: " << p.o._cor_file << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Corrections file: " << p.o._cor_file << std::endl; if (p.p._plot_error_ellipses || p.p._plot_positional_uncertainty) - cout << setw(PRINT_VAR_PAD) << left << " Positional uncertainty file: " << p.o._apu_file << endl; - cout << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Positional uncertainty file: " << p.o._apu_file << std::endl; + std::cout << std::endl; } - if (!exists(p.i.bst_file) || !exists(p.i.bms_file)) + if (!boost::filesystem::exists(p.i.bst_file) || !boost::filesystem::exists(p.i.bms_file)) { - cout << endl << endl << "- Nothing to do: network"; + std::cout << std::endl << std::endl << "- Nothing to do: network"; if (!vm.count(NETWORK_NAME)) - cout << " name has not been specified, and" << endl << " "; + std::cout << " name has not been specified, and" << std::endl << " "; - cout << " files " << p.i.bst_file << " and " << p.i.bms_file << " do not exist." << endl << endl; + std::cout << " files " << p.i.bst_file << " and " << p.i.bms_file << " do not exist." << std::endl << std::endl; return EXIT_FAILURE; } @@ -723,17 +723,17 @@ int main(int argc, char* argv[]) { if (!p.p._compute_corrections) { - if (!exists(p.o._cor_file)) + if (!boost::filesystem::exists(p.o._cor_file)) { - cout << endl << endl << - "- Error: The required corrections file does not exist:" << endl; - cout << " " << p.o._cor_file << endl << endl; - cout << " Run: 'adjust " << p.g.network_name << " --" << OUTPUT_STN_COR_FILE; + std::cout << std::endl << std::endl << + "- Error: The required corrections file does not exist:" << std::endl; + std::cout << " " << p.o._cor_file << std::endl << std::endl; + std::cout << " Run: 'adjust " << p.g.network_name << " --" << OUTPUT_STN_COR_FILE; if (p.p._plot_phased_blocks) - cout << " --" << MODE_PHASED << "'"; + std::cout << " --" << MODE_PHASED << "'"; else - cout << "'"; - cout << endl << " to create a corrections file" << endl << endl; + std::cout << "'"; + std::cout << std::endl << " to create a corrections file" << std::endl << std::endl; return EXIT_FAILURE; } } @@ -741,17 +741,17 @@ int main(int argc, char* argv[]) if (p.p._plot_error_ellipses || p.p._plot_positional_uncertainty) { - if (!exists(p.o._apu_file)) + if (!boost::filesystem::exists(p.o._apu_file)) { - cout << endl << endl << - "- Error: The required positional uncertainty file does not exist:" << endl; - cout << " " << p.o._apu_file << endl << endl; - cout << " Run: '" << __adjust_app_name__ << " " << p.g.network_name << " --" << OUTPUT_POS_UNCERTAINTY; + std::cout << std::endl << std::endl << + "- Error: The required positional uncertainty file does not exist:" << std::endl; + std::cout << " " << p.o._apu_file << std::endl << std::endl; + std::cout << " Run: '" << __adjust_app_name__ << " " << p.g.network_name << " --" << OUTPUT_POS_UNCERTAINTY; if (p.p._plot_phased_blocks) - cout << " --" << MODE_PHASED << "'"; + std::cout << " --" << MODE_PHASED << "'"; else - cout << "'"; - cout << endl << " to create a positional uncertainty file" << endl << endl; + std::cout << "'"; + std::cout << std::endl << " to create a positional uncertainty file" << std::endl << std::endl; return EXIT_FAILURE; } } @@ -762,17 +762,17 @@ int main(int argc, char* argv[]) // if (p.p._plot_phased_blocks || graph_mode) { - if (!exists(p.s.seg_file)) + if (!boost::filesystem::exists(p.s.seg_file)) { - cout << endl << endl << - "- Error: The required segmentation file does not exist:" << endl; - cout << " " << p.s.seg_file << endl << endl; - cout << " Run '" << __segment_app_name__ << " " << p.g.network_name << "' to create a segmentation file" << endl << endl; + std::cout << std::endl << std::endl << + "- Error: The required segmentation file does not exist:" << std::endl; + std::cout << " " << p.s.seg_file << std::endl << std::endl; + std::cout << " Run '" << __segment_app_name__ << " " << p.g.network_name << "' to create a segmentation file" << std::endl << std::endl; return EXIT_FAILURE; } - if (last_write_time(p.s.seg_file) < last_write_time(p.i.bst_file) || - last_write_time(p.s.seg_file) < last_write_time(p.i.bms_file)) + if (boost::filesystem::last_write_time(p.s.seg_file) < boost::filesystem::last_write_time(p.i.bst_file) || + boost::filesystem::last_write_time(p.s.seg_file) < boost::filesystem::last_write_time(p.i.bms_file)) { if (!vm.count(SEG_FILE)) { @@ -783,26 +783,26 @@ int main(int argc, char* argv[]) bst.load_bst_file_meta(p.i.bst_file, bst_meta); bms.load_bms_file_meta(p.i.bms_file, bms_meta); - bool bst_meta_import(iequals(bst_meta.modifiedBy, __import_app_name__) || - iequals(bst_meta.modifiedBy, __import_dll_name__)); - bool bms_meta_import(iequals(bms_meta.modifiedBy, __import_app_name__) || - iequals(bms_meta.modifiedBy, __import_dll_name__)); + bool bst_meta_import(boost::iequals(bst_meta.modifiedBy, __import_app_name__) || + boost::iequals(bst_meta.modifiedBy, __import_dll_name__)); + bool bms_meta_import(boost::iequals(bms_meta.modifiedBy, __import_app_name__) || + boost::iequals(bms_meta.modifiedBy, __import_dll_name__)); - if ((bst_meta_import && (last_write_time(p.s.seg_file) < last_write_time(p.i.bst_file))) || - (bms_meta_import && (last_write_time(p.s.seg_file) < last_write_time(p.i.bms_file)))) + if ((bst_meta_import && (boost::filesystem::last_write_time(p.s.seg_file) < boost::filesystem::last_write_time(p.i.bst_file))) || + (bms_meta_import && (boost::filesystem::last_write_time(p.s.seg_file) < boost::filesystem::last_write_time(p.i.bms_file)))) { - cout << endl << endl << - "- Error: The binary station and measurement files have been modified since" << endl << - " the segmentation file was created:" << endl; - - time_t t_bst(last_write_time(p.i.bst_file)), t_bms(last_write_time(p.i.bms_file)); - time_t t_seg(last_write_time(p.s.seg_file)); - - cout << " " << leafStr(p.i.bst_file) << " last modified on " << ctime(&t_bst); - cout << " " << leafStr(p.i.bms_file) << " last modified on " << ctime(&t_bms) << endl; - cout << " " << leafStr(p.s.seg_file) << " created on " << ctime(&t_seg) << endl; - cout << " Run '" << __segment_app_name__ << " " << p.g.network_name << " [options]' to re-create the segmentation file, or re-run" << endl << - " the plot using the " << SEG_FILE << " option if this segmentation file must\n be used." << endl << endl; + std::cout << std::endl << std::endl << + "- Error: The binary station and measurement files have been modified since" << std::endl << + " the segmentation file was created:" << std::endl; + + time_t t_bst(boost::filesystem::last_write_time(p.i.bst_file)), t_bms(boost::filesystem::last_write_time(p.i.bms_file)); + time_t t_seg(boost::filesystem::last_write_time(p.s.seg_file)); + + std::cout << " " << leafStr(p.i.bst_file) << " last modified on " << ctime(&t_bst); + std::cout << " " << leafStr(p.i.bms_file) << " last modified on " << ctime(&t_bms) << std::endl; + std::cout << " " << leafStr(p.s.seg_file) << " created on " << ctime(&t_seg) << std::endl; + std::cout << " Run '" << __segment_app_name__ << " " << p.g.network_name << " [options]' to re-create the segmentation file, or re-run" << std::endl << + " the plot using the " << SEG_FILE << " option if this segmentation file must\n be used." << std::endl << std::endl; return EXIT_FAILURE; } } @@ -813,8 +813,8 @@ int main(int argc, char* argv[]) if (p.g.verbose > 0 || p.g.quiet != 1) { - cout << "+ Loading network files... "; - cout.flush(); + std::cout << "+ Loading network files... "; + std::cout.flush(); } dna_plot plotDynaML; @@ -822,8 +822,8 @@ int main(int argc, char* argv[]) if (p.g.verbose > 0 || p.g.quiet != 1) { - cout << "done." << endl << endl; - cout.flush(); + std::cout << "done." << std::endl << std::endl; + std::cout.flush(); } // set up colours for each measurement @@ -898,11 +898,11 @@ int main(int argc, char* argv[]) } catch (const NetPlotException& e) { - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; return EXIT_FAILURE; } - catch (const runtime_error& e) { - cout << "+ Exception of unknown type: " << e.what(); + catch (const std::runtime_error& e) { + std::cout << "+ Exception of unknown type: " << e.what(); return EXIT_FAILURE; } diff --git a/dynadjust/dynadjust/dnaplotwrapper/dnaplotwrapper.hpp b/dynadjust/dynadjust/dnaplotwrapper/dnaplotwrapper.hpp index 8140c4fb..8640f76e 100644 --- a/dynadjust/dynadjust/dnaplotwrapper/dnaplotwrapper.hpp +++ b/dynadjust/dynadjust/dnaplotwrapper/dnaplotwrapper.hpp @@ -58,13 +58,6 @@ #include -using namespace std; -using namespace boost; -using namespace boost::filesystem; -using namespace boost::posix_time; -using namespace boost::program_options; -namespace po = boost::program_options; - using namespace dynadjust::networkplot; using namespace dynadjust::exception; diff --git a/dynadjust/dynadjust/dnareftran/dnareftran.cpp b/dynadjust/dynadjust/dnareftran/dnareftran.cpp index 0f5b2ed8..c70e475d 100644 --- a/dynadjust/dynadjust/dnareftran/dnareftran.cpp +++ b/dynadjust/dynadjust/dnareftran/dnareftran.cpp @@ -59,7 +59,7 @@ dna_reftran::~dna_reftran() } -void dna_reftran::TransformBinaryFiles(const string& bstFile, const string& bmsFile, const string& newFrame, const string& newEpoch) +void dna_reftran::TransformBinaryFiles(const std::string& bstFile, const std::string& bmsFile, const std::string& newFrame, const std::string& newEpoch) { // TODO - Would it be faster to use memory mapping instead of reading // binary files into memory? Not sure. @@ -112,7 +112,7 @@ void dna_reftran::IdentifyStationPlate() it_v_string_v_doubledouble_pair _it_plates; dnaGeometryPoint point; - //cout << endl; + //cout << std::endl; size_t plateCount(global_plates_.size()); string_uint32_pair stnPlate; @@ -142,9 +142,9 @@ void dna_reftran::IdentifyStationPlate() stnPlate.second = p++; vplateMap_.push_back(stnPlate); - //if (iequals(_it_plates->first, "AU")) - // cout << endl << _it_plates->first << endl << - // boost::geometry::wkt(platePolygon) << endl; + //if (boost::iequals(_it_plates->first, "AU")) + // std::cout << std::endl << _it_plates->first << std::endl << + // boost::geometry::wkt(platePolygon) << std::endl; for (stn_it=bstBinaryRecords_.begin(); stn_it!=bstBinaryRecords_.end(); ++stn_it) { @@ -157,21 +157,21 @@ void dna_reftran::IdentifyStationPlate() if (boost::geometry::within(point, platePolygon)) { sprintf(stn_it->plate, "%s", _it_plates->first.c_str()); - //cout << "Station " << stn_it->stationName << " is on plate " << _it_plates->first << endl; + //cout << "Station " << stn_it->stationName << " is on plate " << _it_plates->first << std::endl; } } } - sort(vplateMap_.begin(), vplateMap_.end()); + std::sort(vplateMap_.begin(), vplateMap_.end()); } -void dna_reftran::LoadTectonicPlateParameters(const string& pltfileName, const string& pmmfileName) +void dna_reftran::LoadTectonicPlateParameters(const std::string& pltfileName, const std::string& pmmfileName) { dna_io_tpb tpb; - stringstream ss; - ss << "LoadTectonicPlateParameters(): An error was encountered when loading" << endl << - " tectonic plate information." << endl; + std::stringstream ss; + ss << "LoadTectonicPlateParameters(): An error was encountered when loading" << std::endl << + " tectonic plate information." << std::endl; projectSettings_.r.plate_model_option = 1; @@ -179,30 +179,30 @@ void dna_reftran::LoadTectonicPlateParameters(const string& pltfileName, const s // Load tectonic plate parameters. Throws runtime_error on failure. tpb.load_tpp_file(pmmfileName, plate_motion_eulers_); - sort(plate_motion_eulers_.begin(), plate_motion_eulers_.end()); + std::sort(plate_motion_eulers_.begin(), plate_motion_eulers_.end()); // Load tectonic plate polygons. Throws runtime_error on failure. tpb.load_tpb_file(pltfileName, global_plates_); - sort(global_plates_.begin(), global_plates_.end()); + std::sort(global_plates_.begin(), global_plates_.end()); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - string message; + std::string message; if (!tpb.validate_plate_files(global_plates_, plate_motion_eulers_, message)) { - ss << " " << message << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << " " << message << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } try { CalculateRotations(); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } @@ -217,21 +217,21 @@ void dna_reftran::CalculateRotations() if (projectSettings_.g.verbose > 1) { j = PAD + (HEADER_18 * 6) + PAD + COMMENT; - *rft_file << endl << endl << "Euler pole rotation parameters" << endl << - "-------------------------------------------" << endl << endl; - *rft_file << setw(PAD) << left << "Plate" << - setw(HEADER_18) << right << "Pole Latitude" << - setw(HEADER_18) << right << "Pole Longitude" << - setw(HEADER_18) << right << "Euler Rot. Rate" << - setw(HEADER_18) << right << "X Rot. Rate" << - setw(HEADER_18) << right << "Y Rot. Rate" << - setw(HEADER_18) << right << "Z Rot. Rate" << - setw(PAD) << " " << - setw(COMMENT) << left << "Reference" << endl; + *rft_file << std::endl << std::endl << "Euler pole rotation parameters" << std::endl << + "-------------------------------------------" << std::endl << std::endl; + *rft_file << std::setw(PAD) << std::left << "Plate" << + std::setw(HEADER_18) << std::right << "Pole Latitude" << + std::setw(HEADER_18) << std::right << "Pole Longitude" << + std::setw(HEADER_18) << std::right << "Euler Rot. Rate" << + std::setw(HEADER_18) << std::right << "X Rot. Rate" << + std::setw(HEADER_18) << std::right << "Y Rot. Rate" << + std::setw(HEADER_18) << std::right << "Z Rot. Rate" << + std::setw(PAD) << " " << + std::setw(COMMENT) << std::left << "Reference" << std::endl; UINT32 i; for (i=0; i 1) - *rft_file << setw(PAD) << left << i->plate_name << - setw(HEADER_18) << right << fixed << setprecision(4) << i->pole_latitude << - setw(HEADER_18) << right << fixed << setprecision(4) << i->pole_longitude << - setw(HEADER_18) << right << fixed << setprecision(4) << i->pole_rotation_rate << - setw(HEADER_18) << right << fixed << setprecision(6) << pmm.x_rotation << - setw(HEADER_18) << right << fixed << setprecision(6) << pmm.y_rotation << - setw(HEADER_18) << right << fixed << setprecision(6) << pmm.z_rotation << - setw(PAD) << " " << - left << i->pole_param_author << endl; + *rft_file << std::setw(PAD) << std::left << i->plate_name << + std::setw(HEADER_18) << std::right << std::fixed << std::setprecision(4) << i->pole_latitude << + std::setw(HEADER_18) << std::right << std::fixed << std::setprecision(4) << i->pole_longitude << + std::setw(HEADER_18) << std::right << std::fixed << std::setprecision(4) << i->pole_rotation_rate << + std::setw(HEADER_18) << std::right << std::fixed << std::setprecision(6) << pmm.x_rotation << + std::setw(HEADER_18) << std::right << std::fixed << std::setprecision(6) << pmm.y_rotation << + std::setw(HEADER_18) << std::right << std::fixed << std::setprecision(6) << pmm.z_rotation << + std::setw(PAD) << " " << + std::left << i->pole_param_author << std::endl; } - } // Load substitutions for WGS84 and WGS84 (...) @@ -272,61 +271,61 @@ void dna_reftran::LoadWGS84FrameSubstitutions() _frameSubstitutions.clear(); // WGS84 (transit) and WGS84 to ITRF90 - frameSubstitution.reset(new WGS84_TRANSIT_ITRF90); + frameSubstitution.reset(new WGS84_TRANSIT_ITRF90); _frameSubstitutions.push_back(frameSubstitution); - frameSubstitution.reset(new WGS84_ITRF90); + frameSubstitution.reset(new WGS84_ITRF90); _frameSubstitutions.push_back(frameSubstitution); // WGS84 (G730) and WGS84 to ITRF91 - frameSubstitution.reset(new WGS84_G730_ITRF91); + frameSubstitution.reset(new WGS84_G730_ITRF91); _frameSubstitutions.push_back(frameSubstitution); - frameSubstitution.reset(new WGS84_ITRF91); + frameSubstitution.reset(new WGS84_ITRF91); _frameSubstitutions.push_back(frameSubstitution); // WGS84 (G873) and WGS84 to ITRF94 - frameSubstitution.reset(new WGS84_G873_ITRF94); + frameSubstitution.reset(new WGS84_G873_ITRF94); _frameSubstitutions.push_back(frameSubstitution); - frameSubstitution.reset(new WGS84_ITRF94); + frameSubstitution.reset(new WGS84_ITRF94); _frameSubstitutions.push_back(frameSubstitution); // WGS84 (G1150) and WGS84 to ITRF2000 - frameSubstitution.reset(new WGS84_G1150_ITRF2000); + frameSubstitution.reset(new WGS84_G1150_ITRF2000); _frameSubstitutions.push_back(frameSubstitution); - frameSubstitution.reset(new WGS84_ITRF2000); + frameSubstitution.reset(new WGS84_ITRF2000); _frameSubstitutions.push_back(frameSubstitution); // WGS84 (G1674) and WGS84 to ITRF2008 - frameSubstitution.reset(new WGS84_G1674_ITRF2008); + frameSubstitution.reset(new WGS84_G1674_ITRF2008); _frameSubstitutions.push_back(frameSubstitution); - frameSubstitution.reset(new WGS84_ITRF2008_1); + frameSubstitution.reset(new WGS84_ITRF2008_1); _frameSubstitutions.push_back(frameSubstitution); // WGS84 (G1762) and WGS84 to ITRF2008 - frameSubstitution.reset(new WGS84_G1762_ITRF2008); + frameSubstitution.reset(new WGS84_G1762_ITRF2008); _frameSubstitutions.push_back(frameSubstitution); - frameSubstitution.reset(new WGS84_ITRF2008_2); + frameSubstitution.reset(new WGS84_ITRF2008_2); _frameSubstitutions.push_back(frameSubstitution); // WGS84 (G2139) and WGS84 to ITRF2014 - frameSubstitution.reset(new WGS84_G2139_ITRF2014); + frameSubstitution.reset(new WGS84_G2139_ITRF2014); _frameSubstitutions.push_back(frameSubstitution); - frameSubstitution.reset(new WGS84_ITRF2014); + frameSubstitution.reset(new WGS84_ITRF2014); _frameSubstitutions.push_back(frameSubstitution); - sort(_frameSubstitutions.begin(), _frameSubstitutions.end(), - CompareSubstituteOnFrameName< frame_substitutions_t, string>()); + std::sort(_frameSubstitutions.begin(), _frameSubstitutions.end(), + CompareSubstituteOnFrameName< frame_substitutions_t, std::string>()); } -void dna_reftran::LogFrameSubstitutions(vector& substitutions, const string& type) +void dna_reftran::LogFrameSubstitutions(std::vector& substitutions, const std::string& type) { // Sort, count and remove duplicates - vector::iterator _it_sub_1, _it_sub_2, _it_sub_newend; + std::vector::iterator _it_sub_1, _it_sub_2, _it_sub_newend; UINT32 i(0); vUINT32 subs; // sort - sort(substitutions.begin(), substitutions.end()); + std::sort(substitutions.begin(), substitutions.end()); // count unique pairs for (_it_sub_1 = substitutions.begin(); @@ -361,23 +360,23 @@ void dna_reftran::LogFrameSubstitutions(vector& substitution // print vUINT32::iterator _it_subs = subs.begin(); - stringstream ss1, ss2; + std::stringstream ss1, ss2; ss1 << type << " reference frame substitutions"; ss2 << "(" << subs_count << ")"; - *rft_file << endl << endl << - setw(PRINT_VAL_PAD) << left << ss1.str() << - setw(NUMERIC_WIDTH) << right << ss2.str() << endl; - *rft_file << string(PRINT_VAL_PAD + NUMERIC_WIDTH, '-') << endl; + *rft_file << std::endl << std::endl << + std::setw(PRINT_VAL_PAD) << std::left << ss1.str() << + std::setw(NUMERIC_WIDTH) << std::right << ss2.str() << std::endl; + *rft_file << std::string(PRINT_VAL_PAD + NUMERIC_WIDTH, '-') << std::endl; for_each( substitutions.begin(), substitutions.end(), [this, &_it_subs](string_string_pair& substitution) { - *rft_file << setw(BLOCK) << left << substitution.first << + *rft_file << std::setw(BLOCK) << std::left << substitution.first << " --> " << - setw(BLOCK) << substitution.second << - setw(HEADER_20) << right << *(_it_subs++) << endl; + std::setw(BLOCK) << substitution.second << + std::setw(HEADER_20) << std::right << *(_it_subs++) << std::endl; } ); @@ -389,7 +388,7 @@ void dna_reftran::ApplyStationFrameSubstitutions() // loop through binary station records and replace occurrences of // the frame to be replaced with a substitute it_vstn_t stn_it; - string epsgSubstitute; + std::string epsgSubstitute; _v_stn_substitutions.clear(); @@ -399,25 +398,25 @@ void dna_reftran::ApplyStationFrameSubstitutions() if (IsolateandApplySubstitute(stn_it->epsgCode, stn_it->epoch, epsgSubstitute)) { _v_stn_substitutions.push_back(string_string_pair( - datumFromEpsgString(string(stn_it->epsgCode)), + datumFromEpsgString(std::string(stn_it->epsgCode)), datumFromEpsgString(epsgSubstitute))); strcpy(stn_it->epsgCode, epsgSubstitute.c_str()); } } catch (const RefTranException& e) { - stringstream error_msg; - error_msg << endl << - " - Station: " << stn_it->stationName << endl << - " - Frame and epoch: " << datumFromEpsgString(stn_it->epsgCode) << - " (no epoch)" << endl; + std::stringstream error_msg; + error_msg << std::endl << + " - Station: " << stn_it->stationName << std::endl << + " - Frame and epoch: " << datumFromEpsgString(stn_it->epsgCode) << + " (no epoch)" << std::endl; switch (e.exception_type()) { case REFTRAN_WGS84_TRANS_UNSUPPORTED: { - stringstream throw_msg; - throw_msg << e.what() << error_msg.str() << endl; + std::stringstream throw_msg; + throw_msg << e.what() << error_msg.str() << std::endl; throw RefTranException(throw_msg.str(), REFTRAN_WGS84_TRANS_UNSUPPORTED); break; } @@ -441,7 +440,7 @@ void dna_reftran::ApplyMeasurementFrameSubstitutions() // loop through binary station records and replace occurrences of // the frame to be replaced with a substitute it_vmsr_t msr_it; - string epsgSubstitute; + std::string epsgSubstitute; _v_msr_substitutions.clear(); @@ -452,27 +451,27 @@ void dna_reftran::ApplyMeasurementFrameSubstitutions() { if (msr_it->measStart == xMeas) _v_msr_substitutions.push_back(string_string_pair( - datumFromEpsgString(string(msr_it->epsgCode)), + datumFromEpsgString(std::string(msr_it->epsgCode)), datumFromEpsgString(epsgSubstitute))); strcpy(msr_it->epsgCode, epsgSubstitute.c_str()); } } catch (const RefTranException& e) { - stringstream error_msg; - error_msg << endl << - " - Measurement type: " << measurement_name(msr_it->measType) << endl << - " - From: " << bstBinaryRecords_.at(msr_it->station1).stationName << endl << - " - To: " << bstBinaryRecords_.at(msr_it->station2).stationName << endl << - " - Frame and epoch: " << datumFromEpsgString(msr_it->epsgCode) << - " (no epoch)" << endl; + std::stringstream error_msg; + error_msg << std::endl << + " - Measurement type: " << measurement_name(msr_it->measType) << std::endl << + " - From: " << bstBinaryRecords_.at(msr_it->station1).stationName << std::endl << + " - To: " << bstBinaryRecords_.at(msr_it->station2).stationName << std::endl << + " - Frame and epoch: " << datumFromEpsgString(msr_it->epsgCode) << + " (no epoch)" << std::endl; switch (e.exception_type()) { case REFTRAN_WGS84_TRANS_UNSUPPORTED: { - stringstream throw_msg; - throw_msg << e.what() << error_msg.str() << endl; + std::stringstream throw_msg; + throw_msg << e.what() << error_msg.str() << std::endl; throw RefTranException(throw_msg.str(), REFTRAN_WGS84_TRANS_UNSUPPORTED); break; } @@ -492,12 +491,12 @@ void dna_reftran::ApplyMeasurementFrameSubstitutions() } -bool dna_reftran::IsolateandApplySubstitute(const string& epsgCode, const string& stnEpoch, string& epsgSubstitute) +bool dna_reftran::IsolateandApplySubstitute(const std::string& epsgCode, const std::string& stnEpoch, std::string& epsgSubstitute) { _it_vframesubptr _it_subst = _frameSubstitutions.begin(); - string frame; - frame = datumFromEpsgCode(LongFromString(epsgCode)); + std::string frame; + frame = datumFromEpsgCode(LongFromString(epsgCode)); // first, find the first occurrence of the substitute in _frameSubstitutions if ((_it_subst = binary_search_substitution( @@ -515,18 +514,18 @@ bool dna_reftran::IsolateandApplySubstitute(const string& epsgCode, const string { if (stnEpoch.empty()) { - stringstream throw_msg; - throw_msg << " Cannot perform a reference frame substitution for data on '" << frame << "'" << endl << - " without a valid epoch. '" << frame << "' refers to the \"World Geodetic System 1984" << endl << - " (WGS 84) ensemble\". When transforming stations and measurements from the" << endl << - " WGS 84 ensemble, each record must be accompanied with an epoch. Refer to" << endl << - " the DynAdjust User's Guide (\"Configuring import options\") for information" << endl << - " on how to achieve reliable transformation results using WGS 84." << endl; + std::stringstream throw_msg; + throw_msg << " Cannot perform a reference frame substitution for data on '" << frame << "'" << std::endl << + " without a valid epoch. '" << frame << "' refers to the \"World Geodetic System 1984" << std::endl << + " (WGS 84) ensemble\". When transforming stations and measurements from the" << std::endl << + " WGS 84 ensemble, each record must be accompanied with an epoch. Refer to" << std::endl << + " the DynAdjust User's Guide (\"Configuring import options\") for information" << std::endl << + " on how to achieve reliable transformation results using WGS 84." << std::endl; throw RefTranException(throw_msg.str(), REFTRAN_WGS84_TRANS_UNSUPPORTED); } // In this case, use the epoch to identify the correct substitution - boost::gregorian::date epoch = dateFromString(stnEpoch); + boost::gregorian::date epoch = dateFromString(stnEpoch); while (_it_subst != _frameSubstitutions.end()) { @@ -545,29 +544,29 @@ bool dna_reftran::IsolateandApplySubstitute(const string& epsgCode, const string if (epsgSubstitute.empty()) return false; - epsgSubstitute = epsgStringFromName(epsgSubstitute); + epsgSubstitute = epsgStringFromName(epsgSubstitute); return true; } -void dna_reftran::LoadBinaryStationFile(const string& bstfileName) +void dna_reftran::LoadBinaryStationFile(const std::string& bstfileName) { try { // Load binary stations data. Throws runtime_error on failure. dna_io_bst bst; bst.load_bst_file(bstfileName, &bstBinaryRecords_, bst_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } } -void dna_reftran::WriteBinaryStationFile(const string& bstfileName) +void dna_reftran::WriteBinaryStationFile(const std::string& bstfileName) { - string strEpsg(datumTo_.GetEpsgCode_s()); - string strEpoch(datumTo_.GetEpoch_s()); + std::string strEpsg(datumTo_.GetEpsgCode_s()); + std::string strEpoch(datumTo_.GetEpoch_s()); // update binary file meta sprintf(bst_meta_.modifiedBy, "%s", __BINARY_NAME__); @@ -580,28 +579,28 @@ void dna_reftran::WriteBinaryStationFile(const string& bstfileName) dna_io_bst bst; bst.write_bst_file(bstfileName, &bstBinaryRecords_, bst_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } } -void dna_reftran::LoadBinaryMeasurementFile(const string& bmsfileName) +void dna_reftran::LoadBinaryMeasurementFile(const std::string& bmsfileName) { try { // Load binary measurements data. Throws runtime_error on failure. dna_io_bms bms; bms.load_bms_file(bmsfileName, &bmsBinaryRecords_, bms_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } } -void dna_reftran::WriteBinaryMeasurementFile(const string& bmsfileName) +void dna_reftran::WriteBinaryMeasurementFile(const std::string& bmsfileName) { - string strEpsg(datumTo_.GetEpsgCode_s()); - string strEpoch(datumTo_.GetEpoch_s()); + std::string strEpsg(datumTo_.GetEpsgCode_s()); + std::string strEpoch(datumTo_.GetEpoch_s()); // update binary file meta sprintf(bms_meta_.modifiedBy, "%s", __BINARY_NAME__); @@ -614,20 +613,20 @@ void dna_reftran::WriteBinaryMeasurementFile(const string& bmsfileName) dna_io_bms bms; bms.write_bms_file(bmsfileName, &bmsBinaryRecords_, bms_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } } -UINT32 dna_reftran::DetermineTectonicPlate(const string& plate) +UINT32 dna_reftran::DetermineTectonicPlate(const std::string& plate) { it_pair_string_vUINT32 it_plate = equal_range(vplateMap_.begin(), vplateMap_.end(), plate, StationNameIDCompareName()); if (it_plate.first == it_plate.second) { - stringstream error_msg; + std::stringstream error_msg; error_msg << "An attempt to find plate motion model parameters failed for " << plate << "."; throw RefTranException(error_msg.str()); @@ -673,7 +672,7 @@ void dna_reftran::JoinTransformationParameters(it_vstn_t& stn_it, double* reduce { transformation_parameter_set transP_a, transP_b; - CDnaDatum datumStep(epsgCodeFromName(ITRF2014_s)); + CDnaDatum datumStep(epsgCodeFromName(ITRF2014_s)); // Set the reference epoch to the epoch of the data switch (transType) @@ -694,7 +693,7 @@ void dna_reftran::JoinTransformationParameters(it_vstn_t& stn_it, double* reduce double reduced_parameters_step[7]; double timeElapsed_a(0.0), timeElapsed_b(0.0); - string epoch_step; + std::string epoch_step; transformationType transformation_type; @@ -744,9 +743,9 @@ void dna_reftran::JoinTransformationParameters(it_vstn_t& stn_it, double* reduce epoch_step = datumTo.GetEpoch_s(); break; default: - stringstream error_msg; + std::stringstream error_msg; error_msg << "Attempting to join parameters between " << - datumFrom_.GetName() << " and " << datumStep.GetName() << ":" << endl << + datumFrom_.GetName() << " and " << datumStep.GetName() << ":" << std::endl << " " << rft.what(); throw RefTranException(error_msg.str()); } @@ -757,28 +756,28 @@ void dna_reftran::JoinTransformationParameters(it_vstn_t& stn_it, double* reduce matrix_2d coordinates_step(3, 1); Transform_7parameter(coordinates, coordinates_step, reduced_parameters); - *rft_file << setw(PAD3) << left << "JN" << - setw(STATION) << left << stn_it->stationName << - setw(REL) << right << ITRF2014_s << - setw(REL) << right << epoch_step << - setw(PAD3) << " " << - setw(PAD) << left << stn_it->plate << - setw(MEASR) << right << fixed << setprecision(4) << coordinates_step.get(0, 0) << - setw(MEASR) << right << fixed << setprecision(4) << coordinates_step.get(1, 0) << - setw(MEASR) << right << fixed << setprecision(4) << coordinates_step.get(2, 0); + *rft_file << std::setw(PAD3) << std::left << "JN" << + std::setw(STATION) << std::left << stn_it->stationName << + std::setw(REL) << std::right << ITRF2014_s << + std::setw(REL) << std::right << epoch_step << + std::setw(PAD3) << " " << + std::setw(PAD) << std::left << stn_it->plate << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates_step.get(0, 0) << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates_step.get(1, 0) << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates_step.get(2, 0); if (projectSettings_.g.verbose > 2) { - *rft_file << setw(PACORR) << right << fixed << setprecision(4) << reduced_parameters[0] << - setw(PACORR) << right << fixed << setprecision(4) << reduced_parameters[1] << - setw(PACORR) << right << fixed << setprecision(4) << reduced_parameters[2] << - setw(PACORR) << right << scientific << setprecision(4) << reduced_parameters[3] << - setw(PACORR) << right << scientific << setprecision(4) << reduced_parameters[4] << - setw(PACORR) << right << scientific << setprecision(4) << reduced_parameters[5] << - setw(PACORR) << right << scientific << setprecision(4) << reduced_parameters[6] << - setw(PACORR) << right << fixed << setprecision(4) << timeElapsed_a; + *rft_file << std::setw(PACORR) << std::right << std::fixed << std::setprecision(4) << reduced_parameters[0] << + std::setw(PACORR) << std::right << std::fixed << std::setprecision(4) << reduced_parameters[1] << + std::setw(PACORR) << std::right << std::fixed << std::setprecision(4) << reduced_parameters[2] << + std::setw(PACORR) << std::right << std::scientific << std::setprecision(4) << reduced_parameters[3] << + std::setw(PACORR) << std::right << std::scientific << std::setprecision(4) << reduced_parameters[4] << + std::setw(PACORR) << std::right << std::scientific << std::setprecision(4) << reduced_parameters[5] << + std::setw(PACORR) << std::right << std::scientific << std::setprecision(4) << reduced_parameters[6] << + std::setw(PACORR) << std::right << std::fixed << std::setprecision(4) << timeElapsed_a; } - *rft_file << endl; + *rft_file << std::endl; } // Step -> datumTo @@ -821,9 +820,9 @@ void dna_reftran::JoinTransformationParameters(it_vstn_t& stn_it, double* reduce ObtainPlateMotionParameters(stn_it, reduced_parameters_step, datumFrom, datumTo, transformParameters, timeElapsed_b); break; default: - stringstream error_msg; + std::stringstream error_msg; error_msg << "Attempting to join parameters between " << - datumStep.GetName() << " and " << datumTo.GetName() << ":" << endl << + datumStep.GetName() << " and " << datumTo.GetName() << ":" << std::endl << " " << rft.what(); throw RefTranException(error_msg.str()); } @@ -882,32 +881,32 @@ void dna_reftran::TransformEpochs_PlateMotionModel(it_vstn_t& stn_it, const matr if (projectSettings_.g.verbose > 1 && data_type_ == stn_data) { - *rft_file << setw(PAD3) << left << "PM" << - setw(STATION) << left << stn_it->stationName << - setw(REL) << right << datumTo.GetName() << - setw(REL) << right << datumTo.GetEpoch_s() << - setw(PAD3) << " " << - setw(PAD) << left << stn_it->plate << - setw(MEASR) << right << fixed << setprecision(4) << coordinates_mod.get(0, 0) << - setw(MEASR) << right << fixed << setprecision(4) << coordinates_mod.get(1, 0) << - setw(MEASR) << right << fixed << setprecision(4) << coordinates_mod.get(2, 0); + *rft_file << std::setw(PAD3) << std::left << "PM" << + std::setw(STATION) << std::left << stn_it->stationName << + std::setw(REL) << std::right << datumTo.GetName() << + std::setw(REL) << std::right << datumTo.GetEpoch_s() << + std::setw(PAD3) << " " << + std::setw(PAD) << std::left << stn_it->plate << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates_mod.get(0, 0) << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates_mod.get(1, 0) << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates_mod.get(2, 0); if (projectSettings_.g.verbose > 2) { - *rft_file << setw(PACORR) << right << fixed << setprecision(4) << reduced_parameters[0] << - setw(PACORR) << right << fixed << setprecision(4) << reduced_parameters[1] << - setw(PACORR) << right << fixed << setprecision(4) << reduced_parameters[2] << - setw(PACORR) << right << scientific << setprecision(4) << reduced_parameters[3] << - setw(PACORR) << right << scientific << setprecision(4) << reduced_parameters[4] << - setw(PACORR) << right << scientific << setprecision(4) << reduced_parameters[5] << - setw(PACORR) << right << scientific << setprecision(4) << reduced_parameters[6] << - setw(PACORR) << right << fixed << setprecision(4) << timeElapsed; + *rft_file << std::setw(PACORR) << std::right << std::fixed << std::setprecision(4) << reduced_parameters[0] << + std::setw(PACORR) << std::right << std::fixed << std::setprecision(4) << reduced_parameters[1] << + std::setw(PACORR) << std::right << std::fixed << std::setprecision(4) << reduced_parameters[2] << + std::setw(PACORR) << std::right << std::scientific << std::setprecision(4) << reduced_parameters[3] << + std::setw(PACORR) << std::right << std::scientific << std::setprecision(4) << reduced_parameters[4] << + std::setw(PACORR) << std::right << std::scientific << std::setprecision(4) << reduced_parameters[5] << + std::setw(PACORR) << std::right << std::scientific << std::setprecision(4) << reduced_parameters[6] << + std::setw(PACORR) << std::right << std::fixed << std::setprecision(4) << timeElapsed; } - *rft_file << endl; + *rft_file << std::endl; } #ifdef _MSDEBUG - stringstream ss; + std::stringstream ss; ss << "coords, " << datumFrom.GetName() << " @ " << referenceEpoch(datumFrom.GetEpoch()); coordinates.trace(ss.str(), "%.4f "); ss.str(""); @@ -929,8 +928,8 @@ void dna_reftran::TransformFrames_PlateMotionModel(it_vstn_t& stn_it, const matr // 3. Transform ITRF2014 to datumTo (using the epoch of the output dynamic frame) // Create the step datum and set the epoch to the epoch of the input data - CDnaDatum datumStep1(epsgCodeFromName(ITRF2014_s), datumFrom.GetEpoch()); - CDnaDatum datumStep2(epsgCodeFromName(ITRF2014_s), datumTo.GetEpoch()); + CDnaDatum datumStep1(epsgCodeFromName(ITRF2014_s), datumFrom.GetEpoch()); + CDnaDatum datumStep2(epsgCodeFromName(ITRF2014_s), datumTo.GetEpoch()); matrix_2d coordinates_tmp(coordinates); @@ -948,8 +947,8 @@ void dna_reftran::TransformFrames_PlateMotionModel(it_vstn_t& stn_it, const matr #ifdef _MSDEBUG TRACE("Step 2: Plate motion model transformation on ITRF from epoch of input frame to epoch of output frame\n"); - stringstream ss; - ss << "Transforming from " << datumStep1.GetName() << " @ " << datumStep1.GetEpoch() << endl; + std::stringstream ss; + ss << "Transforming from " << datumStep1.GetName() << " @ " << datumStep1.GetEpoch() << std::endl; ss << " to " << datumStep2.GetName() << " @ " << datumStep2.GetEpoch(); TRACE("%s\n", ss.str().c_str()); #endif @@ -996,9 +995,9 @@ void dna_reftran::TransformFrames_WithoutPlateMotionModel(it_vstn_t& stn_it, con timeElapsed, transType); #ifdef _MSDEBUG - stringstream ss; - ss << "Transforming from " << datumFrom.GetName() << " @ " << fixed << setprecision(4) << referenceEpoch(datumFrom.GetEpoch()) << endl; - ss << " to " << datumTo.GetName() << " @ " << fixed << setprecision(4) << transformParameters.reference_epoch_; + std::stringstream ss; + ss << "Transforming from " << datumFrom.GetName() << " @ " << std::fixed << std::setprecision(4) << referenceEpoch(datumFrom.GetEpoch()) << std::endl; + ss << " to " << datumTo.GetName() << " @ " << std::fixed << std::setprecision(4) << transformParameters.reference_epoch_; TRACE("%s\n", ss.str().c_str()); //TRACE("Raw parameters:\n"); @@ -1040,28 +1039,28 @@ void dna_reftran::TransformFrames_WithoutPlateMotionModel(it_vstn_t& stn_it, con if (projectSettings_.g.verbose > 1 && data_type_ == stn_data) { - *rft_file << setw(PAD3) << left << TransformationType(transType) << - setw(STATION) << left << stn_it->stationName << - setw(REL) << right << datumTo.GetName() << - setw(REL) << right << datumTo.GetEpoch_s() << - setw(PAD3) << " " << - setw(PAD) << left << stn_it->plate << - setw(MEASR) << right << fixed << setprecision(4) << coordinates_mod.get(0, 0) << - setw(MEASR) << right << fixed << setprecision(4) << coordinates_mod.get(1, 0) << - setw(MEASR) << right << fixed << setprecision(4) << coordinates_mod.get(2, 0); + *rft_file << std::setw(PAD3) << std::left << TransformationType(transType) << + std::setw(STATION) << std::left << stn_it->stationName << + std::setw(REL) << std::right << datumTo.GetName() << + std::setw(REL) << std::right << datumTo.GetEpoch_s() << + std::setw(PAD3) << " " << + std::setw(PAD) << std::left << stn_it->plate << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates_mod.get(0, 0) << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates_mod.get(1, 0) << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates_mod.get(2, 0); if (projectSettings_.g.verbose > 2) { - *rft_file << setw(PACORR) << right << fixed << setprecision(4) << reduced_parameters[0] << - setw(PACORR) << right << fixed << setprecision(4) << reduced_parameters[1] << - setw(PACORR) << right << fixed << setprecision(4) << reduced_parameters[2] << - setw(PACORR) << right << scientific << setprecision(4) << reduced_parameters[3] << - setw(PACORR) << right << scientific << setprecision(4) << reduced_parameters[4] << - setw(PACORR) << right << scientific << setprecision(4) << reduced_parameters[5] << - setw(PACORR) << right << scientific << setprecision(4) << reduced_parameters[6] << - setw(PACORR) << right << fixed << setprecision(4) << timeElapsed; + *rft_file << std::setw(PACORR) << std::right << std::fixed << std::setprecision(4) << reduced_parameters[0] << + std::setw(PACORR) << std::right << std::fixed << std::setprecision(4) << reduced_parameters[1] << + std::setw(PACORR) << std::right << std::fixed << std::setprecision(4) << reduced_parameters[2] << + std::setw(PACORR) << std::right << std::scientific << std::setprecision(4) << reduced_parameters[3] << + std::setw(PACORR) << std::right << std::scientific << std::setprecision(4) << reduced_parameters[4] << + std::setw(PACORR) << std::right << std::scientific << std::setprecision(4) << reduced_parameters[5] << + std::setw(PACORR) << std::right << std::scientific << std::setprecision(4) << reduced_parameters[6] << + std::setw(PACORR) << std::right << std::fixed << std::setprecision(4) << timeElapsed; } - *rft_file << endl; + *rft_file << std::endl; } @@ -1118,8 +1117,8 @@ void dna_reftran::TransformDynamic(it_vstn_t& stn_it, const matrix_2d& coordinat frame_similarity = __frame_frame_diff__; #ifdef _MSDEBUG - stringstream ss; - ss << "Transforming from " << datumFrom.GetName() << " @ " << datumFrom.GetEpoch() << endl; + std::stringstream ss; + ss << "Transforming from " << datumFrom.GetName() << " @ " << datumFrom.GetEpoch() << std::endl; ss << " to " << datumTo.GetName() << " @ " << datumTo.GetEpoch(); TRACE("%s\n", ss.str().c_str()); #endif @@ -1229,7 +1228,7 @@ void dna_reftran::TransformFrames_Join(it_vstn_t& stn_it, const matrix_2d& coord double dna_reftran::DetermineElapsedTime(const CDnaDatum& datumFrom, const CDnaDatum& datumTo, transformation_parameter_set& transParams, transformationType transType) { - stringstream ss; + std::stringstream ss; double dTime(0.0); try @@ -1285,7 +1284,7 @@ double dna_reftran::DetermineElapsedTime(const CDnaDatum& datumFrom, const CDnaD #endif ss.str(""); - date dt; + boost::gregorian::date dt; double dt0(transParams.reference_epoch_); switch (transType) @@ -1352,8 +1351,8 @@ double dna_reftran::DetermineElapsedTime(const CDnaDatum& datumFrom, const CDnaD dTime = elapsedTime(dt, dt0); #ifdef _MSDEBUG - ss << "From epoch: " << fixed << setprecision(4) << referenceEpoch(dt) << " -> to epoch: " << fixed << setprecision(4) << dt0 << - " = " << setprecision(4) << fixed << dTime; + ss << "From epoch: " << std::fixed << std::setprecision(4) << referenceEpoch(dt) << " -> to epoch: " << std::fixed << std::setprecision(4) << dt0 << + " = " << std::setprecision(4) << std::fixed << dTime; TRACE("%s\n", ss.str().c_str()); #endif @@ -1364,7 +1363,7 @@ double dna_reftran::DetermineElapsedTime(const CDnaDatum& datumFrom, const CDnaD } catch (...) { - stringstream ss; + std::stringstream ss; ss << "DetermineElapsedTime(): an error occurred whilst computing the elapsed time."; throw RefTranException(ss.str()); } @@ -1398,7 +1397,7 @@ void dna_reftran::ObtainHelmertParameters(const CDnaDatum& datumFrom, const CDna timeElapsed = 0.; } -void dna_reftran::TransformStationRecords(const string& newFrame, const string& newEpoch) +void dna_reftran::TransformStationRecords(const std::string& newFrame, const std::string& newEpoch) { it_vstn_t stn_it; CDnaDatum datumFrom; @@ -1409,38 +1408,38 @@ void dna_reftran::TransformStationRecords(const string& newFrame, const string& if (projectSettings_.g.verbose > 1) { j = (PAD3 * 2) + PAD + STATION + (REL * 2) + (MEASR * 3); - *rft_file << endl << endl << "Station coordinate transformations" << endl << - "-------------------------------------------" << endl << endl; - *rft_file << setw(PAD3) << left << "ID" << - setw(STATION) << left << "Station" << - setw(REL) << right << "Frame" << - setw(REL) << right << "Epoch" << - setw(PAD3) << " " << - setw(PAD) << left << "Plate" << - setw(MEASR) << right << "X" << - setw(MEASR) << right << "Y" << - setw(MEASR) << right << "Z"; + *rft_file << std::endl << std::endl << "Station coordinate transformations" << std::endl << + "-------------------------------------------" << std::endl << std::endl; + *rft_file << std::setw(PAD3) << std::left << "ID" << + std::setw(STATION) << std::left << "Station" << + std::setw(REL) << std::right << "Frame" << + std::setw(REL) << std::right << "Epoch" << + std::setw(PAD3) << " " << + std::setw(PAD) << std::left << "Plate" << + std::setw(MEASR) << std::right << "X" << + std::setw(MEASR) << std::right << "Y" << + std::setw(MEASR) << std::right << "Z"; // Print reduced transformation parameters if (projectSettings_.g.verbose > 2) { - *rft_file << setw(PACORR) << right << "dX" << - setw(PACORR) << right << "dY" << - setw(PACORR) << right << "dZ" << - setw(PACORR) << right << "Sc" << - setw(PACORR) << right << "rX" << - setw(PACORR) << right << "rY" << - setw(PACORR) << right << "rZ" << - setw(PACORR) << right << "dt"; + *rft_file << std::setw(PACORR) << std::right << "dX" << + std::setw(PACORR) << std::right << "dY" << + std::setw(PACORR) << std::right << "dZ" << + std::setw(PACORR) << std::right << "Sc" << + std::setw(PACORR) << std::right << "rX" << + std::setw(PACORR) << std::right << "rY" << + std::setw(PACORR) << std::right << "rZ" << + std::setw(PACORR) << std::right << "dt"; j += (8 * PACORR); } - *rft_file << endl; + *rft_file << std::endl; UINT32 i; for (i=0; iepoch)).empty()) + if (trimstr(std::string(stn_it->epoch)).empty()) datumFrom.SetDatum(stn_it->epsgCode); else datumFrom.SetDatumFromEpsg(stn_it->epsgCode, stn_it->epoch); @@ -1486,22 +1485,22 @@ void dna_reftran::TransformStationRecords(const string& newFrame, const string& m_stnsTransformed++; } } - catch (const runtime_error& e) + catch (const std::runtime_error& e) { - stringstream error_msg; - error_msg << e.what() << endl << - " - Station: " << stn_it->stationName << endl << - " - Frame and epoch: " << datumFromEpsgString(stn_it->epsgCode) << " @ " << - stn_it->epoch << endl; + std::stringstream error_msg; + error_msg << e.what() << std::endl << + " - Station: " << stn_it->stationName << std::endl << + " - Frame and epoch: " << datumFromEpsgString(stn_it->epsgCode) << " @ " << + stn_it->epoch << std::endl; throw RefTranException(e.what()); } catch (const RefTranException& e) { - stringstream error_msg; - error_msg << e.what() << endl << - " - Station: " << stn_it->stationName << endl << - " - Frame and epoch: " << datumFromEpsgString(stn_it->epsgCode) << " @ " << - stn_it->epoch << endl; + std::stringstream error_msg; + error_msg << e.what() << std::endl << + " - Station: " << stn_it->stationName << std::endl << + " - Frame and epoch: " << datumFromEpsgString(stn_it->epsgCode) << " @ " << + stn_it->epoch << std::endl; throw RefTranException(e.what()); } @@ -1523,29 +1522,29 @@ void dna_reftran::TransformStation(it_vstn_t& stn_it, const CDnaDatum& datumFrom datumFrom.GetEllipsoidRef()); if (projectSettings_.g.verbose > 1) - *rft_file << setw(PAD3) << left << "FR" << - setw(STATION) << left << stn_it->stationName << - setw(REL) << right << datumFrom.GetName() << - setw(REL) << right << datumFrom.GetEpoch_s() << - setw(PAD3) << " " << - setw(PAD) << left << stn_it->plate << - setw(MEASR) << right << fixed << setprecision(4) << coordinates.get(0, 0) << - setw(MEASR) << right << fixed << setprecision(4) << coordinates.get(1, 0) << - setw(MEASR) << right << fixed << setprecision(4) << coordinates.get(2, 0) << endl; + *rft_file << std::setw(PAD3) << std::left << "FR" << + std::setw(STATION) << std::left << stn_it->stationName << + std::setw(REL) << std::right << datumFrom.GetName() << + std::setw(REL) << std::right << datumFrom.GetEpoch_s() << + std::setw(PAD3) << " " << + std::setw(PAD) << std::left << stn_it->plate << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates.get(0, 0) << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates.get(1, 0) << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates.get(2, 0) << std::endl; // 2. Transform! Transform(stn_it, coordinates, coordinates_mod, datumFrom, transformParameters); if (projectSettings_.g.verbose > 1) - *rft_file << setw(PAD3) << left << "TO" << - setw(STATION) << left << stn_it->stationName << - setw(REL) << right << datumTo_.GetName() << - setw(REL) << right << datumTo_.GetEpoch_s() << - setw(PAD3) << " " << - setw(PAD) << left << stn_it->plate << - setw(MEASR) << right << fixed << setprecision(4) << coordinates_mod.get(0, 0) << - setw(MEASR) << right << fixed << setprecision(4) << coordinates_mod.get(1, 0) << - setw(MEASR) << right << fixed << setprecision(4) << coordinates_mod.get(2, 0) << endl; + *rft_file << std::setw(PAD3) << std::left << "TO" << + std::setw(STATION) << std::left << stn_it->stationName << + std::setw(REL) << std::right << datumTo_.GetName() << + std::setw(REL) << std::right << datumTo_.GetEpoch_s() << + std::setw(PAD3) << " " << + std::setw(PAD) << std::left << stn_it->plate << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates_mod.get(0, 0) << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates_mod.get(1, 0) << + std::setw(MEASR) << std::right << std::fixed << std::setprecision(4) << coordinates_mod.get(2, 0) << std::endl; // 3. Convert back to geographic CartToGeo(coordinates_mod.get(0, 0), @@ -1555,7 +1554,7 @@ void dna_reftran::TransformStation(it_vstn_t& stn_it, const CDnaDatum& datumFrom } -void dna_reftran::TransformMeasurementRecords(const string& newFrame, const string& newEpoch) +void dna_reftran::TransformMeasurementRecords(const std::string& newFrame, const std::string& newEpoch) { it_vmsr_t msr_it; CDnaDatum datumFrom; @@ -1609,7 +1608,7 @@ void dna_reftran::TransformMeasurementRecords(const string& newFrame, const stri continue; // b. Get datum of current measurement - if (trimstr(string(msr_it->epoch)).empty()) + if (trimstr(std::string(msr_it->epoch)).empty()) datumFrom.SetDatum(msr_it->epsgCode); else datumFrom.SetDatumFromEpsg(msr_it->epsgCode, msr_it->epoch); @@ -1628,26 +1627,26 @@ void dna_reftran::TransformMeasurementRecords(const string& newFrame, const stri transformationPerformed_ = true; } } - catch (const runtime_error& e) + catch (const std::runtime_error& e) { - stringstream error_msg; - error_msg << e.what() << endl << - " - Measurement type: " << measurement_name(msr_it->measType) << endl << - " - From: " << bstBinaryRecords_.at(msr_it->station1).stationName << endl << - " - To: " << bstBinaryRecords_.at(msr_it->station2).stationName << endl << - " - Frame and epoch: " << datumFromEpsgString(msr_it->epsgCode) << " @ " << - msr_it->epoch << endl; + std::stringstream error_msg; + error_msg << e.what() << std::endl << + " - Measurement type: " << measurement_name(msr_it->measType) << std::endl << + " - From: " << bstBinaryRecords_.at(msr_it->station1).stationName << std::endl << + " - To: " << bstBinaryRecords_.at(msr_it->station2).stationName << std::endl << + " - Frame and epoch: " << datumFromEpsgString(msr_it->epsgCode) << " @ " << + msr_it->epoch << std::endl; throw RefTranException(error_msg.str()); } catch (const RefTranException& e) { - stringstream error_msg; - error_msg << e.what() << endl << - " - Measurement type: " << measurement_name(msr_it->measType) << endl << - " - From: " << bstBinaryRecords_.at(msr_it->station1).stationName << endl << - " - To: " << bstBinaryRecords_.at(msr_it->station2).stationName << endl << - " - Frame and epoch: " << datumFromEpsgString(msr_it->epsgCode) << " @ " << - msr_it->epoch << endl; + std::stringstream error_msg; + error_msg << e.what() << std::endl << + " - Measurement type: " << measurement_name(msr_it->measType) << std::endl << + " - From: " << bstBinaryRecords_.at(msr_it->station1).stationName << std::endl << + " - To: " << bstBinaryRecords_.at(msr_it->station2).stationName << std::endl << + " - Frame and epoch: " << datumFromEpsgString(msr_it->epsgCode) << " @ " << + msr_it->epoch << std::endl; throw RefTranException(error_msg.str()); } @@ -1864,21 +1863,21 @@ void dna_reftran::LoadDatabaseId() if (databaseIDsLoaded_) return; - string dbid_filename = formPath(projectSettings_.g.output_folder, + std::string dbid_filename = formPath(projectSettings_.g.output_folder, projectSettings_.g.network_name, "dbid"); - stringstream ss; + std::stringstream ss; v_msr_db_map_.clear(); std::ifstream dbid_file; try { // Create geoid file. Throws runtime_error on failure. file_opener(dbid_file, dbid_filename, - ios::in | ios::binary, binary); + std::ios::in | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } UINT32 r, recordCount; @@ -1914,18 +1913,18 @@ void dna_reftran::LoadDatabaseId() } catch (const std::ifstream::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } -void dna_reftran::SerialiseDNA(const string& stnfilename, const string& msrfilename, bool flagUnused) +void dna_reftran::SerialiseDNA(const std::string& stnfilename, const std::string& msrfilename, bool flagUnused) { try { // Load Database IDs LoadDatabaseId(); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } @@ -1933,7 +1932,7 @@ void dna_reftran::SerialiseDNA(const string& stnfilename, const string& msrfilen try { // write binary stations data. Throws runtime_error on failure. dna_io_dna dna; - string comment(" transformed to "); + std::string comment(" transformed to "); comment.append(datumTo_.GetName()); if (datumTo_.isDynamic()) comment.append(", epoch ").append(datumTo_.GetEpoch_s()); @@ -1943,18 +1942,18 @@ void dna_reftran::SerialiseDNA(const string& stnfilename, const string& msrfilen stnfilename, msrfilename, projectSettings_.g.network_name, datumTo_, projection, flagUnused, "Station coordinates" + comment, "GNSS measurements" + comment); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } } -void dna_reftran::SerialiseDynaML(const string& stnfilename, const string& msrfilename, bool flagUnused) +void dna_reftran::SerialiseDynaML(const std::string& stnfilename, const std::string& msrfilename, bool flagUnused) { try { // Load Database IDs LoadDatabaseId(); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } @@ -1969,14 +1968,14 @@ void dna_reftran::SerialiseDynaML(const string& stnfilename, const string& msrfi dynaml_comment(dynaml_stn_file, "File type: Station file"); dynaml_comment(dynaml_stn_file, "Project name: " + projectSettings_.g.network_name); // Write header comment line - string comment("Station coordinates transformed to "); + std::string comment("Station coordinates transformed to "); comment.append(datumTo_.GetName()); if (datumTo_.isDynamic()) comment.append(", epoch ").append(datumTo_.GetEpoch_s()); comment.append(". Exported by reftran."); dynaml_comment(dynaml_stn_file, comment); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } @@ -1988,7 +1987,7 @@ void dna_reftran::SerialiseDynaML(const string& stnfilename, const string& msrfi dynaml_footer(dynaml_stn_file); dynaml_stn_file.close(); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } @@ -2002,14 +2001,14 @@ void dna_reftran::SerialiseDynaML(const string& stnfilename, const string& msrfi dynaml_comment(dynaml_msr_file, "File type: Measurement file"); dynaml_comment(dynaml_msr_file, "Project name: " + projectSettings_.g.network_name); // Write header comment line - string comment("GNSS measurements transformed to "); + std::string comment("GNSS measurements transformed to "); comment.append(datumTo_.GetName()); if (datumTo_.isDynamic()) comment.append(", epoch ").append(datumTo_.GetEpoch_s()); comment.append(". Exported by reftran."); dynaml_comment(dynaml_msr_file, comment); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } @@ -2019,19 +2018,19 @@ void dna_reftran::SerialiseDynaML(const string& stnfilename, const string& msrfi dynaml_footer(dynaml_msr_file); dynaml_msr_file.close(); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } } -void dna_reftran::SerialiseDynaML(const string& xmlfilename, bool flagUnused) +void dna_reftran::SerialiseDynaML(const std::string& xmlfilename, bool flagUnused) { try { // Load Database IDs LoadDatabaseId(); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } @@ -2042,14 +2041,14 @@ void dna_reftran::SerialiseDynaML(const string& xmlfilename, bool flagUnused) // write header dynaml_header(dynaml_xml_file, "Combined File", datumTo_.GetName(), datumTo_.GetEpoch_s()); // Write header comment line - string comment("Station coordinates and measurements transformed to "); + std::string comment("Station coordinates and measurements transformed to "); comment.append(datumTo_.GetName()); if (datumTo_.isDynamic()) comment.append(", epoch ").append(datumTo_.GetEpoch_s()); comment.append(". Exported by reftran."); dynaml_comment(dynaml_xml_file, comment); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } @@ -2064,7 +2063,7 @@ void dna_reftran::SerialiseDynaML(const string& xmlfilename, bool flagUnused) // 2. Measurements SerialiseDynaMLMsr(&dynaml_xml_file); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { throw RefTranException(e.what()); } @@ -2077,8 +2076,8 @@ void dna_reftran::SerialiseDynaML(const string& xmlfilename, bool flagUnused) void dna_reftran::SerialiseDynaMLStn(std::ofstream* xml_file, CDnaProjection& projection, bool flagUnused/*=false*/) { UINT32 epsgCode(LongFromString(bstBinaryRecords_.at(0).epsgCode)); - string datum(datumFromEpsgCode(epsgCode)); - string epoch(referenceepochFromEpsgCode(epsgCode)); + std::string datum(datumFromEpsgCode(epsgCode)); + std::string epoch(referenceepochFromEpsgCode(epsgCode)); dnaStnPtr stnPtr(new CDnaStation(datum, epoch)); it_vstn_t _it_stn; @@ -2110,7 +2109,7 @@ void dna_reftran::SerialiseDynaMLMsr(std::ofstream* xml_file) { dnaMsrPtr msrPtr; it_vmsr_t _it_msr; - string comment(""); + std::string comment(""); size_t dbindex; it_vdbid_t _it_dbid; @@ -2137,7 +2136,7 @@ void dna_reftran::SerialiseDynaMLMsr(std::ofstream* xml_file) // // Open output file stream. Throws runtime_error on failure. // file_opener(sinex_file, projectSettings_.o._snx_file); // } -// catch (const runtime_error& e) { +// catch (const std::runtime_error& e) { // throw RefTranException(e.what()); // } // diff --git a/dynadjust/dynadjust/dnareftran/dnareftran.hpp b/dynadjust/dynadjust/dnareftran/dnareftran.hpp index 271e58ae..6376f41f 100644 --- a/dynadjust/dynadjust/dnareftran/dnareftran.hpp +++ b/dynadjust/dynadjust/dnareftran/dnareftran.hpp @@ -40,11 +40,6 @@ #include #include -using namespace std; -using namespace boost; -using namespace boost::posix_time; -using namespace boost::filesystem; - #include #include #include @@ -108,7 +103,7 @@ class dna_reftran { dna_reftran& operator=(const dna_reftran&); public: - void TransformBinaryFiles(const string& bstFile, const string& bmsFile, const string& newFrame, const string& newEpoch=""); + void TransformBinaryFiles(const std::string& bstFile, const std::string& bmsFile, const std::string& newFrame, const std::string& newEpoch=""); // Returns the file progress //inline int ReturnFileProgress() const { return (int)m_dPercentComplete; } @@ -124,32 +119,32 @@ class dna_reftran { inline UINT32 MeasurementsNotTransformed() const { return m_msrsNotTransformed; } // file handling - void SerialiseDNA(const string& stnfilename, const string& msrfilename, bool flagUnused=false); - void SerialiseDynaML(const string& xmlfilename, bool flagUnused=false); - void SerialiseDynaML(const string& stnfilename, const string& msrfilename, bool flagUnused=false); + void SerialiseDNA(const std::string& stnfilename, const std::string& msrfilename, bool flagUnused=false); + void SerialiseDynaML(const std::string& xmlfilename, bool flagUnused=false); + void SerialiseDynaML(const std::string& stnfilename, const std::string& msrfilename, bool flagUnused=false); void SerialiseDynaMLStn(std::ofstream* xml_file, CDnaProjection& projection, bool flagUnused=false); void SerialiseDynaMLMsr(std::ofstream* xml_file); //bool PrintTransformedStationCoordinatestoSNX(); - void LoadTectonicPlateParameters(const string& pltfileName, const string& pmmfileName); + void LoadTectonicPlateParameters(const std::string& pltfileName, const std::string& pmmfileName); - //void LoadFrameSubstitutions(const string& frxfileName); + //void LoadFrameSubstitutions(const std::string& frxfileName); void LoadWGS84FrameSubstitutions(); inline void InitialiseSettings(const project_settings& p) {projectSettings_ = p;} private: - void LoadBinaryStationFile(const string& bstfileName); - void LoadBinaryMeasurementFile(const string& bmsfileName); + void LoadBinaryStationFile(const std::string& bstfileName); + void LoadBinaryMeasurementFile(const std::string& bmsfileName); - void WriteBinaryStationFile(const string& bstfileName); - void WriteBinaryMeasurementFile(const string& bmsfileName); + void WriteBinaryStationFile(const std::string& bstfileName); + void WriteBinaryMeasurementFile(const std::string& bmsfileName); - void TransformStationRecords(const string& newFrame, const string& newEpoch); - void TransformMeasurementRecords(const string& newFrame, const string& newEpoch); + void TransformStationRecords(const std::string& newFrame, const std::string& newEpoch); + void TransformMeasurementRecords(const std::string& newFrame, const std::string& newEpoch); double DetermineElapsedTime(const CDnaDatum& datumFrom, const CDnaDatum& datumTo, transformation_parameter_set& transParams, transformationType transType); @@ -157,7 +152,7 @@ class dna_reftran { void ObtainHelmertParameters(const CDnaDatum& datumFrom, const CDnaDatum& datumTo, transformation_parameter_set& transParams, double& timeElapsed, transformationType transType); - UINT32 DetermineTectonicPlate(const string& plate); + UINT32 DetermineTectonicPlate(const std::string& plate); void ObtainPlateMotionParameters(it_vstn_t& stn_it, double* reduced_parameters, const CDnaDatum& datumFrom, const CDnaDatum& datumTo, transformation_parameter_set& transformParameters, double& timeElapsed); @@ -200,11 +195,11 @@ class dna_reftran { void CalculateRotations(); - void LogFrameSubstitutions(vector& substitutions, const string& type); + void LogFrameSubstitutions(std::vector& substitutions, const std::string& type); void ApplyStationFrameSubstitutions(); void ApplyMeasurementFrameSubstitutions(); - bool IsolateandApplySubstitute(const string& epsgCode, const string& epoch, string& epsgSubstitute); + bool IsolateandApplySubstitute(const std::string& epsgCode, const std::string& epoch, std::string& epsgSubstitute); //double m_dPercentComplete; // percentage of bytes read from file int m_iBytesRead; // bytes read from file @@ -230,8 +225,8 @@ class dna_reftran { v_plate_motion_cartesians plate_motion_cartesians_; // Helmert parameters computed from Euler parameters vframeSubsPtr _frameSubstitutions; // Reference frame substitutions - vector _v_stn_substitutions; // station substitutions made - vector _v_msr_substitutions; // station substitutions made + std::vector _v_stn_substitutions; // station substitutions made + std::vector _v_msr_substitutions; // station substitutions made v_string_uint32_pair vplateMap_; // Plate Map index sorted on plate ID diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index 398cad57..01c0842d 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -24,67 +24,67 @@ using namespace dynadjust; -void PrintOutputFileHeaderInfo(std::ofstream* f_out, const string& out_file, project_settings* p, const string& header, UINT32& epsgCode) +void PrintOutputFileHeaderInfo(std::ofstream* f_out, const std::string& out_file, project_settings* p, const std::string& header, UINT32& epsgCode) { // Print formatted header print_file_header(*f_out, header); - *f_out << setw(PRINT_VAR_PAD) << left << "File name:" << system_complete(out_file).string() << endl << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "File name:" << boost::filesystem::system_complete(out_file).string() << std::endl << std::endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Command line arguments: "; - *f_out << p->r.command_line_arguments << endl << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Command line arguments: "; + *f_out << p->r.command_line_arguments << std::endl << std::endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Network name:" << p->g.network_name << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Input folder: " << system_complete(p->g.input_folder).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Output folder: " << system_complete(p->g.output_folder).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Stations file:" << system_complete(p->r.bst_file).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Measurements file:" << system_complete(p->r.bms_file).string() << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Target reference frame:" << p->r.reference_frame << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Network name:" << p->g.network_name << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Input folder: " << boost::filesystem::system_complete(p->g.input_folder).string() << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Output folder: " << boost::filesystem::system_complete(p->g.output_folder).string() << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Stations file:" << boost::filesystem::system_complete(p->r.bst_file).string() << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Measurements file:" << boost::filesystem::system_complete(p->r.bms_file).string() << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Target reference frame:" << p->r.reference_frame << std::endl; if (!p->r.epoch.empty()) { // Has the user supplied the year only? - if (p->r.epoch.rfind(".") == string::npos) + if (p->r.epoch.rfind(".") == std::string::npos) p->r.epoch.insert(0, "01.01."); - *f_out << setw(PRINT_VAR_PAD) << left << "Target epoch: " << - formattedDateStringFromNumericString(p->r.epoch); + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Target epoch: " << + formattedDateStringFromNumericString(p->r.epoch); if (isEpsgDatumStatic(epsgCode)) *f_out << " (ignored: " << p->r.reference_frame << " is static)"; - *f_out << endl; + *f_out << std::endl; } if (p->r.plate_model_option > 0) { - *f_out << setw(PRINT_VAR_PAD) << left << "Plate boundaries file: " << p->r.tpb_file << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "Plate pole parameter file: " << p->r.tpp_file << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Plate boundaries file: " << p->r.tpb_file << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Plate pole parameter file: " << p->r.tpp_file << std::endl; } if (p->i.export_dynaml) { if (p->i.export_single_xml_file) - *f_out << setw(PRINT_VAR_PAD) << left << "DynaML output file: " << p->i.xml_outfile << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "DynaML output file: " << p->i.xml_outfile << std::endl; else { - *f_out << setw(PRINT_VAR_PAD) << left << "DynaML station file: " << p->i.xml_stnfile << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "DynaML measurement file: " << p->i.xml_msrfile << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "DynaML station file: " << p->i.xml_stnfile << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "DynaML measurement file: " << p->i.xml_msrfile << std::endl; } } if (p->i.export_dna_files) { - *f_out << setw(PRINT_VAR_PAD) << left << "DNA station file: " << p->i.dna_stnfile << endl; - *f_out << setw(PRINT_VAR_PAD) << left << "DNA measurement file: " << p->i.dna_msrfile << endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "DNA station file: " << p->i.dna_stnfile << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "DNA measurement file: " << p->i.dna_msrfile << std::endl; } // if (p->o._export_snx_file) -// *f_out << setw(PRINT_VAR_PAD) << left << "SINEX file: " << p->o._snx_file << endl; +// *f_out << std::setw(PRINT_VAR_PAD) << std::left << "SINEX file: " << p->o._snx_file << std::endl; - *f_out << OUTPUTLINE << endl << endl; + *f_out << OUTPUTLINE << std::endl << std::endl; } -int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& vm, project_settings& p, UINT32& epsgCode) +int ParseCommandLineOptions(const int& argc, char* argv[], const boost::program_options::variables_map& vm, project_settings& p, UINT32& epsgCode) { // capture command line arguments for (int cmd_arg(0); cmd_arg(p.g.output_folder, p.g.network_name, "dnaproj"); - p.r.rft_file = formPath(p.g.output_folder, p.g.network_name, "rft"); + p.g.project_file = formPath(p.g.output_folder, p.g.network_name, "dnaproj"); + p.r.rft_file = formPath(p.g.output_folder, p.g.network_name, "rft"); bool frameSupplied(true); project_settings tmp; if (!vm.count(REFERENCE_FRAME)) { - if (exists(p.g.project_file)) + if (boost::filesystem::exists(p.g.project_file)) { try { CDnaProjectFile projectFile(p.g.project_file, reftranSetting); @@ -135,22 +135,22 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& p.r.reference_frame = tmp.r.reference_frame; frameSupplied = false; } - catch (const runtime_error& e) { - cout << endl << "- Error: " << e.what() << endl; + catch (const std::runtime_error& e) { + std::cout << std::endl << "- Error: " << e.what() << std::endl; return EXIT_FAILURE; } } - //cout << endl << "- Reference frame was not supplied. Using project default (" << p.r.reference_frame << ")" << endl << endl; + //cout << std::endl << "- Reference frame was not supplied. Using project default (" << p.r.reference_frame << ")" << std::endl << std::endl; try { // Okay, no frame supplied, check the frame in the project settings. // The following throws an exception if the frame is unknown - string epsg = epsgStringFromName(p.r.reference_frame); + std::string epsg = epsgStringFromName(p.r.reference_frame); } - catch (const runtime_error& e) { - cout << endl << "- Error: " << e.what() << endl; + catch (const std::runtime_error& e) { + std::cout << std::endl << "- Error: " << e.what() << std::endl; return EXIT_FAILURE; } @@ -165,58 +165,58 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (frameSupplied) // Okay, frame supplied, but no epoch supplied. // Set the epoch to be the reference epoch of the supplied reference frame - p.r.epoch = referenceepochFromEpsgCode(epsgCodeFromName(p.r.reference_frame)); + p.r.epoch = referenceepochFromEpsgCode(epsgCodeFromName(p.r.reference_frame)); else // Take the epoch from the project file p.r.epoch = tmp.r.epoch; } - catch (const runtime_error& e) { - cout << endl << "- Error: " << e.what() << endl; + catch (const std::runtime_error& e) { + std::cout << std::endl << "- Error: " << e.what() << std::endl; return EXIT_FAILURE; } } if (vm.count(TECTONIC_PLATE_BDY_FILE)) { - if (!exists(p.r.tpb_file)) + if (!boost::filesystem::exists(p.r.tpb_file)) { - cout << endl << "- Error: "; - cout << endl << "tectonic plate boundary file " << endl << " "; - cout << p.r.tpb_file << " does not exist." << endl << endl; + std::cout << std::endl << "- Error: "; + std::cout << std::endl << "tectonic plate boundary file " << std::endl << " "; + std::cout << p.r.tpb_file << " does not exist." << std::endl << std::endl; return EXIT_FAILURE; } } if (vm.count(TECTONIC_PLATE_POLE_FILE)) { - if (!exists(p.r.tpp_file)) + if (!boost::filesystem::exists(p.r.tpp_file)) { - cout << endl << "- Error: "; - cout << endl << "Euler pole parameters file " << endl << " "; - cout << p.r.tpp_file << " does not exist." << endl << endl; + std::cout << std::endl << "- Error: "; + std::cout << std::endl << "Euler pole parameters file " << std::endl << " "; + std::cout << p.r.tpp_file << " does not exist." << std::endl << std::endl; return EXIT_FAILURE; } } // binary station file location (input) if (vm.count(BIN_STN_FILE)) - p.r.bst_file = formPath(p.g.input_folder, p.r.bst_file); + p.r.bst_file = formPath(p.g.input_folder, p.r.bst_file); else - p.r.bst_file = formPath(p.g.output_folder, p.g.network_name, "bst"); + p.r.bst_file = formPath(p.g.output_folder, p.g.network_name, "bst"); // binary station file location (input) if (vm.count(BIN_MSR_FILE)) - p.r.bms_file = formPath(p.g.input_folder, p.r.bms_file); + p.r.bms_file = formPath(p.g.input_folder, p.r.bms_file); else - p.r.bms_file = formPath(p.g.output_folder, p.g.network_name, "bms"); + p.r.bms_file = formPath(p.g.output_folder, p.g.network_name, "bms"); - if (!exists(p.r.bst_file) || !exists(p.r.bms_file)) + if (!boost::filesystem::exists(p.r.bst_file) || !boost::filesystem::exists(p.r.bms_file)) { - cout << endl << "- Nothing to do: "; + std::cout << std::endl << "- Nothing to do: "; if (p.g.network_name.empty()) - cout << endl << "network name has not been specified specified, and " << endl << " "; - cout << p.r.bst_file << " and " << p.r.bms_file << " do not exist." << endl << endl; + std::cout << std::endl << "network name has not been specified specified, and " << std::endl << " "; + std::cout << p.r.bst_file << " and " << p.r.bms_file << " do not exist." << std::endl << std::endl; return EXIT_FAILURE; } @@ -227,13 +227,13 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& // Export options // Create file name based on the provided block - string fileName(p.g.network_name); + std::string fileName(p.g.network_name); fileName.append(".").append(p.r.reference_frame); if (!isEpsgDatumStatic(epsgCode)) { - if (iequals(p.r.epoch, "today")) - p.r.epoch = stringFromToday(); + if (boost::iequals(p.r.epoch, "today")) + p.r.epoch = stringFromToday(); fileName.append(".").append(p.r.epoch); } @@ -246,16 +246,16 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (vm.count(EXPORT_SINGLE_XML_FILE)) { p.i.export_single_xml_file = 1; - p.i.xml_outfile = formPath(p.g.output_folder, + p.i.xml_outfile = formPath(p.g.output_folder, fileName, "xml"); } // unique files for stations and measurements else { p.i.export_single_xml_file = 0; - p.i.xml_stnfile = formPath(p.g.output_folder, + p.i.xml_stnfile = formPath(p.g.output_folder, fileName + "stn", "xml"); - p.i.xml_msrfile = formPath(p.g.output_folder, + p.i.xml_msrfile = formPath(p.g.output_folder, fileName + "msr", "xml"); } } @@ -264,9 +264,9 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (vm.count(EXPORT_DNA_FILES)) { p.i.export_dna_files = 1; - p.i.dna_stnfile = formPath(p.g.output_folder, + p.i.dna_stnfile = formPath(p.g.output_folder, fileName, "stn"); - p.i.dna_msrfile = formPath(p.g.output_folder, + p.i.dna_msrfile = formPath(p.g.output_folder, fileName, "msr"); } @@ -274,7 +274,7 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& // if (vm.count(EXPORT_SNX_FILE)) // { // p.o._export_snx_file = 1; -// p.o._snx_file = formPath(p.g.output_folder, +// p.o._snx_file = formPath(p.g.output_folder, // fileName, "snx"); // } @@ -284,57 +284,57 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& int main(int argc, char* argv[]) { // create banner message - string cmd_line_banner; + std::string cmd_line_banner; fileproc_help_header(&cmd_line_banner); project_settings p; - variables_map vm; - positional_options_description positional_options; + boost::program_options::variables_map vm; + boost::program_options::positional_options_description positional_options; - options_description standard_options("+ " + string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description transformation_options("+ " + string(REFTRAN_MODULE_TRANSFORM), PROGRAM_OPTIONS_LINE_LENGTH); - options_description export_options("+ " + string(ALL_MODULE_EXPORT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description generic_options("+ " + string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description standard_options("+ " + std::string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description transformation_options("+ " + std::string(REFTRAN_MODULE_TRANSFORM), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description export_options("+ " + std::string(ALL_MODULE_EXPORT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description generic_options("+ " + std::string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); - string cmd_line_usage("+ "); + std::string cmd_line_usage("+ "); cmd_line_usage.append(__BINARY_NAME__).append(" usage: ").append(__BINARY_NAME__).append(" ").append(NETWORK_NAME).append(" [options]"); - options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); try { // Declare a group of options that will be // allowed only on command line standard_options.add_options() - (PROJECT_FILE_P, value(&p.g.project_file), + (PROJECT_FILE_P, boost::program_options::value(&p.g.project_file), "Project file name. Full path to project file. If none specified, a new file is created using input-folder and network-name.") - (NETWORK_NAME_N, value(&p.g.network_name), + (NETWORK_NAME_N, boost::program_options::value(&p.g.network_name), "Network name. User defined name for all output files. Default is \"network#\".") - (INPUT_FOLDER_I, value(&p.g.input_folder), + (INPUT_FOLDER_I, boost::program_options::value(&p.g.input_folder), "Path containing all input files") - (OUTPUT_FOLDER_O, value(&p.g.output_folder), // default is ./, + (OUTPUT_FOLDER_O, boost::program_options::value(&p.g.output_folder), // default is ./, "Path for all output files") - (BIN_STN_FILE, value(&p.r.bst_file), + (BIN_STN_FILE, boost::program_options::value(&p.r.bst_file), "Binary station file name. Overrides network name.") - (BIN_MSR_FILE, value(&p.r.bms_file), + (BIN_MSR_FILE, boost::program_options::value(&p.r.bms_file), "Binary measurement file name. Overrides network name.") ; transformation_options.add_options() - (REFERENCE_FRAME_R, value(&p.r.reference_frame), + (REFERENCE_FRAME_R, boost::program_options::value(&p.r.reference_frame), "Target reference frame for all stations and datum-dependent measurements.") - (EPOCH_E, value(&p.r.epoch), + (EPOCH_E, boost::program_options::value(&p.r.epoch), "Projected date for the transformed stations and measurements. arg is a dot delimited string \"dd.mm.yyyy\", or \"today\" if today's date is required. If no date is supplied, the reference epoch of the supplied reference frame will be used.") - (TECTONIC_PLATE_MODEL_OPTION, value(&p.r.plate_model_option), - string("Plate motion model option.\n" + (TECTONIC_PLATE_MODEL_OPTION, boost::program_options::value(&p.r.plate_model_option), + std::string("Plate motion model option.\n" " 0: Assume all stations are on the Australian plate (default)\n" " 1: Interpolate plate motion model parameters from a defined\n" " set of global tectonic plates. For this option, a global\n" " tectonic plate boundary file and corresponding Euler\n" " pole parameters file must be provided.").c_str()) - (TECTONIC_PLATE_BDY_FILE_B, value(&p.r.tpb_file), - string("Global tectonic plate boundaries.").c_str()) - (TECTONIC_PLATE_POLE_FILE_M, value(&p.r.tpp_file), - string("Euler pole parameters corresponding to the global tectonic plate boundaries supplied with option --" + + (TECTONIC_PLATE_BDY_FILE_B, boost::program_options::value(&p.r.tpb_file), + std::string("Global tectonic plate boundaries.").c_str()) + (TECTONIC_PLATE_POLE_FILE_M, boost::program_options::value(&p.r.tpp_file), + std::string("Euler pole parameters corresponding to the global tectonic plate boundaries supplied with option --" + StringFromT(TECTONIC_PLATE_BDY_FILE) + ".").c_str()) ; @@ -351,13 +351,13 @@ int main(int argc, char* argv[]) ; generic_options.add_options() - (VERBOSE, value(&p.g.verbose), - string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information\n 3: Debug level information").c_str()) + (VERBOSE, boost::program_options::value(&p.g.verbose), + std::string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information\n 3: Debug level information").c_str()) (QUIET, - string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) + std::string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) (VERSION_V, "Display the current program version") (HELP_H, "Show this help message") - (HELP_MODULE_H, value(), + (HELP_MODULE_H, boost::program_options::value(), "Provide help for a specific help category.") ; @@ -366,61 +366,61 @@ int main(int argc, char* argv[]) // add "positional options" to handle command line tokens which have no option name positional_options.add(NETWORK_NAME, -1); - command_line_parser parser(argc, argv); + boost::program_options::command_line_parser parser(argc, argv); store(parser.options(allowable_options).positional(positional_options).run(), vm); notify(vm); } catch (const std::exception& e) { - cout << "- Error: " << e.what() << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << "- Error: " << e.what() << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } catch (...) { - cout << "+ Exception of unknown type!\n"; + std::cout << "+ Exception of unknown type!\n"; return EXIT_FAILURE; } if (argc < 2) { - cout << endl << "- Nothing to do - no options provided. " << endl << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << std::endl << "- Nothing to do - no options provided. " << std::endl << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } if (vm.count(VERSION)) { - cout << cmd_line_banner << endl; + std::cout << cmd_line_banner << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP)) { - cout << cmd_line_banner << allowable_options << endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP_MODULE)) { - cout << cmd_line_banner; - string original_text = vm[HELP_MODULE].as(); - string help_text = str_upper(original_text); + std::cout << cmd_line_banner; + std::string original_text = vm[HELP_MODULE].as(); + std::string help_text = str_upper(original_text); - if (str_upper(ALL_MODULE_STDOPT).find(help_text) != string::npos) { - cout << standard_options << endl; + if (str_upper(ALL_MODULE_STDOPT).find(help_text) != std::string::npos) { + std::cout << standard_options << std::endl; } - else if (str_upper(REFTRAN_MODULE_TRANSFORM).find(help_text) != string::npos) { - cout << transformation_options << endl; + else if (str_upper(REFTRAN_MODULE_TRANSFORM).find(help_text) != std::string::npos) { + std::cout << transformation_options << std::endl; } - else if (str_upper(ALL_MODULE_EXPORT).find(help_text) != string::npos) { - cout << export_options << endl; + else if (str_upper(ALL_MODULE_EXPORT).find(help_text) != std::string::npos) { + std::cout << export_options << std::endl; } - else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != string::npos) { - cout << generic_options << endl; + else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != std::string::npos) { + std::cout << generic_options << std::endl; } else { - cout << endl << "- Error: Help module '" << - original_text << "' is not in the list of options." << endl; + std::cout << std::endl << "- Error: Help module '" << + original_text << "' is not in the list of options." << std::endl; return EXIT_FAILURE; } @@ -431,13 +431,13 @@ int main(int argc, char* argv[]) { if (!vm.count(TECTONIC_PLATE_BDY_FILE)) { - cout << endl << "- Error: A plate boundary file must be supplied in order to interpolate plate motion model parameters. See command line help for further information." << endl; + std::cout << std::endl << "- Error: A plate boundary file must be supplied in order to interpolate plate motion model parameters. See command line help for further information." << std::endl; return EXIT_FAILURE; } if (!vm.count(TECTONIC_PLATE_POLE_FILE)) { - cout << endl << "- Error: A Euler pole parameters file must be supplied in order to interpolate plate motion model parameters. See command line help for further information." << endl; + std::cout << std::endl << "- Error: A Euler pole parameters file must be supplied in order to interpolate plate motion model parameters. See command line help for further information." << std::endl; return EXIT_FAILURE; } } @@ -452,10 +452,10 @@ int main(int argc, char* argv[]) // Create import log file. Throws runtime_error on failure. file_opener(rft_file, p.r.rft_file); } - catch (const runtime_error& e) { - stringstream ss; - ss << "- Error: Could not open " << p.r.rft_file << ". \n Check that the file exists and that the file is not already opened." << endl; - cout << ss.str() << e.what() << endl; + catch (const std::runtime_error& e) { + std::stringstream ss; + ss << "- Error: Could not open " << p.r.rft_file << ". \n Check that the file exists and that the file is not already opened." << std::endl; + std::cout << ss.str() << e.what() << std::endl; return EXIT_FAILURE; } @@ -464,19 +464,19 @@ int main(int argc, char* argv[]) if (!p.g.quiet) { - cout << endl << cmd_line_banner; + std::cout << std::endl << cmd_line_banner; - cout << "+ Options:" << endl; - cout << setw(PRINT_VAR_PAD) << left << " Network name: " << p.g.network_name << endl; - cout << setw(PRINT_VAR_PAD) << left << " Input folder: " << p.g.input_folder << endl; - cout << setw(PRINT_VAR_PAD) << left << " Output folder: " << p.g.output_folder << endl; - cout << setw(PRINT_VAR_PAD) << left << " Binary station file: " << p.r.bst_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Binary measurement file: " << p.r.bms_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Target reference frame: " << p.r.reference_frame; + std::cout << "+ Options:" << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Network name: " << p.g.network_name << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Input folder: " << p.g.input_folder << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Output folder: " << p.g.output_folder << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Binary station file: " << p.r.bst_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Binary measurement file: " << p.r.bms_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Target reference frame: " << p.r.reference_frame; if (vm.count(REFERENCE_FRAME)) - cout << " (user supplied)" << endl; + std::cout << " (user supplied)" << std::endl; else - cout << " (project default)" << endl; + std::cout << " (project default)" << std::endl; // try to parse user supplied string. If this fails, then there's not much point in attempting // to transform stations and measurements @@ -485,65 +485,65 @@ int main(int argc, char* argv[]) if (!p.r.epoch.empty()) { // Has the user supplied the year only? - if (p.r.epoch.rfind(".") == string::npos) + if (p.r.epoch.rfind(".") == std::string::npos) p.r.epoch.insert(0, "01.01."); - cout << setw(PRINT_VAR_PAD) << left << " Target epoch: " << - formattedDateStringFromNumericString(p.r.epoch); + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Target epoch: " << + formattedDateStringFromNumericString(p.r.epoch); if (isEpsgDatumStatic(epsgCode)) - cout << " (ignored: " << p.r.reference_frame << " is static)"; - cout << endl; + std::cout << " (ignored: " << p.r.reference_frame << " is static)"; + std::cout << std::endl; } } - catch (const runtime_error& e) { - cout << endl << "- Error: " << e.what() << endl; + catch (const std::runtime_error& e) { + std::cout << std::endl << "- Error: " << e.what() << std::endl; rft_file.close(); return EXIT_FAILURE; } catch (const RefTranException& e) { - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; rft_file.close(); return EXIT_FAILURE; } catch (...) { - cout << endl << "- Error: Unknown error." << endl; + std::cout << std::endl << "- Error: Unknown error." << std::endl; rft_file.close(); return EXIT_FAILURE; } if (p.r.plate_model_option > 0) { - cout << setw(PRINT_VAR_PAD) << left << " Plate boundaries file: " << p.r.tpb_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Plate pole parameter file: " << p.r.tpp_file << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Plate boundaries file: " << p.r.tpb_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Plate pole parameter file: " << p.r.tpp_file << std::endl; } // Export options if (p.i.export_dynaml) { if (p.i.export_single_xml_file) - cout << setw(PRINT_VAR_PAD) << left << " DynaML output file: " << p.i.xml_outfile << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " DynaML output file: " << p.i.xml_outfile << std::endl; else { - cout << setw(PRINT_VAR_PAD) << left << " DynaML station file: " << p.i.xml_stnfile << endl; - cout << setw(PRINT_VAR_PAD) << left << " DynaML measurement file: " << p.i.xml_msrfile << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " DynaML station file: " << p.i.xml_stnfile << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " DynaML measurement file: " << p.i.xml_msrfile << std::endl; } } if (p.i.export_dna_files) { - cout << setw(PRINT_VAR_PAD) << left << " DNA station file: " << p.i.dna_stnfile << endl; - cout << setw(PRINT_VAR_PAD) << left << " DNA measurement file: " << p.i.dna_msrfile << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " DNA station file: " << p.i.dna_stnfile << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " DNA measurement file: " << p.i.dna_msrfile << std::endl; } // if (p.o._export_snx_file) -// cout << setw(PRINT_VAR_PAD) << left << " SINEX file: " << p.o._snx_file << endl; +// std::cout << std::setw(PRINT_VAR_PAD) << std::left << " SINEX file: " << p.o._snx_file << std::endl; - cout << endl; + std::cout << std::endl; } PrintOutputFileHeaderInfo(&rft_file, p.r.rft_file, &p, "DYNADJUST REFTRAN LOG FILE", epsgCode); dna_reftran refTran(p, &rft_file); - stringstream ss_msg; + std::stringstream ss_msg; // Load plate boundary and euler pole information if (vm.count(TECTONIC_PLATE_MODEL_OPTION)) @@ -551,33 +551,33 @@ int main(int argc, char* argv[]) ss_msg << "+ Loading global tectonic plate boundaries and plate motion information... "; if (!p.g.quiet) - cout << ss_msg.str(); + std::cout << ss_msg.str(); rft_file << ss_msg.str(); try { refTran.LoadTectonicPlateParameters(p.r.tpb_file, p.r.tpp_file); } - catch (const runtime_error& e) { - cout << endl << "- Error: " << e.what() << endl; - rft_file << endl << "- Error: " << e.what() << endl; + catch (const std::runtime_error& e) { + std::cout << std::endl << "- Error: " << e.what() << std::endl; + rft_file << std::endl << "- Error: " << e.what() << std::endl; rft_file.close(); return EXIT_FAILURE; } if (!p.g.quiet) - cout << "done." << endl; + std::cout << "done." << std::endl; if (p.g.verbose == 0) - rft_file << "done." << endl; + rft_file << "done." << std::endl; else - rft_file << endl << "+ Done." << endl << endl; + rft_file << std::endl << "+ Done." << std::endl << std::endl; } ss_msg.str(""); ss_msg << "+ Transforming stations and measurements... "; if (!p.g.quiet) - cout << ss_msg.str(); + std::cout << ss_msg.str(); rft_file << ss_msg.str(); ss_msg.str(""); @@ -588,9 +588,9 @@ int main(int argc, char* argv[]) refTran.TransformBinaryFiles(p.r.bst_file, p.r.bms_file, p.r.reference_frame, p.r.epoch); } - catch (const runtime_error& e) { - cout << endl << "- Error: " << e.what() << endl; - rft_file << endl << "- Error: " << e.what() << endl; + catch (const std::runtime_error& e) { + std::cout << std::endl << "- Error: " << e.what() << std::endl; + rft_file << std::endl << "- Error: " << e.what() << std::endl; rft_file.close(); return EXIT_FAILURE; } @@ -600,25 +600,25 @@ int main(int argc, char* argv[]) case REFTRAN_WGS84_TRANS_UNSUPPORTED: break; } - cout << endl << endl << "- Error: " << e.what() << endl; - rft_file << endl << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << std::endl << "- Error: " << e.what() << std::endl; + rft_file << std::endl << std::endl << "- Error: " << e.what() << std::endl; rft_file.close(); return EXIT_FAILURE; } catch (...) { - cout << endl << "- Error: Unknown error." << endl; - rft_file << endl << "- Error: Unknown error." << endl; + std::cout << std::endl << "- Error: Unknown error." << std::endl; + rft_file << std::endl << "- Error: Unknown error." << std::endl; rft_file.close(); return EXIT_FAILURE; } if (!p.g.quiet) - cout << "done." << endl; + std::cout << "done." << std::endl; if (p.g.verbose == 0) - rft_file << "done." << endl; + rft_file << "done." << std::endl; else - rft_file << endl << "+ Done." << endl << endl; + rft_file << std::endl << "+ Done." << std::endl << std::endl; ss_msg.str(""); @@ -628,15 +628,15 @@ int main(int argc, char* argv[]) ss_msg << "+ Transformed " << refTran.StationsTransformed(); if (refTran.StationsTransformed() == 1) - ss_msg << " station." << endl; + ss_msg << " station." << std::endl; else - ss_msg << " stations." << endl; + ss_msg << " stations." << std::endl; } else - ss_msg << "+ No stations were transformed." << endl; + ss_msg << "+ No stations were transformed." << std::endl; if (!p.g.quiet) - cout << ss_msg.str(); + std::cout << ss_msg.str(); rft_file << ss_msg.str(); ss_msg.str(""); @@ -660,11 +660,11 @@ int main(int argc, char* argv[]) if (!p.r.epoch.empty()) ss_msg << ", epoch " << p.r.epoch; } - ss_msg << endl; + ss_msg << std::endl; } if (!p.g.quiet) - cout << ss_msg.str(); + std::cout << ss_msg.str(); rft_file << ss_msg.str(); ss_msg.str(""); @@ -675,15 +675,15 @@ int main(int argc, char* argv[]) ss_msg << "+ Transformed " << refTran.MeasurementsTransformed(); if (refTran.MeasurementsTransformed() == 1) - ss_msg << " measurement." << endl; + ss_msg << " measurement." << std::endl; else - ss_msg << " measurements." << endl; + ss_msg << " measurements." << std::endl; } else - ss_msg << "+ No measurements were transformed." << endl; + ss_msg << "+ No measurements were transformed." << std::endl; if (!p.g.quiet) - cout << ss_msg.str(); + std::cout << ss_msg.str(); rft_file << ss_msg.str(); ss_msg.str(""); @@ -707,12 +707,12 @@ int main(int argc, char* argv[]) if (!p.r.epoch.empty()) ss_msg << ", epoch " << p.r.epoch; } - ss_msg << endl; + ss_msg << std::endl; } if (!p.g.quiet) - cout << ss_msg.str() << endl; - rft_file << ss_msg.str() << endl; + std::cout << ss_msg.str() << std::endl; + rft_file << ss_msg.str() << std::endl; ss_msg.str(""); @@ -725,9 +725,9 @@ int main(int argc, char* argv[]) // Single output file if (!p.g.quiet) { - cout << "+ Exporting stations and measurements to " << leafStr(p.i.xml_outfile) << "... "; - cout.flush(); - rft_file << "+ Exporting stations and measurements to " << leafStr(p.i.xml_outfile) << "... "; + std::cout << "+ Exporting stations and measurements to " << leafStr(p.i.xml_outfile) << "... "; + std::cout.flush(); + rft_file << "+ Exporting stations and measurements to " << leafStr(p.i.xml_outfile) << "... "; } refTran.SerialiseDynaML( p.i.xml_outfile, @@ -738,13 +738,13 @@ int main(int argc, char* argv[]) // Separate output files (default) if (!p.g.quiet) { - cout << "+ Exporting stations and measurements to:" << endl << - " - " << leafStr(p.i.xml_stnfile) << endl << - " - " << leafStr(p.i.xml_msrfile) << "... "; - cout.flush(); - rft_file << "+ Exporting stations and measurements to:" << endl << - " - " << leafStr(p.i.xml_stnfile) << endl << - " - " << leafStr(p.i.xml_msrfile) << "... "; + std::cout << "+ Exporting stations and measurements to:" << std::endl << + " - " << leafStr(p.i.xml_stnfile) << std::endl << + " - " << leafStr(p.i.xml_msrfile) << "... "; + std::cout.flush(); + rft_file << "+ Exporting stations and measurements to:" << std::endl << + " - " << leafStr(p.i.xml_stnfile) << std::endl << + " - " << leafStr(p.i.xml_msrfile) << "... "; } refTran.SerialiseDynaML( p.i.xml_stnfile, p.i.xml_msrfile, @@ -753,17 +753,17 @@ int main(int argc, char* argv[]) if (!p.g.quiet) { - cout << "done." << endl; - cout.flush(); + std::cout << "done." << std::endl; + std::cout.flush(); } - rft_file << "done." << endl; + rft_file << "done." << std::endl; } catch (const XMLInteropException& e) { - cout.flush(); - cout << endl << "- Error: " << e.what() << endl; - rft_file << endl << "- Error: " << e.what() << endl; + std::cout.flush(); + std::cout << std::endl << "- Error: " << e.what() << std::endl; + rft_file << std::endl << "- Error: " << e.what() << std::endl; rft_file.close(); return EXIT_FAILURE; } @@ -775,27 +775,27 @@ int main(int argc, char* argv[]) // Separate output files (default) if (!p.g.quiet) { - cout << "+ Exporting stations and measurements to:" << endl << - " - " << leafStr(p.i.dna_stnfile) << endl << - " - " << leafStr(p.i.dna_msrfile) << "... "; - cout.flush(); + std::cout << "+ Exporting stations and measurements to:" << std::endl << + " - " << leafStr(p.i.dna_stnfile) << std::endl << + " - " << leafStr(p.i.dna_msrfile) << "... "; + std::cout.flush(); } - rft_file << "+ Exporting stations and measurements to:" << endl << - " - " << leafStr(p.i.dna_stnfile) << endl << - " - " << leafStr(p.i.dna_msrfile) << "... "; + rft_file << "+ Exporting stations and measurements to:" << std::endl << + " - " << leafStr(p.i.dna_stnfile) << std::endl << + " - " << leafStr(p.i.dna_msrfile) << "... "; refTran.SerialiseDNA( p.i.dna_stnfile, p.i.dna_msrfile, (p.i.flag_unused_stn ? true : false)); if (!p.g.quiet) - cout << "Done." << endl; - rft_file << "Done." << endl; + std::cout << "Done." << std::endl; + rft_file << "Done." << std::endl; } catch (const XMLInteropException& e) { - cout.flush(); - cout << endl << "- Error: " << e.what() << endl; - rft_file << endl << "- Error: " << e.what() << endl; + std::cout.flush(); + std::cout << std::endl << "- Error: " << e.what() << std::endl; + rft_file << std::endl << "- Error: " << e.what() << std::endl; rft_file.close(); return EXIT_FAILURE; } @@ -806,40 +806,40 @@ int main(int argc, char* argv[]) // { // // Export to SINEX // if (!p.g.quiet) -// cout << "+ Exporting stations and measurements to " << -// leafStr(p.o._snx_file) << "... "; -// cout.flush(); +// std::cout << "+ Exporting stations and measurements to " << +// leafStr(p.o._snx_file) << "... "; +// std::cout.flush(); // rft_file << "+ Exporting stations and measurements to " << -// leafStr(p.o._snx_file) << "... "; +// leafStr(p.o._snx_file) << "... "; // // bool success(refTran.PrintTransformedStationCoordinatestoSNX()); // // // SomeFunc() // if (!p.g.quiet) -// cout << " done." << endl; -// rft_file << " done." << endl; +// std::cout << " done." << std::endl; +// rft_file << " done." << std::endl; // // ss_msg.str(""); // // if (!success) // { -// ss_msg << "- Warning: The SINEX export process produced some warnings." << endl; -// ss_msg << " See " << p.g.network_name << "*.snx.err for details." << endl; +// ss_msg << "- Warning: The SINEX export process produced some warnings." << std::endl; +// ss_msg << " See " << p.g.network_name << "*.snx.err for details." << std::endl; // } -// cout << ss_msg.str(); +// std::cout << ss_msg.str(); // rft_file << ss_msg.str(); // } if (!p.g.quiet) { - cout << endl; + std::cout << std::endl; } // Look for a project file. If it exists, open and load it. // Update the import settings. // Print the project file. If it doesn't exist, it will be created. CDnaProjectFile projectFile; - if (exists(p.g.project_file)) + if (boost::filesystem::exists(p.g.project_file)) projectFile.LoadProjectFile(p.g.project_file); projectFile.UpdateSettingsReftran(p); diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.hpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.hpp index b35116e4..4dd9fa88 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.hpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.hpp @@ -62,16 +62,6 @@ #include #include - -using namespace std; -using namespace boost; -using namespace boost::gregorian; -using namespace boost::filesystem; -using namespace boost::posix_time; -using namespace boost::local_time; -using namespace boost::program_options; -namespace po = boost::program_options; - using namespace dynadjust::referenceframe; using namespace dynadjust::exception; using namespace dynadjust::iostreams; diff --git a/dynadjust/dynadjust/dnasegment/dnasegment.cpp b/dynadjust/dynadjust/dnasegment/dnasegment.cpp index ac243b72..5437e789 100644 --- a/dynadjust/dynadjust/dnasegment/dnasegment.cpp +++ b/dynadjust/dynadjust/dnasegment/dnasegment.cpp @@ -49,13 +49,13 @@ void dna_segment::LoadNetFile() try { // Load net file. Throws runtime_error on failure. file_opener(net_file, projectSettings_.s.net_file, - ios::in, ascii, true); + std::ios::in, ascii, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionSerialise(e.what(), 0, NULL); } - string station; + std::string station; char line[PROGRAM_OPTIONS_LINE_LENGTH]; // read header lines @@ -76,12 +76,12 @@ void dna_segment::LoadNetFile() vinitialStns_.push_back(station); } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if (!net_file.eof()) { - stringstream ss; - ss << "ParseStartingStations(): An error was encountered when reading " << projectSettings_.s.net_file << "." << endl << f.what(); + std::stringstream ss; + ss << "ParseStartingStations(): An error was encountered when reading " << projectSettings_.s.net_file << "." << std::endl << f.what(); SignalExceptionSerialise(ss.str(), 0, "i", &net_file); } } @@ -95,7 +95,7 @@ void dna_segment::ParseStartingStations() // Rememeber, calling app should make sure that // projectSettings_.s.net_file contains a valid path if // the user wants to use a net file. - if (exists(projectSettings_.s.net_file.c_str())) + if (boost::filesystem::exists(projectSettings_.s.net_file.c_str())) LoadNetFile(); // OK, now get the additionalstations on the command line @@ -106,9 +106,9 @@ void dna_segment::ParseStartingStations() try { // Extract stations from comma delimited string - SplitDelimitedString( + SplitDelimitedString( projectSettings_.s.seg_starting_stns, // the comma delimited string - string(","), // the delimiter + std::string(","), // the delimiter &cmd_line_stations); // the respective values } catch (...) { @@ -175,33 +175,33 @@ _SEGMENT_STATUS_ dna_segment::SegmentNetwork(project_settings* p) if ((debug_level_ = p->g.verbose) > 2) { - string s(p->s.seg_file + ".trace"); + std::string s(p->s.seg_file + ".trace"); try { // Create trace file. Throws runtime_error on failure. file_opener(trace_file, s); print_file_header(trace_file, "DYNADJUST SEGMENTATION TRACE FILE"); - trace_file << OUTPUTLINE << endl << endl; + trace_file << OUTPUTLINE << std::endl << std::endl; } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionSerialise(e.what(), 0, NULL); } } if ((debug_level_ = p->g.verbose) > 1) { - string s(p->s.seg_file + ".debug"); + std::string s(p->s.seg_file + ".debug"); try { // Create debug file. Throws runtime_error on failure. file_opener(debug_file, s); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { SignalExceptionSerialise(f.what(), 0, NULL); } } segmentStatus_ = SEGMENT_SUCCESS; - ostringstream ss; + std::ostringstream ss; if (debug_level_ > 2) WriteFreeStnListSortedbyASLMsrCount(); @@ -209,9 +209,9 @@ _SEGMENT_STATUS_ dna_segment::SegmentNetwork(project_settings* p) currentBlock_ = 1; if (debug_level_ > 2) - trace_file << "Block " << currentBlock_ << "..." << endl; + trace_file << "Block " << currentBlock_ << "..." << std::endl; - cpu_timer time; + boost::timer::cpu_timer time; v_ContiguousNetList_.clear(); v_ContiguousNetList_.push_back(currentNetwork_ = 0); @@ -238,7 +238,7 @@ _SEGMENT_STATUS_ dna_segment::SegmentNetwork(project_settings* p) currentBlock_++; if (debug_level_ > 2) - trace_file << "Block " << currentBlock_ << "..." << endl; + trace_file << "Block " << currentBlock_ << "..." << std::endl; v_ContiguousNetList_.push_back(currentNetwork_); @@ -251,9 +251,9 @@ _SEGMENT_STATUS_ dna_segment::SegmentNetwork(project_settings* p) break; } - milliseconds elapsed_time(milliseconds(0)); + boost::posix_time::milliseconds elapsed_time(boost::posix_time::milliseconds(0)); if (debug_level_ > 1) - elapsed_time = milliseconds(time.elapsed().wall/MILLI_TO_NANO); + elapsed_time = boost::posix_time::milliseconds(time.elapsed().wall/MILLI_TO_NANO); isProcessing_ = false; @@ -265,16 +265,16 @@ _SEGMENT_STATUS_ dna_segment::SegmentNetwork(project_settings* p) { valid_stations = 1; ss.str(""); - ss << endl << "- Warning: The following stations were not used:" << endl; + ss << std::endl << "- Warning: The following stations were not used:" << std::endl; ss << " "; it_vUINT32_const _it_freestn(vfreeStnList_.begin()); for (; _it_freestn!=vfreeStnList_.end(); ++_it_freestn) ss << bstBinaryRecords_.at(*_it_freestn).stationName << " "; - ss << endl; - ss << "- Possible reasons why these stations were not used include:" << endl; - ss << " - No measurements to these stations were found," << endl; - ss << " - The network is made up of non-contiguous blocks," << endl; - ss << " - There is a bug in this program." << endl; + ss << std::endl; + ss << "- Possible reasons why these stations were not used include:" << std::endl; + ss << " - No measurements to these stations were found," << std::endl; + ss << " - The network is made up of non-contiguous blocks," << std::endl; + ss << " - There is a bug in this program." << std::endl; if (debug_level_ > 1) debug_file << ss.str(); @@ -282,8 +282,8 @@ _SEGMENT_STATUS_ dna_segment::SegmentNetwork(project_settings* p) if (debug_level_ > 1) { - debug_file << formatedElapsedTime(&elapsed_time, "+ Network segmentation took ") << - " The network is now ready for adjustment." << endl; + debug_file << formatedElapsedTime(&elapsed_time, "+ Network segmentation took ") << + " The network is now ready for adjustment." << std::endl; debug_file.close(); } @@ -315,7 +315,7 @@ void dna_segment::CalculateAverageBlockSize() } -string dna_segment::DefaultStartingStation() +std::string dna_segment::DefaultStartingStation() { if (vfreeStnList_.empty()) return ""; @@ -375,7 +375,7 @@ void dna_segment::VerifyStationsandBuildBlock(bool validationOnly) if (it_stnmap_range.first == it_stnmap_range.second) { // If this point is reached, _it_stnmap->second is not a known network station - stringstream ss; + std::stringstream ss; ss << "VerifyStationsandBuildBlock(): " << *_it_name << " is not in the list of network stations."; SignalExceptionSerialise(ss.str(), 0, NULL); } @@ -410,7 +410,7 @@ void dna_segment::VerifyStationsandBuildBlock(bool validationOnly) { // If this point is reached, _it_stnmap->second is a known network station but is // invalid or has no measurements connected to it. - stringstream ss; + std::stringstream ss; ss << "VerifyStationsandBuildBlock(): " << bstBinaryRecords_.at(_it_stnmap->second).stationName << " does not have any measurements connected to it."; SignalExceptionSerialise(ss.str(), 0, NULL); } @@ -434,10 +434,10 @@ UINT32 dna_segment::SelectInner() UINT32 stn_index = *it_currjsl; if (debug_level_ > 2) - trace_file << " + Inner '" << bstBinaryRecords_.at(stn_index).stationName << "'" << endl; + trace_file << " + Inner '" << bstBinaryRecords_.at(stn_index).stationName << "'" << std::endl; #ifdef _MSDEBUG - string station_name = bstBinaryRecords_.at(stn_index).stationName; + std::string station_name = bstBinaryRecords_.at(stn_index).stationName; #endif // add this junction station to inner station list @@ -468,14 +468,14 @@ it_vUINT32 dna_segment::MoveStation(vUINT32& fromList, it_vUINT32 it_from, vUINT } -void dna_segment::MoveFreeStn(it_vUINT32 it_freeisl, vUINT32& toList, const UINT32& stn_index, const string& type) +void dna_segment::MoveFreeStn(it_vUINT32 it_freeisl, vUINT32& toList, const UINT32& stn_index, const std::string& type) { if (debug_level_ > 2) trace_file << " + New " << type << " station (" << stn_index << ") '" << - bstBinaryRecords_.at(stn_index).stationName << "'" << endl; + bstBinaryRecords_.at(stn_index).stationName << "'" << std::endl; #ifdef _MSDEBUG - string station_name = bstBinaryRecords_.at(stn_index).stationName; + std::string station_name = bstBinaryRecords_.at(stn_index).stationName; #endif // Mark this station as unavailable @@ -510,7 +510,7 @@ void dna_segment::BuildNextBlock() vCurrMeasurementList_.clear(); #ifdef _MSDEBUG - string station_name; + std::string station_name; #endif // Select a new junction station if there are none on the JSL @@ -522,9 +522,9 @@ void dna_segment::BuildNextBlock() if (debug_level_ > 1) { - debug_file << "+ Non-contiguous block found... creating a new block using " << bstBinaryRecords_.at(vfreeStnList_.at(0)).stationName << endl; + debug_file << "+ Non-contiguous block found... creating a new block using " << bstBinaryRecords_.at(vfreeStnList_.at(0)).stationName << std::endl; if (debug_level_ > 2) - trace_file << " + Non-contiguous block found... creating a new block using " << bstBinaryRecords_.at(vfreeStnList_.at(0)).stationName << endl; + trace_file << " + Non-contiguous block found... creating a new block using " << bstBinaryRecords_.at(vfreeStnList_.at(0)).stationName << std::endl; } // Select a new junction from the free station list @@ -587,9 +587,9 @@ void dna_segment::BuildNextBlock() if (debug_level_ > 2) { if (block_threshold_reached) - trace_file << " + Block size threshold exceeded... finishing block." << endl; + trace_file << " + Block size threshold exceeded... finishing block." << std::endl; else - trace_file << " + Block " << currentBlock_ << " complete." << endl; + trace_file << " + Block " << currentBlock_ << " complete." << std::endl; } FinaliseBlock(); @@ -601,8 +601,8 @@ void dna_segment::FinaliseBlock() MoveJunctiontoISL(); // Sort lists - sort(vCurrInnerStnList_.begin(), vCurrInnerStnList_.end()); - sort(vCurrJunctStnList_.begin(), vCurrJunctStnList_.end()); + std::sort(vCurrInnerStnList_.begin(), vCurrInnerStnList_.end()); + std::sort(vCurrJunctStnList_.begin(), vCurrJunctStnList_.end()); strip_duplicates(vCurrMeasurementList_); // remove duplicates and sort vISL_.push_back(vCurrInnerStnList_); @@ -621,22 +621,22 @@ void dna_segment::FinaliseBlock() currentTotalSize = currentISLSize + currentJSLSize; currentMsrSize = static_cast(vCurrMeasurementList_.size()); - trace_file << " + Done." << endl; - trace_file << " + BLOCK " << currentBlock_ << " SUMMARY:" << endl; + trace_file << " + Done." << std::endl; + trace_file << " + BLOCK " << currentBlock_ << " SUMMARY:" << std::endl; trace_file << " - " << currentISLSize << " inner stations, " << currentJSLSize << " junction stations, "; - trace_file << currentTotalSize << " total stations, " << currentMsrSize << " measurements." << endl; + trace_file << currentTotalSize << " total stations, " << currentMsrSize << " measurements." << std::endl; - trace_file << " - Inners (" << currentISLSize << "):" << endl << " "; + trace_file << " - Inners (" << currentISLSize << "):" << std::endl << " "; it_vUINT32_const _it_freeisl(vfreeStnList_.end()); for (_it_freeisl=vCurrInnerStnList_.begin(); _it_freeisl!=vCurrInnerStnList_.end(); ++_it_freeisl) trace_file << "'" << bstBinaryRecords_.at(*_it_freeisl).stationName << "' "; - trace_file << endl; + trace_file << std::endl; - trace_file << " - Junctions (" << currentJSLSize << "):" << endl << " "; + trace_file << " - Junctions (" << currentJSLSize << "):" << std::endl << " "; for (_it_freeisl=vCurrJunctStnList_.begin(); _it_freeisl!=vCurrJunctStnList_.end(); ++_it_freeisl) trace_file << "'" << bstBinaryRecords_.at(*_it_freeisl).stationName << "' "; - trace_file << endl << " + ------------------------------------------" << endl; + trace_file << std::endl << " + ------------------------------------------" << std::endl; } } } @@ -690,10 +690,10 @@ void dna_segment::FinaliseBlock() void dna_segment::GetInnerMeasurements(const UINT32& innerStation) { if (debug_level_ > 2) - trace_file << " + GetInnerMeasurements()" << endl; + trace_file << " + GetInnerMeasurements()" << std::endl; #ifdef _MSDEBUG - string from, to, to2; + std::string from, to, to2; #endif measurement_t measRecord; @@ -763,7 +763,7 @@ bool dna_segment::AddtoCurrentMsrList(const UINT32& amlIndex, const vUINT32& msr #ifdef _MSDEBUG measurement_t msr(bmsBinaryRecords_.at(bmsrindex)); char measType(msr.measType); - string station; + std::string station; UINT32 stn_index; #endif @@ -824,7 +824,7 @@ bool dna_segment::AddtoCurrentMsrList(const UINT32& amlIndex, const vUINT32& msr } if (debug_level_ > 2) - trace_file << endl; + trace_file << std::endl; return true; } @@ -840,17 +840,17 @@ void dna_segment::FindCommonMeasurements() // Create a temporary vector vUINT32 vCurrBlockStnList(vCurrJunctStnList_), msrStations; - sort(vCurrBlockStnList.begin(), vCurrBlockStnList.end()); + std::sort(vCurrBlockStnList.begin(), vCurrBlockStnList.end()); it_vUINT32 _it_stn, _it_mstn; measurement_t measRecord; bool inList; if (debug_level_ > 2) - trace_file << " + FindCommonMeasurements()" << endl; + trace_file << " + FindCommonMeasurements()" << std::endl; #ifdef _MSDEBUG - string stn; + std::string stn; #endif UINT32 m, msrCount, amlIndex; @@ -933,10 +933,10 @@ void dna_segment::MoveJunctiontoISL() // Move stations on the current junction station list to the inner station list if // there are no more measurements tied to this station if (debug_level_ > 2) - trace_file << " + MoveJunctiontoISL()" << endl; + trace_file << " + MoveJunctiontoISL()" << std::endl; #ifdef _MSDEBUG - string station_name; + std::string station_name; #endif it_vUINT32 _it_currjsl(vCurrJunctStnList_.begin()); @@ -956,7 +956,7 @@ void dna_segment::MoveJunctiontoISL() if (debug_level_ > 2) trace_file << " - Junction station '" << bstBinaryRecords_.at(static_cast(stn_index)).stationName << - "' was moved to inner list (no more available measurements)." << endl; + "' was moved to inner list (no more available measurements)." << std::endl; // Move this station from the junctions list to inners list _it_currjsl = MoveStation(vCurrJunctStnList_, _it_currjsl, @@ -1015,7 +1015,7 @@ void dna_segment::AddtoJunctionStnList(const vUINT32& msrStations) // Purpose: Closes all files (if file pointers are passed in) and throws NetSegmentException // Called by: Any // Calls: NetSegmentException() -void dna_segment::SignalExceptionSerialise(const string& msg, const int& i, const char *streamType, ...) +void dna_segment::SignalExceptionSerialise(const std::string& msg, const int& i, const char *streamType, ...) { isProcessing_ = false; segmentStatus_ = SEGMENT_EXCEPTION_RAISED; @@ -1059,7 +1059,7 @@ void dna_segment::SignalExceptionSerialise(const string& msg, const int& i, cons throw NetSegmentException(msg, i); } -void dna_segment::LoadAssociationFiles(const string& aslfileName, const string& amlfileName) +void dna_segment::LoadAssociationFiles(const std::string& aslfileName, const std::string& amlfileName) { UINT32 stn, stnCount(0); @@ -1067,7 +1067,7 @@ void dna_segment::LoadAssociationFiles(const string& aslfileName, const string& dna_io_asl asl; stnCount = asl.load_asl_file(aslfileName, &vAssocStnList_, &vfreeStnList_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionSerialise(e.what(), 0, NULL); } @@ -1091,7 +1091,7 @@ void dna_segment::LoadAssociationFiles(const string& aslfileName, const string& dna_io_aml aml; aml.load_aml_file(amlfileName, &vAssocFreeMsrList_, &bmsBinaryRecords_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionSerialise(e.what(), 0, NULL); } @@ -1100,18 +1100,18 @@ void dna_segment::LoadAssociationFiles(const string& aslfileName, const string& } -void dna_segment::LoadStationMap(const string& stnmap_file) +void dna_segment::LoadStationMap(const std::string& stnmap_file) { try { dna_io_map map; map.load_map_file(stnmap_file, &stnsMap_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionSerialise(e.what(), 0, NULL); } } -void dna_segment::LoadBinaryFiles(const string& bstrfileName, const string& bmsrfileName) +void dna_segment::LoadBinaryFiles(const std::string& bstrfileName, const std::string& bmsrfileName) { binary_file_meta_t bst_meta_, bms_meta_; try { @@ -1123,7 +1123,7 @@ void dna_segment::LoadBinaryFiles(const string& bstrfileName, const string& bmsr dna_io_bms bms; bms.load_bms_file(bmsrfileName, &bmsBinaryRecords_, bms_meta_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionSerialise(e.what(), 0, NULL); } @@ -1137,9 +1137,9 @@ void dna_segment::LoadBinaryFiles(const string& bstrfileName, const string& bmsr // throw an exception if no measurements are available if (m == 0) { - stringstream ss; - ss << "No measurements were found." << endl << - " If measurements were successfully loaded on import, ensure that\n all measurements have not been ignored." << endl; + std::stringstream ss; + ss << "No measurements were found." << std::endl << + " If measurements were successfully loaded on import, ensure that\n all measurements have not been ignored." << std::endl; SignalExceptionSerialise(ss.str(), 0, NULL); } } @@ -1251,7 +1251,7 @@ void dna_segment::SortbyMeasurementCount(pvUINT32 vStnList) return; // sort vStnList by number of measurements to each station (held by vAssocStnList CompareMeasCount msrcountCompareFunc(&vAssocStnList_); - sort(vStnList->begin(), vStnList->end(), msrcountCompareFunc); + std::sort(vStnList->begin(), vStnList->end(), msrcountCompareFunc); // Search lower level if (projectSettings_.s.seg_search_level == 0) @@ -1318,7 +1318,7 @@ void dna_segment::SetAvailableMsrCount() void dna_segment::RemoveInvalidFreeStations() { CompareValidity aslValidityCompareFunc(&vAssocStnList_, FALSE); - sort(vfreeStnList_.begin(), vfreeStnList_.end(), aslValidityCompareFunc); + std::sort(vfreeStnList_.begin(), vfreeStnList_.end(), aslValidityCompareFunc); erase_if(vfreeStnList_, aslValidityCompareFunc); } @@ -1344,7 +1344,7 @@ void dna_segment::RemoveDuplicateStations(pvstring vStations) // if (vfreeMsrList_.size() < 2) // return; // CompareNonMeasStart measstartCompareFunc(&bmsBinaryRecords_, xMeas); -// sort(vfreeMsrList_.begin(), vfreeMsrList_.end(), measstartCompareFunc); +// std::sort(vfreeMsrList_.begin(), vfreeMsrList_.end(), measstartCompareFunc); // erase_if(vfreeMsrList_, measstartCompareFunc); // //} @@ -1355,7 +1355,7 @@ void dna_segment::RemoveDuplicateStations(pvstring vStations) // if (vfreeMsrList_.size() < 2) // return; // CompareIgnoreedMeas ignoremeasCompareFunc(&bmsBinaryRecords_); -// sort(vfreeMsrList_.begin(), vfreeMsrList_.end(), ignoremeasCompareFunc); +// std::sort(vfreeMsrList_.begin(), vfreeMsrList_.end(), ignoremeasCompareFunc); // erase_if(vfreeMsrList_, ignoremeasCompareFunc); // //} @@ -1363,17 +1363,17 @@ void dna_segment::RemoveDuplicateStations(pvstring vStations) void dna_segment::WriteFreeStnListSortedbyASLMsrCount() { - if (!exists(output_folder_)) + if (!boost::filesystem::exists(output_folder_)) { - stringstream ss("WriteFreeStnListSortedbyASLMsrCount(): Path does not exist... \n\n "); + std::stringstream ss("WriteFreeStnListSortedbyASLMsrCount(): Path does not exist... \n\n "); ss << output_folder_ << "."; SignalExceptionSerialise(ss.str(), 0, NULL); } - string file(output_folder_ + "/free_stn_sorted_by_msr_count.lst"); + std::string file(output_folder_ + "/free_stn_sorted_by_msr_count.lst"); std::ofstream freestnlist(file.c_str()); UINT32 x(0); - string s; + std::string s; UINT32 u, msrCount, m, amlindex; for (; x(_it_isl->size()); - cout << "+ Segmentation summary:" << endl << endl; - cout << setw(BLOCK) << left << " Block" << setw(JUNCT) << left << "Junction stns" << setw(INNER) << left << "Inner stns" << setw(MEASR) << left << "Measurements" << setw(TOTAL) << left << "Total stns" << endl; - cout << " "; + std::cout << "+ Segmentation summary:" << std::endl << std::endl; + std::cout << std::setw(BLOCK) << std::left << " Block" << std::setw(JUNCT) << std::left << "Junction stns" << std::setw(INNER) << std::left << "Inner stns" << std::setw(MEASR) << std::left << "Measurements" << std::setw(TOTAL) << std::left << "Total stns" << std::endl; + std::cout << " "; for (char dash=BLOCK+NETID+INNER+JUNCT+TOTAL+MEASR; dash>2; dash--) - cout << "-"; - cout << endl; + std::cout << "-"; + std::cout << std::endl; UINT32 b = 1; _it_jsl = vJSL_.begin(); _it_cml = vCML_.begin(); for (_it_isl=vISL_.begin(); _it_isl!=vISL_.end(); ++_it_isl) { // block - cout << " " << setw(BLOCK-2) << left << b; + std::cout << " " << std::setw(BLOCK-2) << std::left << b; // junction stns if (_it_jsl!=vJSL_.end()) - cout << setw(JUNCT) << left << _it_jsl->size(); + std::cout << std::setw(JUNCT) << std::left << _it_jsl->size(); else - cout << setw(JUNCT) << " "; + std::cout << std::setw(JUNCT) << " "; // inner stns - cout << setw(INNER) << left << _it_isl->size(); + std::cout << std::setw(INNER) << std::left << _it_isl->size(); // total measurements if (_it_cml!=vCML_.end()) - cout << setw(MEASR) << left << _it_cml->size(); + std::cout << std::setw(MEASR) << std::left << _it_cml->size(); else - cout << setw(MEASR) << " "; + std::cout << std::setw(MEASR) << " "; // total stns if (_it_jsl!=vJSL_.end()) - cout << setw(TOTAL) << left << (_it_isl->size() + _it_jsl->size()); + std::cout << std::setw(TOTAL) << std::left << (_it_isl->size() + _it_jsl->size()); else - cout << setw(TOTAL) << left << _it_isl->size(); + std::cout << std::setw(TOTAL) << std::left << _it_isl->size(); - cout << endl; + std::cout << std::endl; ++_it_jsl; ++_it_cml; b++; } - cout << endl; + std::cout << std::endl; - cout << "+ Stations used: " << setw(10) << right << stns << endl; - cout << "+ Measurements used: " << setw(10) << right << msrs << endl; + std::cout << "+ Stations used: " << std::setw(10) << std::right << stns << std::endl; + std::cout << "+ Measurements used: " << std::setw(10) << std::right << msrs << std::endl; if (!vfreeStnList_.empty()) - cout << "+ Unused stations: " << setw(10) << right << vfreeStnList_.size() << endl; + std::cout << "+ Unused stations: " << std::setw(10) << std::right << vfreeStnList_.size() << std::endl; //if (!vfreeMsrList_.empty()) - // cout << "+ Unused measurements: " << setw(10) << right << vfreeMsrList_.size() << endl; + // std::cout << "+ Unused measurements: " << std::setw(10) << std::right << vfreeMsrList_.size() << std::endl; } -void dna_segment::WriteSegmentedNetwork(const string& segfileName) +void dna_segment::WriteSegmentedNetwork(const std::string& segfileName) { if (bstBinaryRecords_.empty()) SignalExceptionSerialise("WriteSegmentedNetwork(): the binary stations file has not been loaded into memory yet.", 0, NULL); @@ -1506,7 +1506,7 @@ void dna_segment::WriteSegmentedNetwork(const string& segfileName) vISL_, vJSL_, vCML_, v_ContiguousNetList_, &bstBinaryRecords_, &bmsBinaryRecords_); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { SignalExceptionSerialise(e.what(), 0, NULL); } catch (...) { @@ -1529,7 +1529,7 @@ void dna_segment::VerifyStationConnections_Block(const UINT32& block) vUINT32 unusedStns, msrStations, allmsrStations; #ifdef _MSDEBUG - string isl_stn_name; + std::string isl_stn_name; #endif // get all stations connected with measurements @@ -1564,12 +1564,12 @@ void dna_segment::VerifyStationConnections_Block(const UINT32& block) if (!unusedStns.empty()) { - stringstream ss; - ss << "The following station(s) are not associated with any" << endl << - " measurements in block " << block+1 << ":" << endl; + std::stringstream ss; + ss << "The following station(s) are not associated with any" << std::endl << + " measurements in block " << block+1 << ":" << std::endl; for_each(unusedStns.begin(), unusedStns.end(), [this, &ss](UINT32& stn){ - ss << " " << bstBinaryRecords_.at(stn).stationName << " (" << stn << ")" << endl; + ss << " " << bstBinaryRecords_.at(stn).stationName << " (" << stn << ")" << std::endl; }); SignalExceptionSerialise(ss.str(), 0, NULL); } diff --git a/dynadjust/dynadjust/dnasegment/dnasegment.hpp b/dynadjust/dynadjust/dnasegment/dnasegment.hpp index 9c60d2db..ad5ffe1f 100644 --- a/dynadjust/dynadjust/dnasegment/dnasegment.hpp +++ b/dynadjust/dynadjust/dnasegment/dnasegment.hpp @@ -45,11 +45,6 @@ #include #include -using namespace std; -using namespace boost; -using namespace boost::posix_time; -using namespace boost::filesystem; - #include #include #include @@ -109,26 +104,26 @@ class dna_segment { inline UINT32 minBlockSize() const { return minBlockSize_; } void coutSummary() const; - void coutCurrentBlockSummary(ostream &os); + void coutCurrentBlockSummary(std::ostream &os); void LoadNetFile(); - void LoadBinaryFiles(const string& bstrfileName, const string& bmsrfileName); - void LoadAssociationFiles(const string& aslfileName, const string& amlfileName); - void LoadStationMap(const string& stnmap_file); + void LoadBinaryFiles(const std::string& bstrfileName, const std::string& bmsrfileName); + void LoadAssociationFiles(const std::string& aslfileName, const std::string& amlfileName); + void LoadStationMap(const std::string& stnmap_file); - void WriteSegmentedNetwork(const string& segfileName); + void WriteSegmentedNetwork(const std::string& segfileName); void WriteFreeStnListSortedbyASLMsrCount(); void VerifyStationConnections(); - string DefaultStartingStation(); + std::string DefaultStartingStation(); vstring StartingStations(); inline _SEGMENT_STATUS_ GetStatus() const { return segmentStatus_; } private: - void SignalExceptionSerialise(const string& msg, const int& i, const char *streamType, ...); + void SignalExceptionSerialise(const std::string& msg, const int& i, const char *streamType, ...); void ParseStartingStations(); void BuildFirstBlock(); void BuildNextBlock(); @@ -140,7 +135,7 @@ class dna_segment { void SelectJunction(); it_vUINT32 MoveStation(vUINT32& fromList, it_vUINT32 it_from, vUINT32& toList, const UINT32& stn_index); - void MoveFreeStn(it_vUINT32 it_freeisl, vUINT32& toList, const UINT32& stn_index, const string& type); + void MoveFreeStn(it_vUINT32 it_freeisl, vUINT32& toList, const UINT32& stn_index, const std::string& type); void MoveFreeStnToInnerList(it_vUINT32 it_freeisl, const UINT32& stn_index); void MoveFreeStnToJunctionList(it_vUINT32 it_freeisl, const UINT32& stn_index); @@ -178,10 +173,10 @@ class dna_segment { UINT32 currentBlock_; UINT32 currentNetwork_; // current contiguous network ID - string network_name_; // network name + std::string network_name_; // network name UINT16 debug_level_; - string output_folder_; + std::string output_folder_; // functors CompareClusterID clusteridCompareFunc_; diff --git a/dynadjust/dynadjust/dnasegmentwrapper/dnasegmentwrapper.cpp b/dynadjust/dynadjust/dnasegmentwrapper/dnasegmentwrapper.cpp index 7016bd73..6df5c487 100644 --- a/dynadjust/dynadjust/dnasegmentwrapper/dnasegmentwrapper.cpp +++ b/dynadjust/dynadjust/dnasegmentwrapper/dnasegmentwrapper.cpp @@ -27,7 +27,7 @@ using namespace dynadjust; bool running; boost::mutex cout_mutex; -int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& vm, project_settings& p) +int ParseCommandLineOptions(const int& argc, char* argv[], const boost::program_options::variables_map& vm, project_settings& p) { // capture command line arguments for (int cmd_arg(0); cmd_arg(p.g.output_folder, p.g.network_name, "dnaproj"); + p.g.project_file = formPath(p.g.output_folder, p.g.network_name, "dnaproj"); // input files - p.s.asl_file = formPath(p.g.input_folder, p.g.network_name, "asl"); // associated stations list - p.s.aml_file = formPath(p.g.input_folder, p.g.network_name, "aml"); // associated measurements list - p.s.map_file = formPath(p.g.input_folder, p.g.network_name, "map"); // station names map + p.s.asl_file = formPath(p.g.input_folder, p.g.network_name, "asl"); // associated stations list + p.s.aml_file = formPath(p.g.input_folder, p.g.network_name, "aml"); // associated measurements list + p.s.map_file = formPath(p.g.input_folder, p.g.network_name, "map"); // station names map if (vm.count(NET_FILE)) - p.s.net_file = formPath(p.g.input_folder, p.g.network_name, "net"); // Starting stations file + p.s.net_file = formPath(p.g.input_folder, p.g.network_name, "net"); // Starting stations file // binary station file location (input) if (vm.count(BIN_STN_FILE)) - p.s.bst_file = formPath(p.g.input_folder, p.s.bst_file); + p.s.bst_file = formPath(p.g.input_folder, p.s.bst_file); else - p.s.bst_file = formPath(p.g.output_folder, p.g.network_name, "bst"); + p.s.bst_file = formPath(p.g.output_folder, p.g.network_name, "bst"); // binary station file location (input) if (vm.count(BIN_MSR_FILE)) - p.s.bms_file = formPath(p.g.input_folder, p.s.bms_file); + p.s.bms_file = formPath(p.g.input_folder, p.s.bms_file); else - p.s.bms_file = formPath(p.g.output_folder, p.g.network_name, "bms"); + p.s.bms_file = formPath(p.g.output_folder, p.g.network_name, "bms"); - if (!exists(p.s.bst_file) || !exists(p.s.bms_file)) + if (!boost::filesystem::exists(p.s.bst_file) || !boost::filesystem::exists(p.s.bms_file)) { - cout << endl << "- Nothing to do: "; + std::cout << std::endl << "- Nothing to do: "; if (p.g.network_name.empty()) - cout << endl << "network name has not been specified specified, and " << endl << " "; - cout << p.s.bst_file << " and " << p.s.bms_file << " do not exist." << endl << endl; + std::cout << std::endl << "network name has not been specified specified, and " << std::endl << " "; + std::cout << p.s.bst_file << " and " << p.s.bms_file << " do not exist." << std::endl << std::endl; return EXIT_FAILURE; } @@ -99,24 +99,24 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& if (vm.count(SEG_FILE)) { // Does it exist? - if (!exists(p.s.seg_file)) + if (!boost::filesystem::exists(p.s.seg_file)) { // Look for it in the input folder - p.s.seg_file = formPath(p.g.input_folder, leafStr(p.s.seg_file)); + p.s.seg_file = formPath(p.g.input_folder, leafStr(p.s.seg_file)); - if (!exists(p.s.seg_file)) + if (!boost::filesystem::exists(p.s.seg_file)) { - cout << endl << "- Error: " << - "Segmentation file " << leafStr(p.s.seg_file) << " does not exist." << endl << endl; + std::cout << std::endl << "- Error: " << + "Segmentation file " << leafStr(p.s.seg_file) << " does not exist." << std::endl << std::endl; return EXIT_FAILURE; } } } else - p.s.seg_file = formPath(p.g.input_folder, p.g.network_name, "seg"); + p.s.seg_file = formPath(p.g.input_folder, p.g.network_name, "seg"); // Station appearance file - p.s.sap_file = formPath(p.g.input_folder, p.g.network_name, "sap"); + p.s.sap_file = formPath(p.g.input_folder, p.g.network_name, "sap"); if (vm.count(TEST_INTEGRITY)) p.i.test_integrity = 1; @@ -130,41 +130,41 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const variables_map& int main(int argc, char* argv[]) { // create banner message - string cmd_line_banner; + std::string cmd_line_banner; fileproc_help_header(&cmd_line_banner); - string stnfilename, msrfilename; + std::string stnfilename, msrfilename; project_settings p; - variables_map vm; - positional_options_description positional_options; + boost::program_options::variables_map vm; + boost::program_options::positional_options_description positional_options; - options_description standard_options("+ " + string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description config_options("+ " + string(SEGMENT_MODULE_CONFIG), PROGRAM_OPTIONS_LINE_LENGTH); - options_description generic_options("+ " + string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description standard_options("+ " + std::string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description config_options("+ " + std::string(SEGMENT_MODULE_CONFIG), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description generic_options("+ " + std::string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); - string cmd_line_usage("+ "); + std::string cmd_line_usage("+ "); cmd_line_usage.append(__BINARY_NAME__).append(" usage: ").append(__BINARY_NAME__).append(" ").append(NETWORK_NAME).append(" [options]"); - options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); try { // Declare a group of options that will be // allowed only on command line standard_options.add_options() - (PROJECT_FILE_P, value(&p.g.project_file), + (PROJECT_FILE_P, boost::program_options::value(&p.g.project_file), "Project file name. Full path to project file. If none specified, a new file is created using input-folder and network-name.") - (NETWORK_NAME_N, value(&p.g.network_name), + (NETWORK_NAME_N, boost::program_options::value(&p.g.network_name), "Network name. User defined name for all input and output files. Default is \"network#\".") - (INPUT_FOLDER_I, value(&p.g.input_folder), + (INPUT_FOLDER_I, boost::program_options::value(&p.g.input_folder), "Path containing all input files") - (OUTPUT_FOLDER_O, value(&p.g.output_folder), // default is ./, + (OUTPUT_FOLDER_O, boost::program_options::value(&p.g.output_folder), // default is ./, "Path for all output files") - (BIN_STN_FILE, value(&p.s.bst_file), + (BIN_STN_FILE, boost::program_options::value(&p.s.bst_file), "Binary station file name. Overrides network name.") - (BIN_MSR_FILE, value(&p.s.bms_file), + (BIN_MSR_FILE, boost::program_options::value(&p.s.bms_file), "Binary measurement file name. Overrides network name.") - (SEG_FILE, value(&p.s.seg_file), + (SEG_FILE, boost::program_options::value(&p.s.seg_file), "Segmentation output file name. Overrides network name.") ; @@ -174,35 +174,35 @@ int main(int argc, char* argv[]) config_options.add_options() (NET_FILE, "Look for a .net file containing stations to be incorporated within the first block.") - (SEG_STARTING_STN, value(&p.s.seg_starting_stns), + (SEG_STARTING_STN, boost::program_options::value(&p.s.seg_starting_stns), "Additional stations to be incorporated within the first block. arg is a comma delimited string \"stn1, stn 2,stn3 , stn 4\".") - (SEG_MIN_INNER_STNS, value(&p.s.min_inner_stations), - (string("Minimum number of inner stations within each block. Default is ")+ - StringFromT(p.s.min_inner_stations)+string(".")).c_str()) - (SEG_THRESHOLD_STNS, value(&p.s.max_total_stations), - (string("Threshold limit for maximum number of stations per block. Default is ")+ - StringFromT(p.s.max_total_stations)+string(".")).c_str()) - (SEG_FORCE_CONTIGUOUS, value(&p.s.force_contiguous_blocks), - (string("Treatment of isolated networks:\n")+ - string(" 0: Isolated networks as individual blocks ")+ + (SEG_MIN_INNER_STNS, boost::program_options::value(&p.s.min_inner_stations), + (std::string("Minimum number of inner stations within each block. Default is ")+ + StringFromT(p.s.min_inner_stations)+std::string(".")).c_str()) + (SEG_THRESHOLD_STNS, boost::program_options::value(&p.s.max_total_stations), + (std::string("Threshold limit for maximum number of stations per block. Default is ")+ + StringFromT(p.s.max_total_stations)+std::string(".")).c_str()) + (SEG_FORCE_CONTIGUOUS, boost::program_options::value(&p.s.force_contiguous_blocks), + (std::string("Treatment of isolated networks:\n")+ + std::string(" 0: Isolated networks as individual blocks ")+ (p.s.force_contiguous_blocks==0 ? "(default)\n" : "\n")+ - string(" 1: Force production of contiguous blocks ")+ + std::string(" 1: Force production of contiguous blocks ")+ (p.s.force_contiguous_blocks==1 ? "(default)" : "") ).c_str()) - (SEG_SEARCH_LEVEL, value(&p.s.seg_search_level), + (SEG_SEARCH_LEVEL, boost::program_options::value(&p.s.seg_search_level), "Level to which searches should be conducted to find stations with the lowest measurement count. Default is 0.") (TEST_INTEGRITY, "Test the integrity of all output files.") ; generic_options.add_options() - (VERBOSE, value(&p.g.verbose), - string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information\n 3: Debug level information").c_str()) + (VERBOSE, boost::program_options::value(&p.g.verbose), + std::string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information\n 3: Debug level information").c_str()) (QUIET, - string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) + std::string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs").c_str()) (VERSION_V, "Display the current program version") (HELP_H, "Show this help message") - (HELP_MODULE_H, value(), + (HELP_MODULE_H, boost::program_options::value(), "Provide help for a specific help category.") ; @@ -211,53 +211,53 @@ int main(int argc, char* argv[]) // add "positional options" to handle command line tokens which have no option name positional_options.add(NETWORK_NAME, -1); - command_line_parser parser(argc, argv); + boost::program_options::command_line_parser parser(argc, argv); store(parser.options(allowable_options).positional(positional_options).run(), vm); notify(vm); } catch (const std::exception& e) { - cout << "- Error: " << e.what() << endl << - cmd_line_banner << allowable_options << endl; + std::cout << "- Error: " << e.what() << std::endl << + cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } if (argc < 2) { - cout << endl << "- Nothing to do - no options provided. " << endl << endl << - cmd_line_banner << allowable_options << endl; + std::cout << std::endl << "- Nothing to do - no options provided. " << std::endl << std::endl << + cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } if (vm.count(VERSION)) { - cout << cmd_line_banner << endl; + std::cout << cmd_line_banner << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP)) { - cout << cmd_line_banner << allowable_options << endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP_MODULE)) { - cout << cmd_line_banner; - string original_text = vm[HELP_MODULE].as(); - string help_text = str_upper(original_text); + std::cout << cmd_line_banner; + std::string original_text = vm[HELP_MODULE].as(); + std::string help_text = str_upper(original_text); - if (str_upper(ALL_MODULE_STDOPT).find(help_text) != string::npos) { - cout << standard_options << endl; + if (str_upper(ALL_MODULE_STDOPT).find(help_text) != std::string::npos) { + std::cout << standard_options << std::endl; } - else if (str_upper(SEGMENT_MODULE_CONFIG).find(help_text) != string::npos) { - cout << config_options << endl; + else if (str_upper(SEGMENT_MODULE_CONFIG).find(help_text) != std::string::npos) { + std::cout << config_options << std::endl; } - else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != string::npos) { - cout << generic_options << endl; + else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != std::string::npos) { + std::cout << generic_options << std::endl; } else { - cout << endl << "- Error: Help module '" << - original_text << "' is not in the list of options." << endl; + std::cout << std::endl << "- Error: Help module '" << + original_text << "' is not in the list of options." << std::endl; return EXIT_FAILURE; } @@ -282,54 +282,54 @@ int main(int argc, char* argv[]) if (!p.g.quiet) { - cout << endl << cmd_line_banner; + std::cout << std::endl << cmd_line_banner; - cout << "+ Options:" << endl; - cout << setw(PRINT_VAR_PAD) << left << " Network name: " << p.g.network_name << endl; - cout << setw(PRINT_VAR_PAD) << left << " Input folder: " << p.g.input_folder << endl; - cout << setw(PRINT_VAR_PAD) << left << " Output folder: " << p.g.output_folder << endl; - cout << setw(PRINT_VAR_PAD) << left << " Associated station file: " << p.s.asl_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Associated measurement file: " << p.s.aml_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Binary station file: " << p.s.bst_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Binary measurement file: " << p.s.bms_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Segmentation output file: " << p.s.seg_file << endl; + std::cout << "+ Options:" << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Network name: " << p.g.network_name << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Input folder: " << p.g.input_folder << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Output folder: " << p.g.output_folder << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Associated station file: " << p.s.asl_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Associated measurement file: " << p.s.aml_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Binary station file: " << p.s.bst_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Binary measurement file: " << p.s.bms_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Segmentation output file: " << p.s.seg_file << std::endl; if (!p.s.net_file.empty()) - cout << setw(PRINT_VAR_PAD) << left << " Block 1 stations file: " << p.s.net_file << endl; - cout << setw(PRINT_VAR_PAD) << left << " Minimum inner stations: " << p.s.min_inner_stations << endl; - cout << setw(PRINT_VAR_PAD) << left << " Block size threshold: " << p.s.max_total_stations << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Block 1 stations file: " << p.s.net_file << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Minimum inner stations: " << p.s.min_inner_stations << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Block size threshold: " << p.s.max_total_stations << std::endl; if (!p.s.seg_starting_stns.empty()) - cout << setw(PRINT_VAR_PAD) << left << " Additional Block 1 stations: " << p.s.seg_starting_stns << endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Additional Block 1 stations: " << p.s.seg_starting_stns << std::endl; else if (p.s.net_file.empty()) - cout << " No initial station specified. The first station will be used." << endl; + std::cout << " No initial station specified. The first station will be used." << std::endl; - cout << endl; + std::cout << std::endl; } // Should segment look for a net file? if (!p.s.net_file.empty()) { - if (!exists(p.s.net_file)) + if (!boost::filesystem::exists(p.s.net_file)) { cout_mutex.lock(); - cout << endl << - "- Error: " << p.s.net_file << " does not exist." << endl << - " A file named " << p.g.network_name << ".net must exist in the input folder\n in order to use this option." << endl << endl; + std::cout << std::endl << + "- Error: " << p.s.net_file << " does not exist." << std::endl << + " A file named " << p.g.network_name << ".net must exist in the input folder\n in order to use this option." << std::endl << std::endl; cout_mutex.unlock(); return EXIT_FAILURE; } } dna_segment netSegment; - milliseconds elapsed_time(milliseconds(0)); + boost::posix_time::milliseconds elapsed_time(boost::posix_time::milliseconds(0)); _SEGMENT_STATUS_ segmentStatus; - string status_msg; + std::string status_msg; try { netSegment.InitialiseSegmentation(); running = true; // segment blocks using group thread - thread_group ui_segment_threads; + boost::thread_group ui_segment_threads; if (!p.g.quiet) ui_segment_threads.create_thread(dna_segment_progress_thread(&netSegment, &p)); ui_segment_threads.create_thread(dna_segment_thread(&netSegment, &p, &segmentStatus, &elapsed_time, &status_msg)); @@ -346,61 +346,61 @@ int main(int argc, char* argv[]) //// print station appearance file //if (!p.g.quiet) - // cout << "+ Printing station appearance list... "; + // std::cout << "+ Printing station appearance list... "; //netSegment.WriteStationAppearanceList(p.s.sap_file); //if (!p.g.quiet) - // cout << "done." << endl; + // std::cout << "done." << std::endl; if (p.g.verbose > 1 && !p.g.quiet) netSegment.coutSummary(); if (segmentStatus != SEGMENT_SUCCESS) - cout << status_msg << endl; + std::cout << status_msg << std::endl; if (!p.g.quiet) { - cout << "+ Segmentation statistics:" << endl; - cout << endl << left << " " << - setw(STATION) << "No. blocks" << - setw(STAT) << "Max size" << - setw(STAT) << "Min size" << - setw(STAT) << "Average" << - setw(STATION) << "Total size" << endl; - cout << " "; + std::cout << "+ Segmentation statistics:" << std::endl; + std::cout << std::endl << std::left << " " << + std::setw(STATION) << "No. blocks" << + std::setw(STAT) << "Max size" << + std::setw(STAT) << "Min size" << + std::setw(STAT) << "Average" << + std::setw(STATION) << "Total size" << std::endl; + std::cout << " "; for (UINT32 i(0), j(STATION + STAT*3 + STATION); i(p.s.seg_file) << "... "; + std::cout << "+ Printing blocks to " << leafStr(p.s.seg_file) << "... "; netSegment.WriteSegmentedNetwork(p.s.seg_file); if (!p.g.quiet) - cout << "done." << endl; + std::cout << "done." << std::endl; } catch (const NetSegmentException& e) { - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; return EXIT_FAILURE; } - catch (const runtime_error& e) { - cout << "+ Exception of unknown type: " << e.what(); + catch (const std::runtime_error& e) { + std::cout << "+ Exception of unknown type: " << e.what(); return EXIT_FAILURE; } @@ -415,7 +415,7 @@ int main(int argc, char* argv[]) // Update the import settings. // Print the project file. If it doesn't exist, it will be created. CDnaProjectFile projectFile; - if (exists(p.g.project_file)) + if (boost::filesystem::exists(p.g.project_file)) projectFile.LoadProjectFile(p.g.project_file); projectFile.UpdateSettingsSegment(p); @@ -424,8 +424,8 @@ int main(int argc, char* argv[]) if (p.g.quiet) return EXIT_SUCCESS; - cout << endl << formatedElapsedTime(&elapsed_time, "+ Network segmentation took ") << endl; - cout << "+ " << p.g.network_name << " is now ready for sequential phased adjustment." << endl << endl; + std::cout << std::endl << formatedElapsedTime(&elapsed_time, "+ Network segmentation took ") << std::endl; + std::cout << "+ " << p.g.network_name << " is now ready for sequential phased adjustment." << std::endl << std::endl; return EXIT_SUCCESS; } diff --git a/dynadjust/dynadjust/dnasegmentwrapper/dnasegmentwrapper.hpp b/dynadjust/dynadjust/dnasegmentwrapper/dnasegmentwrapper.hpp index 93b6167b..43a7a82d 100644 --- a/dynadjust/dynadjust/dnasegmentwrapper/dnasegmentwrapper.hpp +++ b/dynadjust/dynadjust/dnasegmentwrapper/dnasegmentwrapper.hpp @@ -49,13 +49,6 @@ #include #include -using namespace std; -using namespace boost; -using namespace boost::filesystem; -using namespace boost::posix_time; -using namespace boost::program_options; -namespace po = boost::program_options; - #include #include #include @@ -77,7 +70,7 @@ extern boost::mutex cout_mutex; class dna_segment_thread { public: - dna_segment_thread(dna_segment* dnaSeg, project_settings* p, _SEGMENT_STATUS_* segmentStatus, milliseconds* s, string* status_msg) + dna_segment_thread(dna_segment* dnaSeg, project_settings* p, _SEGMENT_STATUS_* segmentStatus, boost::posix_time::milliseconds* s, std::string* status_msg) : _dnaSeg(dnaSeg) , _p(p) , _segmentStatus(segmentStatus) @@ -90,7 +83,7 @@ class dna_segment_thread if (!_p->g.quiet) { cout_mutex.lock(); - cout << "+ Loading binary files..."; + std::cout << "+ Loading binary files..."; cout_mutex.unlock(); } @@ -100,7 +93,7 @@ class dna_segment_thread } catch (const NetSegmentException& e) { cout_mutex.lock(); - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; cout_mutex.unlock(); running = false; return; @@ -109,19 +102,19 @@ class dna_segment_thread if (!_p->g.quiet) { cout_mutex.lock(); - cout << " done." << endl; + std::cout << " done." << std::endl; if (_dnaSeg->StartingStations().empty()) { - string startStn(_dnaSeg->DefaultStartingStation()); + std::string startStn(_dnaSeg->DefaultStartingStation()); if (startStn == "") startStn = "the first station"; - cout << "+ Adopting " << _dnaSeg->DefaultStartingStation() << " as the initial station in the first block." << endl; + std::cout << "+ Adopting " << _dnaSeg->DefaultStartingStation() << " as the initial station in the first block." << std::endl; } - cout << "+ Creating block " << setw(PROGRESS_PAD_39) << " "; + std::cout << "+ Creating block " << std::setw(PROGRESS_PAD_39) << " "; cout_mutex.unlock(); } - cpu_timer time; + boost::timer::cpu_timer time; try { *_segmentStatus = SEGMENT_EXCEPTION_RAISED; *_segmentStatus = _dnaSeg->SegmentNetwork(_p); @@ -129,26 +122,26 @@ class dna_segment_thread catch (const NetSegmentException& e) { running = false; cout_mutex.lock(); - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; cout_mutex.unlock(); return; } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { running = false; - boost::this_thread::sleep(milliseconds(250)); + boost::this_thread::sleep(boost::posix_time::milliseconds(250)); cout_mutex.lock(); - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; cout_mutex.unlock(); return; } - *_s = milliseconds(time.elapsed().wall/MILLI_TO_NANO); + *_s = boost::posix_time::milliseconds(time.elapsed().wall/MILLI_TO_NANO); running = false; if (!_p->g.quiet) { cout_mutex.lock(); - cout << PROGRESS_BACKSPACE_39 << "\b" << setw(PROGRESS_PAD_39+3) << left << "s... done. " << endl; + std::cout << PROGRESS_BACKSPACE_39 << "\b" << std::setw(PROGRESS_PAD_39+3) << std::left << "s... done. " << std::endl; cout_mutex.unlock(); } } @@ -156,8 +149,8 @@ class dna_segment_thread dna_segment* _dnaSeg; project_settings* _p; _SEGMENT_STATUS_* _segmentStatus; - milliseconds* _s; - string* _status_msg; + boost::posix_time::milliseconds* _s; + std::string* _status_msg; }; class dna_segment_progress_thread @@ -168,7 +161,7 @@ class dna_segment_progress_thread void operator()() { UINT32 block, currentBlock(0); - ostringstream ss; + std::ostringstream ss; while (running) { @@ -178,15 +171,15 @@ class dna_segment_progress_thread if (block != currentBlock) { ss.str(""); - ss << "(" << fixed << setw(2) << right << setprecision(0) << _dnaSeg->GetProgress() << "% stations used)"; + ss << "(" << std::fixed << std::setw(2) << std::right << std::setprecision(0) << _dnaSeg->GetProgress() << "% stations used)"; cout_mutex.lock(); - cout << PROGRESS_BACKSPACE_39 << setw(PROGRESS_BLOCK) << left << block << setw(PROGRESS_PERCENT_29) << right << ss.str(); - cout.flush(); + std::cout << PROGRESS_BACKSPACE_39 << std::setw(PROGRESS_BLOCK) << std::left << block << std::setw(PROGRESS_PERCENT_29) << std::right << ss.str(); + std::cout.flush(); cout_mutex.unlock(); currentBlock = block; } } - boost::this_thread::sleep(milliseconds(75)); + boost::this_thread::sleep(boost::posix_time::milliseconds(75)); } } diff --git a/dynadjust/dynadjust/driver/driver.cpp b/dynadjust/dynadjust/driver/driver.cpp index b751a07e..1f6f4d11 100644 --- a/dynadjust/dynadjust/driver/driver.cpp +++ b/dynadjust/dynadjust/driver/driver.cpp @@ -40,11 +40,9 @@ #include -using namespace std; - bool CreateNTv2Grid(const char* datGridFile, const char* gsbGridFile) { - cout << "+ Creating NTv2 grid file... "; + std::cout << "+ Creating NTv2 grid file... "; int status(0); n_file_par theGrid; @@ -54,11 +52,11 @@ bool CreateNTv2Grid(const char* datGridFile, const char* gsbGridFile) if (!DNAGEOID_CreateNTv2Grid(datGridFile, &theGrid, &status)) { - cout << endl << "Error: " << status << endl; + std::cout << std::endl << "Error: " << status << std::endl; return false; } - cout << "done." << endl << endl; + std::cout << "done." << std::endl << std::endl; return true; @@ -67,17 +65,17 @@ bool CreateNTv2Grid(const char* datGridFile, const char* gsbGridFile) bool createGridIndex(const char* gridfilePath, const char* gridfileType) { - cout << "+ Opening grid file... "; + std::cout << "+ Opening grid file... "; int status(0); if (!DNAGEOID_CreateGridIndex(gridfilePath, gridfileType, &status)) { - cout << "Error: " << status << endl; + std::cout << "Error: " << status << std::endl; return false; } - cout << "done." << endl << endl; + std::cout << "done." << std::endl << std::endl; return true; } @@ -85,7 +83,7 @@ bool createGridIndex(const char* gridfilePath, const char* gridfileType) bool reportGridProperties(const char* gridfilePath, const char* gridfileType) { - cout << "+ Reporting grid file properties... "; + std::cout << "+ Reporting grid file properties... "; n_file_par grid_properties; @@ -93,43 +91,43 @@ bool reportGridProperties(const char* gridfilePath, const char* gridfileType) if (!DNAGEOID_ReportGridProperties(gridfilePath, gridfileType, &grid_properties, &status)) { - cout << "Error: " << status << endl; + std::cout << "Error: " << status << std::endl; return false; } - cout << endl << endl << + std::cout << std::endl << std::endl << "----------------------------------------------------------------" << - endl << - "Grid properties for \"" << gridfilePath << "\":" << endl; - cout << "+ GS_TYPE = " << grid_properties.chGs_type << endl; // grid shift type (GS_TYPE) - cout << "+ VERSION = " << grid_properties.chVersion << endl; // grid file version (VERSION) - cout << "+ SYSTEM_F = " << grid_properties.chSystem_f << endl; // reference system (SYSTEM_F) - cout << "+ SYSTEM_T = " << grid_properties.chSystem_t << endl; // reference system (SYSTEM_T) - cout << "+ MAJOR_F = " << setprecision(3) << fixed << grid_properties.daf << endl; // semi major of from system (MAJOR_F) - cout << "+ MAJOR_T = " << setprecision(3) << fixed << grid_properties.dat << endl; // semi major of to system (MAJOR_T) - cout << "+ MINOR_F = " << setprecision(3) << fixed << grid_properties.dbf << endl; // semi minor of from system (MINOR_F) - cout << "+ MINOR_T = " << setprecision(3) << fixed << grid_properties.dbt << endl; // semi minor of to system (MINOR_T) - cout << "+ NUM_OREC = " << grid_properties.iH_info << endl; // Number of header identifiers (NUM_OREC) - cout << "+ NUM_SREC = " << grid_properties.iSubH_info << endl; // Number of sub-header idents (NUM_SREC) - cout << "+ NUM_FILE = " << grid_properties.iNumsubgrids << endl; // number of subgrids in file (NUM_FILE) + std::endl << + "Grid properties for \"" << gridfilePath << "\":" << std::endl; + std::cout << "+ GS_TYPE = " << grid_properties.chGs_type << std::endl; // grid shift type (GS_TYPE) + std::cout << "+ VERSION = " << grid_properties.chVersion << std::endl; // grid file version (VERSION) + std::cout << "+ SYSTEM_F = " << grid_properties.chSystem_f << std::endl; // reference system (SYSTEM_F) + std::cout << "+ SYSTEM_T = " << grid_properties.chSystem_t << std::endl; // reference system (SYSTEM_T) + std::cout << "+ MAJOR_F = " << std::setprecision(3) << std::fixed << grid_properties.daf << std::endl; // semi major of from system (MAJOR_F) + std::cout << "+ MAJOR_T = " << std::setprecision(3) << std::fixed << grid_properties.dat << std::endl; // semi major of to system (MAJOR_T) + std::cout << "+ MINOR_F = " << std::setprecision(3) << std::fixed << grid_properties.dbf << std::endl; // semi minor of from system (MINOR_F) + std::cout << "+ MINOR_T = " << std::setprecision(3) << std::fixed << grid_properties.dbt << std::endl; // semi minor of to system (MINOR_T) + std::cout << "+ NUM_OREC = " << grid_properties.iH_info << std::endl; // Number of header identifiers (NUM_OREC) + std::cout << "+ NUM_SREC = " << grid_properties.iSubH_info << std::endl; // Number of sub-header idents (NUM_SREC) + std::cout << "+ NUM_FILE = " << grid_properties.iNumsubgrids << std::endl; // number of subgrids in file (NUM_FILE) for (int i=0; icVar.dLatitude << ", " << theGeoidPoint->cVar.dLongitude << " is outside the grid file." << endl << endl; + std::cout << "+ The point " << std::fixed << std::setprecision(6) << theGeoidPoint->cVar.dLatitude << ", " << theGeoidPoint->cVar.dLongitude << " is outside the grid file." << std::endl << std::endl; return true; } - cout << "Error: " << status << endl; + std::cout << "Error: " << status << std::endl; return false; } - cout << "+ Interpolation results for "; - cout << fixed << setprecision(6) << theGeoidPoint->cVar.dLatitude << ", " << theGeoidPoint->cVar.dLongitude << " (ddd.dddddd):" << endl; + std::cout << "+ Interpolation results for "; + std::cout << std::fixed << std::setprecision(6) << theGeoidPoint->cVar.dLatitude << ", " << theGeoidPoint->cVar.dLongitude << " (ddd.dddddd):" << std::endl; - cout << " N VALUE = " << setw(6) << right << setprecision(3) << theGeoidPoint->gVar.dN_value << endl; // N value - cout << " DEFL PRIME M = " << setw(6) << right << theGeoidPoint->gVar.dDefl_meridian << endl; // Defl PM value - cout << " DEFL PRIME V = " << setw(6) << right << theGeoidPoint->gVar.dDefl_primev << endl; // Defl PV value - cout << endl; + std::cout << " N VALUE = " << std::setw(6) << std::right << std::setprecision(3) << theGeoidPoint->gVar.dN_value << std::endl; // N value + std::cout << " DEFL PRIME M = " << std::setw(6) << std::right << theGeoidPoint->gVar.dDefl_meridian << std::endl; // Defl PM value + std::cout << " DEFL PRIME V = " << std::setw(6) << std::right << theGeoidPoint->gVar.dDefl_primev << std::endl; // Defl PV value + std::cout << std::endl; return true; @@ -163,7 +161,7 @@ bool interpolateGridPoint(geoid_point* theGeoidPoint, const int& method) bool FileTransformation(const char* fileIn, const char* fileOut, const int& intDmsFlag=0) { - cout << "+ Interpolating geoid information using a points file... "; + std::cout << "+ Interpolating geoid information using a points file... "; int method(BICUBIC); @@ -174,30 +172,30 @@ bool FileTransformation(const char* fileIn, const char* fileOut, const int& intD if (!DNAGEOID_FileTransformation(fileIn, fileOut, method, intEllipsoidtoOrtho, intDmsFlag, exportDnaGeoidFile, &status)) { - cout << "Error: " << status << endl; + std::cout << "Error: " << status << std::endl; return false; } - cout << "done." << endl << - "+ File written to:" << endl << - " " << fileOut << endl << endl; + std::cout << "done." << std::endl << + "+ File written to:" << std::endl << + " " << fileOut << std::endl << std::endl; int pointsInterpolated(0), pointsNotInterpolated(0); if (!DNAGEOID_PointsInterpolated(&pointsInterpolated, &status)) { - cout << "Error: " << status << endl; + std::cout << "Error: " << status << std::endl; return false; } if (!DNAGEOID_PointsNotInterpolated(&pointsNotInterpolated, &status)) { - cout << "Error: " << status << endl; + std::cout << "Error: " << status << std::endl; return false; } - cout << "+ Points interpolated: " << pointsInterpolated << endl << - "+ Points not interpolated: " << pointsNotInterpolated << endl << endl; + std::cout << "+ Points interpolated: " << pointsInterpolated << std::endl << + "+ Points not interpolated: " << pointsNotInterpolated << std::endl << std::endl; return true; } @@ -235,7 +233,7 @@ int main(int argc, char* argv[]) theGeoidPoint.cVar.iHeightSystem = 0; // 2. Call interpolateGridPoint() as many times as required - cout << "+ Interpolating from grid file... " << endl; + std::cout << "+ Interpolating from grid file... " << std::endl; for (int i=0; i<4; ++i) { diff --git a/dynadjust/dynadjust/dynadjust/dynadjust.cpp b/dynadjust/dynadjust/dynadjust/dynadjust.cpp index 7e10f1c2..767a4e44 100644 --- a/dynadjust/dynadjust/dynadjust/dynadjust.cpp +++ b/dynadjust/dynadjust/dynadjust/dynadjust.cpp @@ -19,12 +19,6 @@ #include #include -using namespace std; -using namespace boost; -using namespace boost::filesystem; -using namespace boost::posix_time; -using namespace boost::program_options; - boost::mutex cout_mutex; #include @@ -44,66 +38,66 @@ boost::mutex cout_mutex; using namespace dynadjust; -int CloseLogandReturn(std::ofstream& os, const int status, const string& output_file="") +int CloseLogandReturn(std::ofstream& os, const int status, const std::string& output_file="") { if (status == EXIT_FAILURE) { - os << setw(25) << left << formattedDateTimeString() << - "Failed. " << endl << endl << + os << std::setw(25) << std::left << formattedDateTimeString() << + "Failed. " << std::endl << std::endl << "+ DynAdjust ended prematurely. "; if (!output_file.empty()) { std::ifstream f(output_file); - os << " Contents of last output file:" << endl << endl << f.rdbuf(); + os << " Contents of last output file:" << std::endl << std::endl << f.rdbuf(); } else - os << endl; + os << std::endl; } else - os << endl << endl << "+ DynAdjust finished successfully." << endl; + os << std::endl << std::endl << "+ DynAdjust finished successfully." << std::endl; os.close(); return status; } -void PrintAppStartTimeMessage(std::ofstream& os, string&& app) +void PrintAppStartTimeMessage(std::ofstream& os, std::string&& app) { // App start time - os << setw(15) << left << string("+ " + app) << setw(25) << - formattedDateTimeString(); + os << std::setw(15) << std::left << std::string("+ " + app) << std::setw(25) << + formattedDateTimeString(); } void PrintSuccessStatusMessage(std::ofstream& os) { // end time - os << setw(25) << left << formattedDateTimeString() << - "Ended successfully." << endl; + os << std::setw(25) << std::left << formattedDateTimeString() << + "Ended successfully." << std::endl; } int main(int argc, char* argv[]) { - stringstream ss; + std::stringstream ss; - string cmd_line_banner; + std::string cmd_line_banner; fileproc_help_header(&cmd_line_banner); project_settings p; - variables_map vm; - positional_options_description positional_options; + boost::program_options::variables_map vm; + boost::program_options::positional_options_description positional_options; - options_description standard_options("+ " + string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description generic_options("+ " + string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description standard_options("+ " + std::string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description generic_options("+ " + std::string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); - string cmd_line_usage("+ "); + std::string cmd_line_usage("+ "); cmd_line_usage.append(__BINARY_NAME__).append(" usage: ").append(__BINARY_NAME__).append(" ").append(" [options]"); - options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); try { standard_options.add_options() - (PROJECT_FILE_P, value(&p.g.project_file), + (PROJECT_FILE_P, boost::program_options::value(&p.g.project_file), "Project file containing all user options for import, segment, geoid, reftran, adjust and plot.") - (NETWORK_NAME_N, value(&p.g.network_name), + (NETWORK_NAME_N, boost::program_options::value(&p.g.network_name), "Network name. User defined name for all input and output files. Default is \"network#\".") (RUN_IMPORT, "Run import - DynAdjust file exchange software.") @@ -118,13 +112,13 @@ int main(int argc, char* argv[]) ; generic_options.add_options() - (VERBOSE, value(&p.g.verbose), - string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information\n 3: Debug level information").c_str()) + (VERBOSE, boost::program_options::value(&p.g.verbose), + std::string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information\n 3: Debug level information").c_str()) (QUIET, - string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs.").c_str()) + std::string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs.").c_str()) (VERSION_V, "Display the current program version.") (HELP_H, "Show this help message.") - (HELP_MODULE_H, value(), + (HELP_MODULE_H, boost::program_options::value(), "Provide help for a specific help category.") ; @@ -133,52 +127,52 @@ int main(int argc, char* argv[]) // add "positional options" to handle command line tokens which have no option name positional_options.add(NETWORK_NAME, -1); - command_line_parser parser(argc, argv); + boost::program_options::command_line_parser parser(argc, argv); store(parser.options(allowable_options).positional(positional_options).run(), vm); notify(vm); } catch (const std::exception& e) { cout_mutex.lock(); - cout << "- Error: " << e.what() << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << "- Error: " << e.what() << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; cout_mutex.unlock(); return EXIT_FAILURE; } if (argc < 2) { - cout << endl << "- Nothing to do - no options provided. " << endl << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << std::endl << "- Nothing to do - no options provided. " << std::endl << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } if (vm.count(VERSION)) { - cout << cmd_line_banner << endl; + std::cout << cmd_line_banner << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP)) { - cout << cmd_line_banner << allowable_options << endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP_MODULE)) { - cout << cmd_line_banner; - string original_text = vm[HELP_MODULE].as(); - string help_text = str_upper(original_text); + std::cout << cmd_line_banner; + std::string original_text = vm[HELP_MODULE].as(); + std::string help_text = str_upper(original_text); - if (str_upper(ALL_MODULE_STDOPT).find(help_text) != string::npos) { - cout << standard_options << endl; + if (str_upper(ALL_MODULE_STDOPT).find(help_text) != std::string::npos) { + std::cout << standard_options << std::endl; } - else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != string::npos) { - cout << generic_options << endl; + else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != std::string::npos) { + std::cout << generic_options << std::endl; } else { - cout << endl << "- Error: Help module '" << - original_text << "' is not in the list of options." << endl; + std::cout << std::endl << "- Error: Help module '" << + original_text << "' is not in the list of options." << std::endl; return EXIT_FAILURE; } @@ -188,11 +182,11 @@ int main(int argc, char* argv[]) if (vm.count(QUIET)) p.g.quiet = 1; else - cout << endl << cmd_line_banner; + std::cout << std::endl << cmd_line_banner; if (!vm.count(PROJECT_FILE) && !vm.count(NETWORK_NAME)) { - cout << endl << "- Nothing to do - no project file or network name specified. " << endl << endl; + std::cout << std::endl << "- Nothing to do - no project file or network name specified. " << std::endl << std::endl; return EXIT_FAILURE; } @@ -202,29 +196,29 @@ int main(int argc, char* argv[]) !vm.count(RUN_SEGMENT) && !vm.count(RUN_ADJUST)) { - cout << endl << "- Nothing to do - no programs were specified. " << endl << endl; + std::cout << std::endl << "- Nothing to do - no programs were specified. " << std::endl << std::endl; return EXIT_FAILURE; } if (vm.count(PROJECT_FILE) && vm.count(NETWORK_NAME)) { - if (equals(path(p.g.project_file).stem().string(), p.g.network_name)) + if (boost::equals(boost::filesystem::path(p.g.project_file).stem().string(), p.g.network_name)) { - cout << endl << "- Error: project file name doesn't match network name. Provide" << endl; - cout << endl << " either a project file path or the network name. " << endl << endl; + std::cout << std::endl << "- Error: project file name doesn't match network name. Provide" << std::endl; + std::cout << std::endl << " either a project file path or the network name. " << std::endl << std::endl; return EXIT_FAILURE; } } // If a name was supplied, form full file path for project file using the current folder if (vm.count(NETWORK_NAME)) - p.g.project_file = formPath(".", p.g.network_name, "dnaproj"); + p.g.project_file = formPath(".", p.g.network_name, "dnaproj"); - if (!exists(p.g.project_file)) + if (!boost::filesystem::exists(p.g.project_file)) { - cout << endl << + std::cout << std::endl << "- Error: Project file " << p.g.project_file << - " does not exist. " << endl << endl; + " does not exist. " << std::endl << std::endl; return EXIT_FAILURE; } @@ -233,7 +227,7 @@ int main(int argc, char* argv[]) projectFile.LoadProjectFile(p.g.project_file); p = projectFile.GetSettings(); - string dynadjustLogFilePath(formPath(p.g.output_folder, "dynadjust", "log")); + std::string dynadjustLogFilePath(formPath(p.g.output_folder, "dynadjust", "log")); p.g.log_file = dynadjustLogFilePath; projectFile.UpdateSettingsGeneral(p.g); @@ -241,36 +235,36 @@ int main(int argc, char* argv[]) std::ofstream dynadjust_log; - ss << "- Error: Could not open dynadjust.log for writing." << endl; + ss << "- Error: Could not open dynadjust.log for writing." << std::endl; try { // Create dynadjust log file. Exit failure. file_opener(dynadjust_log, dynadjustLogFilePath); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - cout << endl << ss.str() << endl << endl; + std::cout << std::endl << ss.str() << std::endl << std::endl; return EXIT_FAILURE; } catch (...) { - cout << endl << ss.str() << endl << endl; + std::cout << std::endl << ss.str() << std::endl << std::endl; return EXIT_FAILURE; } - dynadjust_log << cmd_line_banner << endl; + dynadjust_log << cmd_line_banner << std::endl; - dynadjust_log << left << setw(15) << "+ Executable" << - setw(25) << "Start date and time" << - setw(25) << "End date and time" << - setw(25) << "Exit status" << endl; + dynadjust_log << std::left << std::setw(15) << "+ Executable" << + std::setw(25) << "Start date and time" << + std::setw(25) << "End date and time" << + std::setw(25) << "Exit status" << std::endl; for (UINT32 d=0, linelen(15+25+25+25); d(p.g.output_folder, p.g.network_name, "imp"); + p.i.imp_file = formPath(p.g.output_folder, p.g.network_name, "imp"); return CloseLogandReturn(dynadjust_log, EXIT_FAILURE, p.i.imp_file); } // end time PrintSuccessStatusMessage(dynadjust_log); - boost::this_thread::sleep(milliseconds(40)); + boost::this_thread::sleep(boost::posix_time::milliseconds(40)); } // Run reftran (optional) if (vm.count(RUN_REFTRAN)) { - stringstream cmd; + std::stringstream cmd; cmd << __reftran_app_name__ << " -p " << p.g.project_file; if (p.g.quiet) @@ -309,13 +303,13 @@ int main(int argc, char* argv[]) // end time PrintSuccessStatusMessage(dynadjust_log); - boost::this_thread::sleep(milliseconds(40)); + boost::this_thread::sleep(boost::posix_time::milliseconds(40)); } // Run geoid (optional) if (vm.count(RUN_GEOID)) { - stringstream cmd; + std::stringstream cmd; cmd << __geoid_app_name__ << " -p " << p.g.project_file; if (p.g.quiet) @@ -330,13 +324,13 @@ int main(int argc, char* argv[]) // end time PrintSuccessStatusMessage(dynadjust_log); - boost::this_thread::sleep(milliseconds(40)); + boost::this_thread::sleep(boost::posix_time::milliseconds(40)); } // Run segment (optional) if (vm.count(RUN_SEGMENT)) { - stringstream cmd; + std::stringstream cmd; cmd << __segment_app_name__ << " -p " << p.g.project_file; if (p.g.quiet) @@ -351,13 +345,13 @@ int main(int argc, char* argv[]) // end time PrintSuccessStatusMessage(dynadjust_log); - boost::this_thread::sleep(milliseconds(40)); + boost::this_thread::sleep(boost::posix_time::milliseconds(40)); } // Run adjust (optional) if (vm.count(RUN_ADJUST)) { - stringstream cmd; + std::stringstream cmd; cmd << __adjust_app_name__ << " -p " << p.g.project_file; if (p.g.quiet) @@ -372,7 +366,7 @@ int main(int argc, char* argv[]) // end time PrintSuccessStatusMessage(dynadjust_log); - boost::this_thread::sleep(milliseconds(40)); + boost::this_thread::sleep(boost::posix_time::milliseconds(40)); } return CloseLogandReturn(dynadjust_log, EXIT_SUCCESS); diff --git a/dynadjust/dynadjust/metadata/metadata.cpp b/dynadjust/dynadjust/metadata/metadata.cpp index 94a102f1..8ffd1c16 100644 --- a/dynadjust/dynadjust/metadata/metadata.cpp +++ b/dynadjust/dynadjust/metadata/metadata.cpp @@ -20,12 +20,6 @@ #include #include -using namespace std; -using namespace boost; -using namespace boost::filesystem; -using namespace boost::posix_time; -using namespace boost::program_options; - boost::mutex cout_mutex; boost::mutex import_file_mutex; @@ -48,21 +42,21 @@ using namespace dynadjust; using namespace dynadjust::exception; using namespace dynadjust::datum_parameters; -void processGNSSMeasurement(string& dnaMeasurementGNSS, string& referenceFrame, string& epoch, size_t& lineNo, size_t& measurementUpdateCount) +void processGNSSMeasurement(std::string& dnaMeasurementGNSS, std::string& referenceFrame, std::string& epoch, size_t& lineNo, size_t& measurementUpdateCount) { - string tmp(dnaMeasurementGNSS); + std::string tmp(dnaMeasurementGNSS); // Validate reference frame and epoch. Throws on error CDnaDatum datum; datum.SetDatumFromName(referenceFrame, epoch); - string FirstTag = ""; - string referenceframeTagOpen = ""; - string referenceframeTagClose = ""; - string epochTagOpen = ""; - string epochTagClose = ""; + std::string FirstTag = ""; + std::string referenceframeTagOpen = ""; + std::string referenceframeTagClose = ""; + std::string epochTagOpen = ""; + std::string epochTagClose = ""; - string referenceFrameElement, epochElement; + std::string referenceFrameElement, epochElement; referenceFrameElement = referenceframeTagOpen + referenceFrame + referenceframeTagClose + "\n "; epochElement = epochTagOpen + epoch + epochTagClose + "\n "; @@ -73,14 +67,14 @@ void processGNSSMeasurement(string& dnaMeasurementGNSS, string& referenceFrame, /////////////////////////////////////////////////////////// // Look for the existence of in data // If none, add new - if ((pos = tmp.find(referenceframeTagOpen)) == string::npos) + if ((pos = tmp.find(referenceframeTagOpen)) == std::string::npos) { // Okay, no reference frame tag. Add it before - if ((pos = tmp.find(FirstTag)) == string::npos) + if ((pos = tmp.find(FirstTag)) == std::string::npos) { - stringstream ss; - ss << "processGNSSMeasurement(): Could not find element in:" << endl << - dnaMeasurementGNSS << endl; + std::stringstream ss; + ss << "processGNSSMeasurement(): Could not find element in:" << std::endl << + dnaMeasurementGNSS << std::endl; throw XMLInteropException(ss.str(), (int)lineNo); } @@ -91,14 +85,14 @@ void processGNSSMeasurement(string& dnaMeasurementGNSS, string& referenceFrame, /////////////////////////////////////////////////////////// // Look for the existence of in data // If none, add new - if ((pos = tmp.find(epochTagOpen)) == string::npos) + if ((pos = tmp.find(epochTagOpen)) == std::string::npos) { // Okay, no reference frame tag. Add it before - if ((pos = tmp.find(FirstTag)) == string::npos) + if ((pos = tmp.find(FirstTag)) == std::string::npos) { - stringstream ss; - ss << "processGNSSMeasurement(): Could not find element in:" << endl << - dnaMeasurementGNSS << endl; + std::stringstream ss; + ss << "processGNSSMeasurement(): Could not find element in:" << std::endl << + dnaMeasurementGNSS << std::endl; throw XMLInteropException(ss.str(), (int)lineNo); } @@ -111,15 +105,15 @@ void processGNSSMeasurement(string& dnaMeasurementGNSS, string& referenceFrame, measurementUpdateCount++; } -void GetDefaultReferenceFrameEpoch(string& sBuf, string& referenceFrame, string& epoch) +void GetDefaultReferenceFrameEpoch(std::string& sBuf, std::string& referenceFrame, std::string& epoch) { size_t pos; - string referenceFrameAttribute = "referenceframe"; - string epochAttribute = "epoch"; + std::string referenceFrameAttribute = "referenceframe"; + std::string epochAttribute = "epoch"; - string tmp; + std::string tmp; - if ((pos = sBuf.find(referenceFrameAttribute)) != string::npos) + if ((pos = sBuf.find(referenceFrameAttribute)) != std::string::npos) { // Okay, get the reference frame // Advance to = @@ -128,13 +122,13 @@ void GetDefaultReferenceFrameEpoch(string& sBuf, string& referenceFrame, string& pos++; tmp = sBuf.substr(pos); - if ((pos = tmp.find("\"")) != string::npos) + if ((pos = tmp.find("\"")) != std::string::npos) tmp = tmp.substr(0, pos); referenceFrame = tmp; } - if ((pos = sBuf.find(epochAttribute)) != string::npos) + if ((pos = sBuf.find(epochAttribute)) != std::string::npos) { // Okay, get the epoch // Advance to = @@ -143,7 +137,7 @@ void GetDefaultReferenceFrameEpoch(string& sBuf, string& referenceFrame, string& pos++; tmp = sBuf.substr(pos); - if ((pos = tmp.find("\"")) != string::npos) + if ((pos = tmp.find("\"")) != std::string::npos) tmp = tmp.substr(0, pos); epoch = tmp; @@ -151,30 +145,30 @@ void GetDefaultReferenceFrameEpoch(string& sBuf, string& referenceFrame, string& } -void processFile(std::ifstream* ifsFile, std::ofstream* ofsFile, string& defaultFrame, string& defaultEpoch, +void processFile(std::ifstream* ifsFile, std::ofstream* ofsFile, std::string& defaultFrame, std::string& defaultEpoch, size_t& measurementUpdateCount, size_t& unsureFrameCount, size_t& unsureEpochCount) { - string sBuf, tmp; + std::string sBuf, tmp; - string referenceFrame(GDA94_s); - string epoch("01.01.1994"); + std::string referenceFrame(GDA94_s); + std::string epoch("01.01.1994"); - string openingDnaMeasurementTag = ""; - string closingDnaMeasurementTag = ""; + std::string openingDnaMeasurementTag = ""; + std::string closingDnaMeasurementTag = ""; - string dnaxmlFormatTag = " - const string metadataReferenceFrame = "[BASELINE REFFRAME]"; + const std::string metadataReferenceFrame = "[BASELINE REFFRAME]"; // - const string metadataEpoch = "[BASELINE EPOCH]"; + const std::string metadataEpoch = "[BASELINE EPOCH]"; - stringstream dnameasurementStream; + std::stringstream dnameasurementStream; bool newMeasurement(false); dnameasurementStream.str(""); @@ -198,14 +192,14 @@ void processFile(std::ifstream* ifsFile, std::ofstream* ofsFile, string& default if (ifsFile->eof()) return; - stringstream ss; - ss << "processFile(): Could not read from the station file." << endl; + std::stringstream ss; + ss << "processFile(): Could not read from the station file." << std::endl; throw XMLInteropException(ss.str(), (int)lineNo); } // Reached a DnaMeasurement opening tag? - if (sBuf.find(dnaxmlFormatTag) != string::npos) + if (sBuf.find(dnaxmlFormatTag) != std::string::npos) { // Get the default reference frame and epoch GetDefaultReferenceFrameEpoch(sBuf, referenceFrame, epoch); @@ -219,7 +213,7 @@ void processFile(std::ifstream* ifsFile, std::ofstream* ofsFile, string& default } // Reached a DnaMeasurement opening tag? - if (sBuf.find(openingDnaMeasurementTag) != string::npos) + if (sBuf.find(openingDnaMeasurementTag) != std::string::npos) { // yes, found an opening tag! newMeasurement = true; @@ -228,30 +222,30 @@ void processFile(std::ifstream* ifsFile, std::ofstream* ofsFile, string& default dnameasurementStream.str(""); // Add this string to the stringstream (for subsequent processing) - dnameasurementStream << sBuf << endl; + dnameasurementStream << sBuf << std::endl; } // Reached a DnaMeasurement closing tag? - else if (sBuf.find(closingDnaMeasurementTag) != string::npos) + else if (sBuf.find(closingDnaMeasurementTag) != std::string::npos) { // yes, found a closing tag! - dnameasurementStream << sBuf << endl; + dnameasurementStream << sBuf << std::endl; // capture the measurement - string dnaMeasurementGNSS = dnameasurementStream.str(); + std::string dnaMeasurementGNSS = dnameasurementStream.str(); // Is this a GNSS measurement? if not, dump and continue - if (dnaMeasurementGNSS.find(gType) != string::npos) + if (dnaMeasurementGNSS.find(gType) != std::string::npos) { // Process GNSS measurement processGNSSMeasurement(dnaMeasurementGNSS, referenceFrame, epoch, lineNo, measurementUpdateCount); } - else if (dnaMeasurementGNSS.find(xType) != string::npos) + else if (dnaMeasurementGNSS.find(xType) != std::string::npos) { // Process GNSS measurement processGNSSMeasurement(dnaMeasurementGNSS, referenceFrame, epoch, lineNo, measurementUpdateCount); } - else if (dnaMeasurementGNSS.find(yType) != string::npos) + else if (dnaMeasurementGNSS.find(yType) != std::string::npos) { // Process GNSS measurement processGNSSMeasurement(dnaMeasurementGNSS, referenceFrame, epoch, lineNo, measurementUpdateCount); @@ -273,7 +267,7 @@ void processFile(std::ifstream* ifsFile, std::ofstream* ofsFile, string& default if (newMeasurement) { // Yes, add this string to the stringstream (for subsequent processing) - dnameasurementStream << sBuf << endl; + dnameasurementStream << sBuf << std::endl; } else { @@ -282,14 +276,14 @@ void processFile(std::ifstream* ifsFile, std::ofstream* ofsFile, string& default // - A comment preceding a DnaMeasurement // Dump the line to output file - (*ofsFile) << sBuf << endl; + (*ofsFile) << sBuf << std::endl; } // Now check for Reference frame and epoch comments tmp = trimstr(sBuf); // Is this line a comment? - if (tmp.find(xmlComment) == string::npos) + if (tmp.find(xmlComment) == std::string::npos) { // No, this is a measurement element. @@ -300,21 +294,21 @@ void processFile(std::ifstream* ifsFile, std::ofstream* ofsFile, string& default // At this point, tmp is a comment. // Is this line a reference frame metadata tag in the comment? - if (tmp.find(metadataReferenceFrame) != string::npos) + if (tmp.find(metadataReferenceFrame) != std::string::npos) { - if ((pos = tmp.find("]", 0)) != string::npos) + if ((pos = tmp.find("]", 0)) != std::string::npos) { referenceFrame = tmp.substr(pos+1); - if ((pos = referenceFrame.find("-->", 0)) != string::npos) + if ((pos = referenceFrame.find("-->", 0)) != std::string::npos) referenceFrame = trimstr(referenceFrame.substr(0, pos)); - if (iequals(referenceFrame, "unsure")) + if (boost::iequals(referenceFrame, "unsure")) { referenceFrame = defaultFrame; unsureFrameCount++; } - if (iequals(referenceFrame, "WGS84")) + if (boost::iequals(referenceFrame, "WGS84")) { referenceFrame = "ITRF1989"; } @@ -322,15 +316,15 @@ void processFile(std::ifstream* ifsFile, std::ofstream* ofsFile, string& default } // Is this line a epoch metadata tag in the comment? - else if (tmp.find(metadataEpoch) != string::npos) + else if (tmp.find(metadataEpoch) != std::string::npos) { - if ((pos = tmp.find("]", 0)) != string::npos) + if ((pos = tmp.find("]", 0)) != std::string::npos) { epoch = tmp.substr(pos+1); - if ((pos = epoch.find("-->", 0)) != string::npos) + if ((pos = epoch.find("-->", 0)) != std::string::npos) epoch = trimstr(epoch.substr(0, pos)); - if (iequals(epoch, "unsure")) + if (boost::iequals(epoch, "unsure")) { epoch = "01.01.2005"; unsureEpochCount++; @@ -345,36 +339,36 @@ void processFile(std::ifstream* ifsFile, std::ofstream* ofsFile, string& default int main(int argc, char* argv[]) { - stringstream ss_err; + std::stringstream ss_err; - string cmd_line_banner; + std::string cmd_line_banner; fileproc_help_header(&cmd_line_banner); project_settings p; - variables_map vm; - positional_options_description positional_options; + boost::program_options::variables_map vm; + boost::program_options::positional_options_description positional_options; - options_description standard_options("+ " + string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); - options_description generic_options("+ " + string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description standard_options("+ " + std::string(ALL_MODULE_STDOPT), PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description generic_options("+ " + std::string(ALL_MODULE_GENERIC), PROGRAM_OPTIONS_LINE_LENGTH); - string cmd_line_usage("+ "); + std::string cmd_line_usage("+ "); cmd_line_usage.append(__BINARY_NAME__).append(" usage: ").append(__BINARY_NAME__).append(" ").append(" [options]"); - options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); + boost::program_options::options_description allowable_options(cmd_line_usage, PROGRAM_OPTIONS_LINE_LENGTH); try { standard_options.add_options() - (IMPORT_FILE_F, value< vstring >(&p.i.input_files), + (IMPORT_FILE_F, boost::program_options::value< vstring >(&p.i.input_files), "Station and measurement input file(s). Switch is not required.") ; generic_options.add_options() - (VERBOSE, value(&p.g.verbose), - string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information\n 3: Debug level information").c_str()) + (VERBOSE, boost::program_options::value(&p.g.verbose), + std::string("Give detailed information about what ").append(__BINARY_NAME__).append(" is doing.\n 0: No information (default)\n 1: Helpful information\n 2: Extended information\n 3: Debug level information").c_str()) (QUIET, - string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs.").c_str()) + std::string("Suppresses all explanation of what ").append(__BINARY_NAME__).append(" is doing unless an error occurs.").c_str()) (VERSION_V, "Display the current program version.") (HELP_H, "Show this help message.") - (HELP_MODULE_H, value(), + (HELP_MODULE_H, boost::program_options::value(), "Provide help for a specific help category.") ; @@ -383,52 +377,52 @@ int main(int argc, char* argv[]) // add "positional options" to handle command line tokens which have no option name positional_options.add(IMPORT_FILE, -1); - command_line_parser parser(argc, argv); + boost::program_options::command_line_parser parser(argc, argv); store(parser.options(allowable_options).positional(positional_options).run(), vm); notify(vm); } catch (const std::exception& e) { cout_mutex.lock(); - cout << "- Error: " << e.what() << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << "- Error: " << e.what() << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; cout_mutex.unlock(); return EXIT_FAILURE; } if (argc < 2) { - cout << endl << "- Nothing to do - no files or options provided. " << endl << endl; - cout << cmd_line_banner << allowable_options << endl; + std::cout << std::endl << "- Nothing to do - no files or options provided. " << std::endl << std::endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_FAILURE; } if (vm.count(VERSION)) { - cout << cmd_line_banner << endl; + std::cout << cmd_line_banner << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP)) { - cout << cmd_line_banner << allowable_options << endl; + std::cout << cmd_line_banner << allowable_options << std::endl; return EXIT_SUCCESS; } if (vm.count(HELP_MODULE)) { - cout << cmd_line_banner; - string original_text = vm[HELP_MODULE].as(); - string help_text = str_upper(original_text); + std::cout << cmd_line_banner; + std::string original_text = vm[HELP_MODULE].as(); + std::string help_text = str_upper(original_text); - if (str_upper(ALL_MODULE_STDOPT).find(help_text) != string::npos) { - cout << standard_options << endl; + if (str_upper(ALL_MODULE_STDOPT).find(help_text) != std::string::npos) { + std::cout << standard_options << std::endl; } - else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != string::npos) { - cout << generic_options << endl; + else if (str_upper(ALL_MODULE_GENERIC).find(help_text) != std::string::npos) { + std::cout << generic_options << std::endl; } else { - cout << endl << "- Error: Help module '" << - original_text << "' is not in the list of options." << endl; + std::cout << std::endl << "- Error: Help module '" << + original_text << "' is not in the list of options." << std::endl; return EXIT_FAILURE; } @@ -437,28 +431,28 @@ int main(int argc, char* argv[]) // Normalise files using input folder for_each(p.i.input_files.begin(), p.i.input_files.end(), - [&p] (string& file) { - formPath(p.g.input_folder, file); + [&p] (std::string& file) { + formPath(p.g.input_folder, file); } ); UINT32 stnCount(0), msrCount(0), clusterID(0); size_t i, nfiles(p.i.input_files.size()); // for each file... - string input_file, output_file, ss; - string defaultFrame, defaultEpoch; + std::string input_file, output_file, ss; + std::string defaultFrame, defaultEpoch; - ostringstream ss_time, ss_msg; - milliseconds elapsed_time(milliseconds(0)); + std::ostringstream ss_time, ss_msg; + boost::posix_time::milliseconds elapsed_time(boost::posix_time::milliseconds(0)); ptime pt; if (!p.g.quiet) { - cout << endl << cmd_line_banner; - cout << "+ Parsing: " << endl; + std::cout << std::endl << cmd_line_banner; + std::cout << "+ Parsing: " << std::endl; } - cpu_timer time; // constructor of boost::timer::cpu_timer calls start() + boost::timer::cpu_timer time; // constructor of boost::timer::cpu_timer calls start() std::ifstream* ifsDynaML_; size_t sifsFileSize_, measurementUpdateCount(0), unsureFrameCount(0), unsureEpochCount(0); @@ -470,9 +464,9 @@ int main(int argc, char* argv[]) size_t strlen_arg = 0; for_each(p.i.input_files.begin(), p.i.input_files.end(), - [&strlen_arg](string& file) { - if (leafStr(file).length() > strlen_arg) - strlen_arg = leafStr(file).length(); + [&strlen_arg](std::string& file) { + if (leafStr(file).length() > strlen_arg) + strlen_arg = leafStr(file).length(); }); strlen_arg += (6 + PROGRESS_PERCENT_04); @@ -482,25 +476,25 @@ int main(int argc, char* argv[]) time.start(); - if (!exists(input_file)) + if (!boost::filesystem::exists(input_file)) { - input_file = formPath(p.g.input_folder, input_file); - if (!exists(input_file)) + input_file = formPath(p.g.input_folder, input_file); + if (!boost::filesystem::exists(input_file)) { - cout << "- Error: " << input_file << " does not exist" << endl; + std::cout << "- Error: " << input_file << " does not exist" << std::endl; return EXIT_FAILURE; } } // Form output file path - stringstream ss_outputfile(""); + std::stringstream ss_outputfile(""); ss_outputfile << path(input_file).stem().generic_string(); ss_outputfile << ".edit.xml"; output_file = ss_outputfile.str(); - ss = leafStr(p.i.input_files.at(i)) + "... "; + ss = leafStr(p.i.input_files.at(i)) + "... "; if (!p.g.quiet) - cout << " " << setw(strlen_arg) << left << ss; + std::cout << " " << std::setw(strlen_arg) << std::left << ss; // Obtain exclusive use of the input file pointer import_file_mutex.lock(); @@ -516,20 +510,20 @@ int main(int argc, char* argv[]) ifsDynaML_ = new std::ifstream; // Open and seek to end immediately after opening. - file_opener(ifsDynaML_, input_file, ios::in | ios::ate, ascii, true); + file_opener(ifsDynaML_, input_file, std::ios::in | std::ios::ate, ascii, true); // get file size and return to start sifsFileSize_ = (size_t)ifsDynaML_->tellg(); - ifsDynaML_->seekg(0, ios::beg); + ifsDynaML_->seekg(0, std::ios::beg); } - catch (const ios_base::failure& f) { - cout << "- Error: An error was encountered when opening " << input_file << "." << endl; - cout << " Check that the file exists and that the file is not already opened." << endl << f.what(); + catch (const std::ios_base::failure& f) { + std::cout << "- Error: An error was encountered when opening " << input_file << "." << std::endl; + std::cout << " Check that the file exists and that the file is not already opened." << std::endl << f.what(); return EXIT_FAILURE; } catch (...) { - cout << "- Error: An error was encountered when opening " << input_file << "." << endl; - cout << " Check that the file exists and that the file is not already opened."; + std::cout << "- Error: An error was encountered when opening " << input_file << "." << std::endl; + std::cout << " Check that the file exists and that the file is not already opened."; return EXIT_FAILURE; } @@ -544,15 +538,15 @@ int main(int argc, char* argv[]) ofsDynaML_ = new std::ofstream; // Open output file - file_opener(ofsDynaML_, output_file, ios::out, ascii); + file_opener(ofsDynaML_, output_file, std::ios::out, ascii); } - catch (const ios_base::failure& f) { - cout << "- Error: An error was encountered when opening " << output_file << "." << endl << f.what(); + catch (const std::ios_base::failure& f) { + std::cout << "- Error: An error was encountered when opening " << output_file << "." << std::endl << f.what(); return EXIT_FAILURE; } catch (...) { - cout << "- Error: An error was encountered when opening " << output_file << "." << endl; + std::cout << "- Error: An error was encountered when opening " << output_file << "." << std::endl; return EXIT_FAILURE; } @@ -565,32 +559,32 @@ int main(int argc, char* argv[]) processFile(ifsDynaML_, ofsDynaML_, defaultFrame, defaultEpoch, measurementUpdateCount, unsureFrameCount, unsureEpochCount); } - catch (const runtime_error& e) { - cout << endl << "- Error: " << e.what() << endl; + catch (const std::runtime_error& e) { + std::cout << std::endl << "- Error: " << e.what() << std::endl; return EXIT_FAILURE; }catch (const XMLInteropException& e) { - cout << endl << "- Error: " << e.what() << endl; + std::cout << std::endl << "- Error: " << e.what() << std::endl; return EXIT_FAILURE; } catch (...) { - cout << "+ Exception of unknown type!\n"; + std::cout << "+ Exception of unknown type!\n"; return EXIT_FAILURE; } // Finish up time.stop(); - elapsed_time = milliseconds(time.elapsed().wall/MILLI_TO_NANO); + elapsed_time = boost::posix_time::milliseconds(time.elapsed().wall/MILLI_TO_NANO); if (!p.g.quiet) { - cout << "done." << endl << endl; - cout << "+ Output file: " << output_file << endl; - cout << "+ Default reference frame: " << defaultFrame << endl; - cout << "+ Default epoch: " << defaultEpoch << endl; - cout << "+ No. DnaMeasurement records updated: " << measurementUpdateCount << endl; - cout << "+ No. comments with \"unsure\" frame: " << unsureFrameCount << endl; - cout << "+ No. comments with \"unsure\" epoch: " << unsureEpochCount << endl; + std::cout << "done." << std::endl << std::endl; + std::cout << "+ Output file: " << output_file << std::endl; + std::cout << "+ Default reference frame: " << defaultFrame << std::endl; + std::cout << "+ Default epoch: " << defaultEpoch << std::endl; + std::cout << "+ No. DnaMeasurement records updated: " << measurementUpdateCount << std::endl; + std::cout << "+ No. comments with \"unsure\" frame: " << unsureFrameCount << std::endl; + std::cout << "+ No. comments with \"unsure\" epoch: " << unsureEpochCount << std::endl; } @@ -609,7 +603,7 @@ int main(int argc, char* argv[]) { ifsDynaML_ = 0; } - cout << "- Error: An error was encountered when closing " << input_file << "." << endl << endl << e.what() << endl << " Check that the file exists and that the file is not already opened."; + std::cout << "- Error: An error was encountered when closing " << input_file << "." << std::endl << std::endl << e.what() << std::endl << " Check that the file exists and that the file is not already opened."; return EXIT_FAILURE; } @@ -630,7 +624,7 @@ int main(int argc, char* argv[]) { ofsDynaML_ = 0; } - cout << "- Error: An error was encountered when closing " << output_file << "." << endl << endl << e.what() << endl; + std::cout << "- Error: An error was encountered when closing " << output_file << "." << std::endl << std::endl << e.what() << std::endl; return EXIT_FAILURE; } @@ -638,8 +632,8 @@ int main(int argc, char* argv[]) if (!p.g.quiet) { - string time_message = formatedElapsedTime(&elapsed_time, "+ File processing time: "); - cout << time_message << endl << endl; + std::string time_message = formatedElapsedTime(&elapsed_time, "+ File processing time: "); + std::cout << time_message << std::endl << std::endl; } // release file pointer mutex diff --git a/dynadjust/include/config/dnaconsts.hpp b/dynadjust/include/config/dnaconsts.hpp index 92062194..044b9977 100644 --- a/dynadjust/include/config/dnaconsts.hpp +++ b/dynadjust/include/config/dnaconsts.hpp @@ -107,7 +107,7 @@ const double HPOS_UNCERT_Q3(0.371625); const double E4_SEC_DEFLECTION(0.0001 * SEC_TO_RAD); const double STN_SEARCH_RADIUS(0.3); -const string STN_SEARCH_RADIUS_STR("0.3"); +const std::string STN_SEARCH_RADIUS_STR("0.3"); const double TOLERANCE_SEC_MIN(1.); const double TOLERANCE_SEC_MAX(7200.); // 120 minutes (or 2 degrees) @@ -122,9 +122,9 @@ const double MAX_DBL_VALUE(+1.7e308); const UINT32 MAX_UINT32_VALUE(0xffffffff); #if defined(_WIN32) || defined(__WIN32__) -const string FOLDER_SLASH("\\"); +const std::string FOLDER_SLASH("\\"); #elif defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) -const string FOLDER_SLASH("/"); +const std::string FOLDER_SLASH("/"); #endif #endif // DNACONSTS_HPP diff --git a/dynadjust/include/config/dnaoptions.hpp b/dynadjust/include/config/dnaoptions.hpp index 1bcfdf3f..fba08342 100644 --- a/dynadjust/include/config/dnaoptions.hpp +++ b/dynadjust/include/config/dnaoptions.hpp @@ -143,8 +143,6 @@ enum coastResolution full = 4 }; -using namespace boost; - // general settings used by all programs struct general_settings : private boost::equality_comparable { public: @@ -171,11 +169,11 @@ struct general_settings : private boost::equality_comparable { UINT16 verbose; // Give detailed information about what dnainterop is doing.\n0: No information (default)\n1: Helpful information\n2: Extended information\n3: Debug level information UINT16 version; // Display the current program version UINT16 interactive; // whether to display a Qt Dialog or continue with command window - string log_file; // dynadjust log filename - string project_file; // project filename - string network_name; // network name - string input_folder; // Additional include folder containing input files (used for command line help only) - string output_folder; // Path for all output (intermediate) files + std::string log_file; // dynadjust log filename + std::string project_file; // project filename + std::string network_name; // network name + std::string input_folder; // Additional include folder containing input files (used for command line help only) + std::string output_folder; // Path for all output (intermediate) files v_string_string_pair variables; // Shortcut tags to assist with file naming }; @@ -229,8 +227,8 @@ struct import_settings : private boost::equality_comparable { //} public: - string reference_frame; // Project reference frame - used primarily for reductions on the ellipsoid. - string epoch; // Project epoch + std::string reference_frame; // Project reference frame - used primarily for reductions on the ellipsoid. + std::string epoch; // Project epoch UINT16 user_supplied_frame; // User has supplied a frame - use this to change the default frame UINT16 user_supplied_epoch; // User has supplied a epoch - use this to change the default epoch UINT16 override_input_rfame; // Override reference frame specified in input files using the default or user supplied frame. @@ -250,30 +248,30 @@ struct import_settings : private boost::equality_comparable { UINT16 split_clusters; // Allow bounding box or station selection to split GNSS point and baseline clusters. UINT16 include_transcending_msrs; // Include measurements straddling bounding box. UINT16 apply_scaling; // Apply scaling? - string map_file; // Station map output file - string asl_file; // Associated stations output file - string aml_file; // Associated measurements output file - string bst_file; // Binary station output file - string bms_file; // Binary measurement output file - string dst_file; // Duplicate station output file - string dms_file; // Duplicate measurement output file - string imp_file; // import log file - string geo_file; // Geoid file to use on import - string seg_file; // Segmentation input file - string dbid_file; // Database ID file - string xml_outfile; // Create DynaML output file (combined stn and msr) - string xml_stnfile; // DynaML station file - string xml_msrfile; // DynaML measurement file - string dna_stnfile; // DNA station file - string dna_msrfile; // DNA measurement file - string stn_renamingfile; // Station renaming file - string stn_discontinuityfile; // Station discontinuity file (SINEX format) - string simulate_msrfile; // Simulation control file - string include_msrs; // Import the measurements corresponding to the user-supplied string of measurement types - string exclude_msrs; // Exclude the measurements corresponding to the user-supplied string of measurement types - string bounding_box; // Import stations and measurements within bounding box using comma delimited string \"lat1,lon1,lat2,lon2\" to define upper-left and lower-right limits. - string stn_associated_msr_include; // Include stations and all associated measurements. arg is a comma delimited string \"stn 1,stn 2,stn 3,...,stn N\" of the stations to include. - string stn_associated_msr_exclude; // Exclude stations and all associated measurements. arg is a comma delimited string \"stn 1,stn 2,stn 3,...,stn N\" of the stations to exclude. + std::string map_file; // Station map output file + std::string asl_file; // Associated stations output file + std::string aml_file; // Associated measurements output file + std::string bst_file; // Binary station output file + std::string bms_file; // Binary measurement output file + std::string dst_file; // Duplicate station output file + std::string dms_file; // Duplicate measurement output file + std::string imp_file; // import log file + std::string geo_file; // Geoid file to use on import + std::string seg_file; // Segmentation input file + std::string dbid_file; // Database ID file + std::string xml_outfile; // Create DynaML output file (combined stn and msr) + std::string xml_stnfile; // DynaML station file + std::string xml_msrfile; // DynaML measurement file + std::string dna_stnfile; // DNA station file + std::string dna_msrfile; // DNA measurement file + std::string stn_renamingfile; // Station renaming file + std::string stn_discontinuityfile; // Station discontinuity file (SINEX format) + std::string simulate_msrfile; // Simulation control file + std::string include_msrs; // Import the measurements corresponding to the user-supplied string of measurement types + std::string exclude_msrs; // Exclude the measurements corresponding to the user-supplied string of measurement types + std::string bounding_box; // Import stations and measurements within bounding box using comma delimited string \"lat1,lon1,lat2,lon2\" to define upper-left and lower-right limits. + std::string stn_associated_msr_include; // Include stations and all associated measurements. arg is a comma delimited string \"stn 1,stn 2,stn 3,...,stn N\" of the stations to include. + std::string stn_associated_msr_exclude; // Exclude stations and all associated measurements. arg is a comma delimited string \"stn 1,stn 2,stn 3,...,stn N\" of the stations to exclude. UINT16 rename_stations; // Rename stations using a station renaming file UINT16 apply_discontinuities; // Rename stations using discontinuities and measurement epochs UINT16 search_nearby_stn; // Search for nearby stations @@ -294,8 +292,8 @@ struct import_settings : private boost::equality_comparable { double pscale; // phi scalar double lscale; // lambda scalar double hscale; // height scalar - string scalar_file; // scalar file (individual scalars defined for measurements between specific stations) - string command_line_arguments; + std::string scalar_file; // scalar file (individual scalars defined for measurements between specific stations) + std::string command_line_arguments; vstring input_files; // Default input arguments if no switch is provided. }; @@ -319,15 +317,15 @@ struct reftran_settings : private boost::equality_comparable { //} public: - string rft_file; // reftran log file - string bst_file; // Binary station output file - string bms_file; // Binary measurement output file - string reference_frame; // Reference frame for all stations and measurements. Requires datum.conf and ellipsoid.conf. - string epoch; // Epoch - string tpb_file; // Tectonic plate boundary file - string tpp_file; // Tectonic plate pole file + std::string rft_file; // reftran log file + std::string bst_file; // Binary station output file + std::string bms_file; // Binary measurement output file + std::string reference_frame; // Reference frame for all stations and measurements. Requires datum.conf and ellipsoid.conf. + std::string epoch; // Epoch + std::string tpb_file; // Tectonic plate boundary file + std::string tpp_file; // Tectonic plate pole file UINT16 plate_model_option; // Informs reftran which plate model option to use - string command_line_arguments; + std::string command_line_arguments; }; // geoid settings @@ -362,12 +360,12 @@ struct geoid_settings : private boost::equality_comparable { UINT16 coordinate_format; // ddeg or dms (default) UINT16 convert_heights; // convert ortho binary station heights to ellipsoidal UINT16 export_dna_geo_file; // Export geoid information in DNA geoid file - string rdat_geoid_file; // raw dat geoid file - string ntv2_geoid_file; // ntv2 geoid file - string input_file; // input file - string bst_file; // bst file - string geo_file; // dna geo file - string command_line_arguments; + std::string rdat_geoid_file; // raw dat geoid file + std::string ntv2_geoid_file; // ntv2 geoid file + std::string input_file; // input file + std::string bst_file; // bst file + std::string geo_file; // dna geo file + std::string command_line_arguments; }; // network segmentation settings @@ -404,16 +402,16 @@ struct segment_settings : private boost::equality_comparable { UINT16 show_segment_summary; // show segmentation summary dialog UINT16 print_segment_debug; // print segmentation debug information UINT16 force_contiguous_blocks; // force contiguous blocks - string map_file; // Station map file - string asl_file; // Associated stations file - string aml_file; // Associated measurements file - string bst_file; // Binary station file - string bms_file; // Binary measurement file - string seg_file; // Segmentation output file - string sap_file; // Station appearance list file - string net_file; // Starting stations output file - string seg_starting_stns; // Stations to be incorporated within the first block. - string command_line_arguments; + std::string map_file; // Station map file + std::string asl_file; // Associated stations file + std::string aml_file; // Associated measurements file + std::string bst_file; // Binary station file + std::string bms_file; // Binary measurement file + std::string seg_file; // Segmentation output file + std::string sap_file; // Station appearance list file + std::string net_file; // Starting stations output file + std::string seg_starting_stns; // Stations to be incorporated within the first block. + std::string command_line_arguments; }; // network segmentation settings @@ -446,7 +444,7 @@ struct adjust_settings : private boost::equality_comparable { //} public: - inline void setFilenames(const string& name) { + inline void setFilenames(const std::string& name) { map_file = name + ".map"; bst_file = name + ".bst"; bms_file = name + ".bms"; @@ -471,15 +469,15 @@ struct adjust_settings : private boost::equality_comparable { float iteration_threshold; // Convergence limit double free_std_dev; // SD for free stations double fixed_std_dev; // SD for fixed stations - string station_constraints; // Station constraints. Comma delimited string. - string map_file; // Station map file - string bst_file; // Binary station file - string bms_file; // Binary measurement file - string seg_file; // Segmentation file - string comments; // General comments about the adjustment, printed to the adj file. - string command_line_arguments; - string type_b_global; // Comma delimited string containing Type b uncertainties to be applied to all uncertainties computed from an adjustment - string type_b_file; // File path to Type b uncertainties to be applied to specific site uncertainties computed from an adjustment + std::string station_constraints; // Station constraints. Comma delimited string. + std::string map_file; // Station map file + std::string bst_file; // Binary station file + std::string bms_file; // Binary measurement file + std::string seg_file; // Segmentation file + std::string comments; // General comments about the adjustment, printed to the adj file. + std::string command_line_arguments; + std::string type_b_global; // Comma delimited string containing Type b uncertainties to be applied to all uncertainties computed from an adjustment + std::string type_b_file; // File path to Type b uncertainties to be applied to specific site uncertainties computed from an adjustment }; // datum and geoid settings @@ -537,13 +535,13 @@ struct output_settings : private boost::equality_comparable { //} public: - string _m2s_file; // Measurement to stations file - string _adj_file; // Adjustment output - string _xyz_file; // Adjusted coordinate output - string _snx_file; // Adjusted coordinate output in SINEX format - string _xml_file; // Estimated station coordinates and full variance matrix in DynaML (DynAdjust XML) format. Uses Y cluster. - string _cor_file; // Corrections to intial stations output - string _apu_file; // Adjusted positional uncertainty output + std::string _m2s_file; // Measurement to stations file + std::string _adj_file; // Adjustment output + std::string _xyz_file; // Adjusted coordinate output + std::string _snx_file; // Adjusted coordinate output in SINEX format + std::string _xml_file; // Estimated station coordinates and full variance matrix in DynaML (DynAdjust XML) format. Uses Y cluster. + std::string _cor_file; // Corrections to intial stations output + std::string _apu_file; // Adjusted positional uncertainty output UINT16 _adj_stn_iteration; // Outputs adjusted stations for each block within each iteration UINT16 _adj_msr_iteration; // Outputs adjusted measurements for each block within each iteration UINT16 _cmp_msr_iteration; // Outputs computed measurements for each block within each iteration @@ -571,7 +569,7 @@ struct output_settings : private boost::equality_comparable { UINT16 _export_snx_file; // Create a sinex file from the adjustment double _hz_corr_threshold; // Minimum horizontal threshold for station corrections double _vt_corr_threshold; // Minimum vertical threshold for station corrections - string _stn_coord_types; // String defining the cooridnate types to be printed for each station + std::string _stn_coord_types; // String defining the cooridnate types to be printed for each station UINT16 _angular_type_stn; // Type of angular station coordinates (dms or ddeg) UINT16 _precision_seconds_stn; // Precision of angular station values given in seconds UINT16 _precision_metres_stn; // Precision of linear station values given in seconds @@ -638,10 +636,10 @@ struct plot_settings : private boost::equality_comparable { // 4 Transverse Mercator // 5 Albers conic equal-area // 6 Lambert conformal - string _gmt_cmd_file; // GMT command file to create the eps - string _gnuplot_cmd_file; // Gnuplot command file to create the eps - string _eps_file_name; // The eps file generated either by gmt or gnuplot - string _pdf_file_name; // The PDF file generated either by gmt or gnuplot + std::string _gmt_cmd_file; // GMT command file to create the eps + std::string _gnuplot_cmd_file; // Gnuplot command file to create the eps + std::string _eps_file_name; // The eps file generated either by gmt or gnuplot + std::string _pdf_file_name; // The PDF file generated either by gmt or gnuplot bool _plot_phased_blocks; // Plot the blocks of a segmented network. Requires a corresponding segmentation file. bool _plot_station_labels; // Plots the station labels bool _plot_ignored_msrs; // Plot ignored measurements @@ -663,8 +661,8 @@ struct plot_settings : private boost::equality_comparable { double _msr_line_width; // Measurement line width double _correction_scale; // The amount by which to scale the size of correction arrows double _pu_ellipse_scale; // The amount by which to scale the size of error ellipses and positional uncertainty cirlces - string _plot_station_centre; // Centre the map according to this station - string _bounding_box; // user defined bounding box for plot + std::string _plot_station_centre; // Centre the map according to this station + std::string _bounding_box; // user defined bounding box for plot double _plot_area_radius; // Set the limits of the plot according to a radius double _plot_centre_latitude; // Centre the map according to this latitude double _plot_centre_longitude; // Centre the map according to this longitude @@ -673,10 +671,10 @@ struct plot_settings : private boost::equality_comparable { double _ground_width; // ground width in metres UINT32 _plot_block_number; // Plots this block only UINT16 _coasline_resolution; // ncdf resolution - string _title; // Title of the plot - string _title_block_name; // Name of the unit to display in the title block - string _title_block_subname; // Name of the cub-unit to display in the title block - string command_line_arguments; + std::string _title; // Title of the plot + std::string _title_block_name; // Name of the unit to display in the title block + std::string _title_block_subname; // Name of the cub-unit to display in the title block + std::string command_line_arguments; v_string_string_pair _gmt_params; // GMT parameters vchar _separate_msrs; // A char vector of measurement types to be created individually v_string_string_pair _msr_colours; // A vector of measurement types and corresponding colours diff --git a/dynadjust/include/config/dnaprojectfile.cpp b/dynadjust/include/config/dnaprojectfile.cpp index 26fb176d..dcf20433 100644 --- a/dynadjust/include/config/dnaprojectfile.cpp +++ b/dynadjust/include/config/dnaprojectfile.cpp @@ -36,7 +36,7 @@ CDnaProjectFile::CDnaProjectFile(void) } // Create instance and initialise settings based on context -CDnaProjectFile::CDnaProjectFile(const string& projectFile, const UINT16& verifyContext) +CDnaProjectFile::CDnaProjectFile(const std::string& projectFile, const UINT16& verifyContext) { LoadProjectFile(projectFile); @@ -89,20 +89,20 @@ CDnaProjectFile::CDnaProjectFile(const string& projectFile, const UINT16& verify //} -void CDnaProjectFile::LoadProjectFile(const string& projectFile) +void CDnaProjectFile::LoadProjectFile(const std::string& projectFile) { // load project file - if (exists(projectFile)) + if (boost::filesystem::exists(projectFile)) { settings_.g.project_file = projectFile; LoadProjectFile(); } else { - stringstream err_msg; + std::stringstream err_msg; err_msg << "LoadProjectFile(): Project file " << - projectFile << " does not exist." << endl; - throw boost::enable_current_exception(runtime_error(err_msg.str())); + projectFile << " does not exist." << std::endl; + throw boost::enable_current_exception(std::runtime_error(err_msg.str())); } } @@ -112,29 +112,29 @@ void CDnaProjectFile::LoadProjectFile() // load project file using p.g.project_file std::ifstream dnaproj_file; - stringstream err_msg; + std::stringstream err_msg; err_msg << "LoadProjectFile(): An error was encountered when opening " << - settings_.g.project_file << "." << endl; + settings_.g.project_file << "." << std::endl; try { // create binary aml file. Throws runtime_error on failure. file_opener(dnaproj_file, settings_.g.project_file, - ios::in, ascii, true); + std::ios::in, ascii, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { err_msg << e.what(); - throw boost::enable_current_exception(runtime_error(err_msg.str())); + throw boost::enable_current_exception(std::runtime_error(err_msg.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(err_msg.str())); + throw boost::enable_current_exception(std::runtime_error(err_msg.str())); } err_msg.str(""); err_msg << "LoadProjectFile(): An error was encountered when loading from " << - settings_.g.project_file << "." << endl; + settings_.g.project_file << "." << std::endl; - string str, line, var, val; - stringstream ss; + std::string str, line, var, val; + std::stringstream ss; settingMode mSetting(unknownSetting); @@ -148,16 +148,16 @@ void CDnaProjectFile::LoadProjectFile() if (dnaproj_file.eof()) break; - err_msg << f.what() << endl; - throw boost::enable_current_exception(runtime_error(err_msg.str())); + err_msg << f.what() << std::endl; + throw boost::enable_current_exception(std::runtime_error(err_msg.str())); } catch (...) { if (dnaproj_file.eof()) break; - err_msg << "Could not read file." << endl; - throw boost::enable_current_exception(runtime_error(err_msg.str())); + err_msg << "Could not read file." << std::endl; + throw boost::enable_current_exception(std::runtime_error(err_msg.str())); } @@ -170,77 +170,77 @@ void CDnaProjectFile::LoadProjectFile() continue; // #variables - if (line.find(section_variables) != string::npos) + if (line.find(section_variables) != std::string::npos) { mSetting = switchSetting; continue; } // #general - if (line.find(section_general) != string::npos) + if (line.find(section_general) != std::string::npos) { mSetting = generalSetting; continue; } // #import - if (line.find(section_import) != string::npos) + if (line.find(section_import) != std::string::npos) { mSetting = importSetting; continue; } // #reftran - if (line.find(section_reftran) != string::npos) + if (line.find(section_reftran) != std::string::npos) { mSetting = reftranSetting; continue; } // #general - if (line.find(section_geoid) != string::npos) + if (line.find(section_geoid) != std::string::npos) { mSetting = geoidSetting; continue; } // #segment - if (line.find(section_segment) != string::npos) + if (line.find(section_segment) != std::string::npos) { mSetting = segmentSetting; continue; } // #adjust - if (line.find(section_adjust) != string::npos) + if (line.find(section_adjust) != std::string::npos) { mSetting = adjustSetting; continue; } // #output - if (line.find(section_output) != string::npos) + if (line.find(section_output) != std::string::npos) { mSetting = outputSetting; continue; } // #plot - if (line.find(section_plot) != string::npos) + if (line.find(section_plot) != std::string::npos) { mSetting = plotSetting; continue; } // #display - if (line.find(section_display) != string::npos) + if (line.find(section_display) != std::string::npos) { mSetting = displaySetting; continue; } // Line? - if (line.find("----------") != string::npos) + if (line.find("----------") != std::string::npos) continue; // Now get the variables and their value relating to the setting @@ -284,12 +284,12 @@ void CDnaProjectFile::LoadProjectFile() break; } } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { err_msg << e.what(); - throw boost::enable_current_exception(runtime_error(err_msg.str())); + throw boost::enable_current_exception(std::runtime_error(err_msg.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(err_msg.str())); + throw boost::enable_current_exception(std::runtime_error(err_msg.str())); } } @@ -301,9 +301,9 @@ void CDnaProjectFile::InitialiseGeneralSettings() { if (settings_.g.network_name.empty()) { - stringstream ss; - ss << "The project file does not provide the network name. " << endl << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "The project file does not provide the network name. " << std::endl << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } @@ -314,33 +314,33 @@ void CDnaProjectFile::InitialiseImportSettings() if (settings_.i.input_files.empty() && settings_.i.seg_file.empty()) { - stringstream ss; - ss << "Nothing to do - the project file does not list any files to import. " << endl << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "Nothing to do - the project file does not list any files to import. " << std::endl << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - string firstPart(settings_.g.output_folder + FOLDER_SLASH + settings_.g.network_name + "."); + std::string firstPart(settings_.g.output_folder + FOLDER_SLASH + settings_.g.network_name + "."); if (!settings_.i.bst_file.empty()) { - if (!exists(settings_.i.bst_file)) + if (!boost::filesystem::exists(settings_.i.bst_file)) // Does the file exist? No. // Assume it is a filename contained in the input folder. // import will throw an exception if it cannot be found. - settings_.i.bst_file = formPath(settings_.g.input_folder, - leafStr(settings_.i.bst_file)); + settings_.i.bst_file = formPath(settings_.g.input_folder, + leafStr(settings_.i.bst_file)); } else settings_.i.bst_file = firstPart + "bst"; // binary stations file if (!settings_.i.bms_file.empty()) { - if (!exists(settings_.i.bms_file)) + if (!boost::filesystem::exists(settings_.i.bms_file)) // Does the file exist? No. // Assume it is a filename contained in the input folder. // import will throw an exception if it cannot be found. - settings_.i.bms_file = formPath(settings_.g.input_folder, - leafStr(settings_.i.bms_file)); + settings_.i.bms_file = formPath(settings_.g.input_folder, + leafStr(settings_.i.bms_file)); } else settings_.i.bms_file = firstPart + "bms"; // binary measurements file @@ -357,12 +357,12 @@ void CDnaProjectFile::InitialiseImportSettings() if (!settings_.i.seg_file.empty()) { - if (!exists(settings_.i.seg_file)) + if (!boost::filesystem::exists(settings_.i.seg_file)) // Does the file exist? No. // Assume it is a filename contained in the input folder. // import will throw an exception if it cannot be found. - settings_.i.seg_file = formPath(settings_.g.input_folder, - leafStr(settings_.i.seg_file)); + settings_.i.seg_file = formPath(settings_.g.input_folder, + leafStr(settings_.i.seg_file)); } ////////////////////////////////////////////////////////////////////////////// @@ -376,19 +376,19 @@ void CDnaProjectFile::InitialiseImportSettings() if (!settings_.i.scalar_file.empty()) { - if (!exists(settings_.i.scalar_file)) + if (!boost::filesystem::exists(settings_.i.scalar_file)) // Does the file exist? No. // Assume it is a filename contained in the input folder. // import will throw an exception if it cannot be found. - settings_.i.scalar_file = formPath(settings_.g.input_folder, - leafStr(settings_.i.scalar_file)); + settings_.i.scalar_file = formPath(settings_.g.input_folder, + leafStr(settings_.i.scalar_file)); } // Create file name based on the provided block - string fileName(settings_.g.network_name); + std::string fileName(settings_.g.network_name); if (settings_.i.import_block) { - stringstream blk(""); + std::stringstream blk(""); blk << ".block-" << settings_.i.import_block_number; fileName += blk.str(); } @@ -396,27 +396,27 @@ void CDnaProjectFile::InitialiseImportSettings() if (settings_.i.export_dynaml) { if (settings_.i.export_single_xml_file) - settings_.i.xml_outfile = formPath(settings_.g.output_folder, + settings_.i.xml_outfile = formPath(settings_.g.output_folder, fileName, "xml"); else { - settings_.i.xml_stnfile = formPath(settings_.g.output_folder, + settings_.i.xml_stnfile = formPath(settings_.g.output_folder, fileName + "stn", "xml"); - settings_.i.xml_msrfile = formPath(settings_.g.output_folder, + settings_.i.xml_msrfile = formPath(settings_.g.output_folder, fileName + "msr", "xml"); } } if (settings_.i.export_dna_files) { - settings_.i.dna_stnfile = formPath(settings_.g.output_folder, + settings_.i.dna_stnfile = formPath(settings_.g.output_folder, fileName, "stn"); - settings_.i.dna_msrfile = formPath(settings_.g.output_folder, + settings_.i.dna_msrfile = formPath(settings_.g.output_folder, fileName, "msr"); } if (settings_.i.simulate_measurements) - settings_.i.simulate_msrfile = formPath(settings_.g.output_folder, + settings_.i.simulate_msrfile = formPath(settings_.g.output_folder, settings_.g.network_name, "simulated.msr"); } @@ -427,12 +427,12 @@ void CDnaProjectFile::InitialiseReftranSettings() if (settings_.r.reference_frame.empty()) { - stringstream ss; - ss << "Nothing to do - the project file does not specify a reference frame." << endl << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "Nothing to do - the project file does not specify a reference frame." << std::endl << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - string firstPart(settings_.g.output_folder + FOLDER_SLASH + settings_.g.network_name + "."); + std::string firstPart(settings_.g.output_folder + FOLDER_SLASH + settings_.g.network_name + "."); settings_.r.bst_file = firstPart + "bst"; // binary stations file settings_.r.bms_file = firstPart + "bms"; // binary measurements file settings_.r.rft_file = firstPart + "rft"; // log @@ -443,9 +443,9 @@ void CDnaProjectFile::InitialiseReftranSettings() settings_.i.xml_outfile = firstPart + "xml"; // single XML file else { - settings_.i.xml_stnfile = formPath(settings_.g.output_folder, + settings_.i.xml_stnfile = formPath(settings_.g.output_folder, settings_.g.network_name + "stn", "xml"); - settings_.i.xml_msrfile = formPath(settings_.g.output_folder, + settings_.i.xml_msrfile = formPath(settings_.g.output_folder, settings_.g.network_name + "msr", "xml");; } } @@ -468,20 +468,20 @@ void CDnaProjectFile::InitialiseGeoidSettings() // Expected behaviour: when running geoid using a project file, network name must exist if (settings_.g.network_name.empty()) { - stringstream ss; - ss << "Nothing to do - the project file does not provide a network name. " << endl << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "Nothing to do - the project file does not provide a network name. " << std::endl << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - settings_.n.bst_file = formPath(settings_.g.input_folder, settings_.g.network_name, "bst"); // binary stations file - settings_.n.geo_file = formPath(settings_.g.output_folder, settings_.g.network_name, "geo"); // dna geo file + settings_.n.bst_file = formPath(settings_.g.input_folder, settings_.g.network_name, "bst"); // binary stations file + settings_.n.geo_file = formPath(settings_.g.output_folder, settings_.g.network_name, "geo"); // dna geo file settings_.n.file_mode = 1; if (settings_.n.ntv2_geoid_file.empty()) { - stringstream ss; - ss << "Nothing to do - the project file does not provide an NTv2 grid file path. " << endl << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "Nothing to do - the project file does not provide an NTv2 grid file path. " << std::endl << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } @@ -489,7 +489,7 @@ void CDnaProjectFile::InitialiseSegmentSettings() { InitialiseGeneralSettings(); - string firstPart(settings_.g.output_folder + FOLDER_SLASH + settings_.g.network_name + "."); + std::string firstPart(settings_.g.output_folder + FOLDER_SLASH + settings_.g.network_name + "."); settings_.s.bst_file = firstPart + "bst"; // binary stations file settings_.s.bms_file = firstPart + "bms"; // binary measurements file settings_.s.asl_file = firstPart + "asl"; // associated stations list @@ -503,19 +503,19 @@ void CDnaProjectFile::InitialiseAdjustSettings() { InitialiseGeneralSettings(); - string firstPart(settings_.g.output_folder + FOLDER_SLASH + settings_.g.network_name + "."); + std::string firstPart(settings_.g.output_folder + FOLDER_SLASH + settings_.g.network_name + "."); settings_.a.bst_file = firstPart + "bst"; // binary stations file settings_.a.bms_file = firstPart + "bms"; // binary measurements file - if (!exists(settings_.a.bst_file) || !exists(settings_.a.bms_file)) + if (!boost::filesystem::exists(settings_.a.bst_file) || !boost::filesystem::exists(settings_.a.bms_file)) { - stringstream ss; + std::stringstream ss; ss << "- Nothing to do: "; if (settings_.g.network_name.empty()) - ss << endl << "network name has not been specified specified, and " << endl << " "; - ss << settings_.a.bst_file << " and " << settings_.a.bms_file << " do not exist." << endl << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << std::endl << "network name has not been specified specified, and " << std::endl << " "; + ss << settings_.a.bst_file << " and " << settings_.a.bms_file << " do not exist." << std::endl << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } // Station appearance file @@ -527,7 +527,7 @@ void CDnaProjectFile::InitialiseAdjustSettings() // Set up file names dependent on adjustment mode settings_.o._xyz_file = settings_.o._adj_file = - formPath(settings_.g.output_folder, settings_.g.network_name); + formPath(settings_.g.output_folder, settings_.g.network_name); if (settings_.o._positional_uncertainty) settings_.o._apu_file = settings_.o._adj_file; @@ -619,34 +619,34 @@ void CDnaProjectFile::InitialiseAdjustSettings() } -void CDnaProjectFile::LoadSettingGeneral(const settingMode mSetting, const string& var, string& val) +void CDnaProjectFile::LoadSettingGeneral(const settingMode mSetting, const std::string& var, std::string& val) { // general settings - if (iequals(var, QUIET)) + if (boost::iequals(var, QUIET)) { if (val.empty()) return; - settings_.g.quiet = yesno_uint(val); + settings_.g.quiet = yesno_uint(val); } - else if (iequals(var, VERBOSE)) + else if (boost::iequals(var, VERBOSE)) { if (val.empty()) return; - settings_.g.verbose = lexical_cast(val); + settings_.g.verbose = boost::lexical_cast(val); } - else if (iequals(var, PROJECT_FILE)) + else if (boost::iequals(var, PROJECT_FILE)) { if (val.empty()) return; settings_.g.project_file = val; } - else if (iequals(var, DYNADJUST_LOG_FILE)) + else if (boost::iequals(var, DYNADJUST_LOG_FILE)) { if (val.empty()) return; settings_.g.log_file = val; } - else if (iequals(var, NETWORK_NAME)) + else if (boost::iequals(var, NETWORK_NAME)) { if (val.empty()) return; @@ -660,7 +660,7 @@ void CDnaProjectFile::LoadSettingGeneral(const settingMode mSetting, const strin if (t.second.substr(0,2) == "${" && t.second.at(3) == '}') { settings_.g.variables.push_back(t); - sort(settings_.g.variables.begin(), settings_.g.variables.end(), PairCompareFirst()); + std::sort(settings_.g.variables.begin(), settings_.g.variables.end(), PairCompareFirst()); } break; case generalSetting: @@ -670,13 +670,13 @@ void CDnaProjectFile::LoadSettingGeneral(const settingMode mSetting, const strin break; } } - else if (iequals(var, INPUT_FOLDER)) + else if (boost::iequals(var, INPUT_FOLDER)) { if (val.empty()) return; settings_.g.input_folder = val; } - else if (iequals(var, OUTPUT_FOLDER)) + else if (boost::iequals(var, OUTPUT_FOLDER)) { if (val.empty()) return; @@ -685,41 +685,41 @@ void CDnaProjectFile::LoadSettingGeneral(const settingMode mSetting, const strin } -void CDnaProjectFile::LoadSettingImport(const settingMode mSetting, const string& var, string& val) +void CDnaProjectFile::LoadSettingImport(const settingMode mSetting, const std::string& var, std::string& val) { // Import settings - if (iequals(var, IMPORT_FILE)) + if (boost::iequals(var, IMPORT_FILE)) { if (val.empty()) return; - settings_.i.input_files.push_back(formPath(settings_.g.input_folder, val)); + settings_.i.input_files.push_back(formPath(settings_.g.input_folder, val)); } - else if (iequals(var, REFERENCE_FRAME)) + else if (boost::iequals(var, REFERENCE_FRAME)) { if (val.empty()) return; settings_.i.reference_frame = val; } - else if (iequals(var, EPOCH)) + else if (boost::iequals(var, EPOCH)) { if (val.empty()) return; settings_.i.epoch = val; } - else if (iequals(var, OVERRIDE_INPUT_FRAME)) + else if (boost::iequals(var, OVERRIDE_INPUT_FRAME)) { if (val.empty()) return; - settings_.i.override_input_rfame = yesno_uint(val);; + settings_.i.override_input_rfame = yesno_uint(val);; } - else if (iequals(var, IMPORT_GEO_FILE)) + else if (boost::iequals(var, IMPORT_GEO_FILE)) { if (val.empty()) return; - settings_.i.geo_file = formPath(settings_.g.input_folder, val); + settings_.i.geo_file = formPath(settings_.g.input_folder, val); settings_.i.import_geo_file = 1; } - else if (iequals(var, BIN_STN_FILE)) + else if (boost::iequals(var, BIN_STN_FILE)) { string_string_pair t; switch (mSetting) @@ -733,22 +733,22 @@ void CDnaProjectFile::LoadSettingImport(const settingMode mSetting, const string if (t.second.substr(0,2) == "${" && t.second.at(3) == '}') { settings_.g.variables.push_back(t); - sort(settings_.g.variables.begin(), settings_.g.variables.end(), PairCompareFirst()); + std::sort(settings_.g.variables.begin(), settings_.g.variables.end(), PairCompareFirst()); } break; case importSetting: if (val.empty()) // default export bst file - create in output folder - settings_.i.bst_file = formPath(settings_.g.output_folder, settings_.g.network_name, "bst"); // binary stations file + settings_.i.bst_file = formPath(settings_.g.output_folder, settings_.g.network_name, "bst"); // binary stations file else // user specified bst file - look in input folder - settings_.i.bst_file = formPath(settings_.g.input_folder, val); + settings_.i.bst_file = formPath(settings_.g.input_folder, val); break; default: break; } } - else if (iequals(var, BIN_MSR_FILE)) + else if (boost::iequals(var, BIN_MSR_FILE)) { string_string_pair t; switch (mSetting) @@ -762,20 +762,20 @@ void CDnaProjectFile::LoadSettingImport(const settingMode mSetting, const string if (t.second.substr(0,2) == "${" && t.second.at(3) == '}') { settings_.g.variables.push_back(t); - sort(settings_.g.variables.begin(), settings_.g.variables.end(), PairCompareFirst()); + std::sort(settings_.g.variables.begin(), settings_.g.variables.end(), PairCompareFirst()); } break; case importSetting: if (val.empty()) - settings_.i.bms_file = formPath(settings_.g.output_folder, settings_.g.network_name, "bms"); // binary stations file + settings_.i.bms_file = formPath(settings_.g.output_folder, settings_.g.network_name, "bms"); // binary stations file else - settings_.i.bms_file = formPath(settings_.g.input_folder, val); + settings_.i.bms_file = formPath(settings_.g.input_folder, val); break; default: break; } } - else if (iequals(var, MAP_FILE)) + else if (boost::iequals(var, MAP_FILE)) { if (val.empty()) return; @@ -789,17 +789,17 @@ void CDnaProjectFile::LoadSettingImport(const settingMode mSetting, const string if (t.second.substr(0,2) == "${" && t.second.at(3) == '}') { settings_.g.variables.push_back(t); - sort(settings_.g.variables.begin(), settings_.g.variables.end(), PairCompareFirst()); + std::sort(settings_.g.variables.begin(), settings_.g.variables.end(), PairCompareFirst()); } break; case importSetting: - settings_.i.map_file = formPath(settings_.g.output_folder, val); + settings_.i.map_file = formPath(settings_.g.output_folder, val); break; default: break; } } - else if (iequals(var, ASL_FILE)) + else if (boost::iequals(var, ASL_FILE)) { if (val.empty()) return; @@ -813,17 +813,17 @@ void CDnaProjectFile::LoadSettingImport(const settingMode mSetting, const string if (t.second.substr(0,2) == "${" && t.second.at(3) == '}') { settings_.g.variables.push_back(t); - sort(settings_.g.variables.begin(), settings_.g.variables.end(), PairCompareFirst()); + std::sort(settings_.g.variables.begin(), settings_.g.variables.end(), PairCompareFirst()); } break; case importSetting: - settings_.i.asl_file = formPath(settings_.g.output_folder, val); + settings_.i.asl_file = formPath(settings_.g.output_folder, val); break; default: break; } } - else if (iequals(var, AML_FILE)) + else if (boost::iequals(var, AML_FILE)) { if (val.empty()) return; @@ -837,474 +837,474 @@ void CDnaProjectFile::LoadSettingImport(const settingMode mSetting, const string if (t.second.substr(0,2) == "${" && t.second.at(3) == '}') { settings_.g.variables.push_back(t); - sort(settings_.g.variables.begin(), settings_.g.variables.end(), PairCompareFirst()); + std::sort(settings_.g.variables.begin(), settings_.g.variables.end(), PairCompareFirst()); } break; case importSetting: - settings_.i.aml_file = formPath(settings_.g.output_folder, val); + settings_.i.aml_file = formPath(settings_.g.output_folder, val); break; default: break; } } - else if (iequals(var, DST_FILE)) + else if (boost::iequals(var, DST_FILE)) { if (val.empty()) return; - settings_.i.dst_file = formPath(settings_.g.output_folder, val); + settings_.i.dst_file = formPath(settings_.g.output_folder, val); } - else if (iequals(var, DMS_FILE)) + else if (boost::iequals(var, DMS_FILE)) { if (val.empty()) return; - settings_.i.dms_file = formPath(settings_.g.output_folder, val); + settings_.i.dms_file = formPath(settings_.g.output_folder, val); } - else if (iequals(var, BOUNDING_BOX)) + else if (boost::iequals(var, BOUNDING_BOX)) { if (val.empty()) return; settings_.i.bounding_box = val; } - else if (iequals(var, GET_MSRS_TRANSCENDING_BOX)) + else if (boost::iequals(var, GET_MSRS_TRANSCENDING_BOX)) { if (val.empty()) return; - settings_.i.include_transcending_msrs = yesno_uint(val); + settings_.i.include_transcending_msrs = yesno_uint(val); } - else if (iequals(var, INCLUDE_STN_ASSOC_MSRS)) + else if (boost::iequals(var, INCLUDE_STN_ASSOC_MSRS)) { if (val.empty()) return; - settings_.i.stn_associated_msr_include = valorno_string(val); + settings_.i.stn_associated_msr_include = valorno_string(val); } - else if (iequals(var, EXCLUDE_STN_ASSOC_MSRS)) + else if (boost::iequals(var, EXCLUDE_STN_ASSOC_MSRS)) { if (val.empty()) return; - settings_.i.stn_associated_msr_exclude = valorno_string(val); + settings_.i.stn_associated_msr_exclude = valorno_string(val); } - else if (iequals(var, SPLIT_CLUSTERS)) + else if (boost::iequals(var, SPLIT_CLUSTERS)) { if (val.empty()) return; - settings_.i.split_clusters = yesno_uint(val); + settings_.i.split_clusters = yesno_uint(val); } - else if (iequals(var, IMPORT_SEG_BLOCK)) + else if (boost::iequals(var, IMPORT_SEG_BLOCK)) { if (val.empty()) return; - settings_.i.import_block_number = valorno_uint(val, settings_.i.import_block); + settings_.i.import_block_number = valorno_uint(val, settings_.i.import_block); } - else if (iequals(var, SEG_FILE)) + else if (boost::iequals(var, SEG_FILE)) { if (val.empty()) return; - settings_.i.seg_file = formPath(settings_.g.input_folder, val); + settings_.i.seg_file = formPath(settings_.g.input_folder, val); } - else if (iequals(var, PREFER_X_MSR_AS_G)) + else if (boost::iequals(var, PREFER_X_MSR_AS_G)) { if (val.empty()) return; - settings_.i.prefer_single_x_as_g = yesno_uint(val); + settings_.i.prefer_single_x_as_g = yesno_uint(val); } - else if (iequals(var, INCLUDE_MSRS)) + else if (boost::iequals(var, INCLUDE_MSRS)) { if (val.empty()) return; settings_.i.include_msrs = val; } - else if (iequals(var, EXCLUDE_MSRS)) + else if (boost::iequals(var, EXCLUDE_MSRS)) { if (val.empty()) return; settings_.i.exclude_msrs = val; } - else if (iequals(var, STATION_RENAMING_FILE)) + else if (boost::iequals(var, STATION_RENAMING_FILE)) { if (val.empty()) return; - settings_.i.stn_renamingfile = formPath(settings_.g.input_folder, val); + settings_.i.stn_renamingfile = formPath(settings_.g.input_folder, val); } - else if (iequals(var, STATION_DISCONTINUITY_FILE)) + else if (boost::iequals(var, STATION_DISCONTINUITY_FILE)) { if (val.empty()) return; - settings_.i.stn_discontinuityfile = formPath(settings_.g.input_folder, val); + settings_.i.stn_discontinuityfile = formPath(settings_.g.input_folder, val); settings_.i.apply_discontinuities = true; } - else if (iequals(var, TEST_NEARBY_STNS)) + else if (boost::iequals(var, TEST_NEARBY_STNS)) { if (val.empty()) return; - settings_.i.search_nearby_stn = yesno_uint(val); + settings_.i.search_nearby_stn = yesno_uint(val); } - else if (iequals(var, TEST_NEARBY_STN_DIST)) + else if (boost::iequals(var, TEST_NEARBY_STN_DIST)) { if (val.empty()) return; settings_.i.search_stn_radius = DoubleFromString(val); } - else if (iequals(var, TEST_SIMILAR_MSRS)) + else if (boost::iequals(var, TEST_SIMILAR_MSRS)) { if (val.empty()) return; - settings_.i.search_similar_msr = yesno_uint(val); + settings_.i.search_similar_msr = yesno_uint(val); } - else if (iequals(var, TEST_SIMILAR_GNSS_MSRS)) + else if (boost::iequals(var, TEST_SIMILAR_GNSS_MSRS)) { if (val.empty()) return; - settings_.i.search_similar_msr_gx = yesno_uint(val); + settings_.i.search_similar_msr_gx = yesno_uint(val); } - else if (iequals(var, IGNORE_INSUFFICIENT_MSRS)) + else if (boost::iequals(var, IGNORE_INSUFFICIENT_MSRS)) { if (val.empty()) return; - settings_.i.ignore_insufficient_msrs = yesno_uint(val); + settings_.i.ignore_insufficient_msrs = yesno_uint(val); } - else if (iequals(var, IGNORE_SIMILAR_MSRS)) + else if (boost::iequals(var, IGNORE_SIMILAR_MSRS)) { if (val.empty()) return; - settings_.i.ignore_similar_msr = yesno_uint(val); + settings_.i.ignore_similar_msr = yesno_uint(val); } - else if (iequals(var, REMOVE_IGNORED_MSRS)) + else if (boost::iequals(var, REMOVE_IGNORED_MSRS)) { if (val.empty()) return; - settings_.i.remove_ignored_msr = yesno_uint(val); + settings_.i.remove_ignored_msr = yesno_uint(val); } - else if (iequals(var, FLAG_UNUSED_STNS)) + else if (boost::iequals(var, FLAG_UNUSED_STNS)) { if (val.empty()) return; - settings_.i.flag_unused_stn = yesno_uint(val); + settings_.i.flag_unused_stn = yesno_uint(val); } - else if (iequals(var, TEST_INTEGRITY)) + else if (boost::iequals(var, TEST_INTEGRITY)) { if (val.empty()) return; - settings_.i.test_integrity = yesno_uint(val); + settings_.i.test_integrity = yesno_uint(val); } - else if (iequals(var, VSCALE)) + else if (boost::iequals(var, VSCALE)) { if (val.empty()) return; settings_.i.vscale = DoubleFromString(val); } - else if (iequals(var, PSCALE)) + else if (boost::iequals(var, PSCALE)) { if (val.empty()) return; settings_.i.pscale = DoubleFromString(val); } - else if (iequals(var, LSCALE)) + else if (boost::iequals(var, LSCALE)) { if (val.empty()) return; settings_.i.lscale = DoubleFromString(val); } - else if (iequals(var, HSCALE)) + else if (boost::iequals(var, HSCALE)) { if (val.empty()) return; settings_.i.hscale = DoubleFromString(val); } - else if (iequals(var, SCALAR_FILE)) + else if (boost::iequals(var, SCALAR_FILE)) { if (val.empty()) return; - settings_.i.scalar_file = formPath(settings_.g.input_folder, val); + settings_.i.scalar_file = formPath(settings_.g.input_folder, val); } - else if (iequals(var, EXPORT_XML_FILES)) + else if (boost::iequals(var, EXPORT_XML_FILES)) { if (val.empty()) return; - settings_.i.export_dynaml = yesno_uint(val); + settings_.i.export_dynaml = yesno_uint(val); } - else if (iequals(var, EXPORT_SINGLE_XML_FILE)) + else if (boost::iequals(var, EXPORT_SINGLE_XML_FILE)) { if (val.empty()) return; - settings_.i.export_single_xml_file = yesno_uint(val); + settings_.i.export_single_xml_file = yesno_uint(val); } - else if (iequals(var, EXPORT_FROM_BINARY)) + else if (boost::iequals(var, EXPORT_FROM_BINARY)) { if (val.empty()) return; - settings_.i.export_from_bfiles = yesno_uint(val); + settings_.i.export_from_bfiles = yesno_uint(val); } - else if (iequals(var, EXPORT_DNA_FILES)) + else if (boost::iequals(var, EXPORT_DNA_FILES)) { if (val.empty()) return; - settings_.i.export_dna_files = yesno_uint(val); + settings_.i.export_dna_files = yesno_uint(val); } - else if (iequals(var, EXPORT_ASL_FILE)) + else if (boost::iequals(var, EXPORT_ASL_FILE)) { if (val.empty()) return; - settings_.i.export_asl_file = yesno_uint(val); + settings_.i.export_asl_file = yesno_uint(val); } - else if (iequals(var, EXPORT_AML_FILE)) + else if (boost::iequals(var, EXPORT_AML_FILE)) { if (val.empty()) return; - settings_.i.export_aml_file = yesno_uint(val); + settings_.i.export_aml_file = yesno_uint(val); } - else if (iequals(var, EXPORT_MAP_FILE)) + else if (boost::iequals(var, EXPORT_MAP_FILE)) { if (val.empty()) return; - settings_.i.export_map_file = yesno_uint(val); + settings_.i.export_map_file = yesno_uint(val); } - else if (iequals(var, SIMULATE_MSR_FILE)) + else if (boost::iequals(var, SIMULATE_MSR_FILE)) { if (val.empty()) return; - settings_.i.simulate_measurements = yesno_uint(val); + settings_.i.simulate_measurements = yesno_uint(val); } - //else if (iequals(var, VERIFY_COORDS)) + //else if (boost::iequals(var, VERIFY_COORDS)) //{ // if (val.empty()) // return; - // settings_.i.verify_coordinates = lexical_cast(val); + // settings_.i.verify_coordinates = boost::lexical_cast(val); //} } -void CDnaProjectFile::LoadSettingReftran(const string& var, string& val) +void CDnaProjectFile::LoadSettingReftran(const std::string& var, std::string& val) { - if (iequals(var, REFERENCE_FRAME)) + if (boost::iequals(var, REFERENCE_FRAME)) { if (val.empty()) return; settings_.r.reference_frame = val; } - else if (iequals(var, EPOCH)) + else if (boost::iequals(var, EPOCH)) { if (val.empty()) return; settings_.r.epoch = val; } - else if (iequals(var, TECTONIC_PLATE_MODEL_OPTION)) + else if (boost::iequals(var, TECTONIC_PLATE_MODEL_OPTION)) { if (val.empty()) return; - settings_.r.plate_model_option = lexical_cast(val); + settings_.r.plate_model_option = boost::lexical_cast(val); } - else if (iequals(var, TECTONIC_PLATE_BDY_FILE)) + else if (boost::iequals(var, TECTONIC_PLATE_BDY_FILE)) { if (val.empty()) return; settings_.r.tpb_file = val; - if (!exists(val)) - if (exists(formPath(settings_.g.input_folder, val))) - settings_.r.tpb_file = formPath(settings_.g.input_folder, val); + if (!boost::filesystem::exists(val)) + if (boost::filesystem::exists(formPath(settings_.g.input_folder, val))) + settings_.r.tpb_file = formPath(settings_.g.input_folder, val); } - else if (iequals(var, TECTONIC_PLATE_POLE_FILE)) + else if (boost::iequals(var, TECTONIC_PLATE_POLE_FILE)) { if (val.empty()) return; settings_.r.tpp_file = val; - if (!exists(val)) - if (exists(formPath(settings_.g.input_folder, val))) - settings_.r.tpp_file = formPath(settings_.g.input_folder, val); + if (!boost::filesystem::exists(val)) + if (boost::filesystem::exists(formPath(settings_.g.input_folder, val))) + settings_.r.tpp_file = formPath(settings_.g.input_folder, val); } } -void CDnaProjectFile::LoadSettingGeoid(const string& var, string& val) +void CDnaProjectFile::LoadSettingGeoid(const std::string& var, std::string& val) { - if (iequals(var, DAT_FILEPATH)) + if (boost::iequals(var, DAT_FILEPATH)) { if (val.empty()) return; - settings_.n.rdat_geoid_file = formPath(settings_.g.input_folder, val); + settings_.n.rdat_geoid_file = formPath(settings_.g.input_folder, val); } - else if (iequals(var, NTV2_FILEPATH)) + else if (boost::iequals(var, NTV2_FILEPATH)) { if (val.empty()) return; settings_.n.ntv2_geoid_file = val; - if (!exists(val)) - if (exists(formPath(settings_.g.input_folder, val))) - settings_.n.ntv2_geoid_file = formPath(settings_.g.input_folder, val); + if (!boost::filesystem::exists(val)) + if (boost::filesystem::exists(formPath(settings_.g.input_folder, val))) + settings_.n.ntv2_geoid_file = formPath(settings_.g.input_folder, val); } - else if (iequals(var, INPUT_FILE)) + else if (boost::iequals(var, INPUT_FILE)) { if (val.empty()) return; - settings_.n.input_file = formPath(settings_.g.input_folder, val); + settings_.n.input_file = formPath(settings_.g.input_folder, val); } - //else if (iequals(var, BIN_STN_FILE)) + //else if (boost::iequals(var, BIN_STN_FILE)) //{ // if (val.empty()) // return; - // settings_.n.bst_file = formPath(settings_.g.input_folder, val); + // settings_.n.bst_file = formPath(settings_.g.input_folder, val); //} - else if (iequals(var, METHOD)) + else if (boost::iequals(var, METHOD)) { if (val.empty()) return; - settings_.n.interpolation_method = lexical_cast(val); + settings_.n.interpolation_method = boost::lexical_cast(val); } - else if (iequals(var, DDEG_FORMAT)) + else if (boost::iequals(var, DDEG_FORMAT)) { if (val.empty()) return; - settings_.n.coordinate_format = lexical_cast(val); + settings_.n.coordinate_format = boost::lexical_cast(val); } - else if (iequals(var, DIRECTION)) + else if (boost::iequals(var, DIRECTION)) { if (val.empty()) return; - settings_.n.ellipsoid_to_ortho = lexical_cast(val); + settings_.n.ellipsoid_to_ortho = boost::lexical_cast(val); } - else if (iequals(var, CONVERT_BST_HT)) + else if (boost::iequals(var, CONVERT_BST_HT)) { if (val.empty()) return; - settings_.n.convert_heights = yesno_uint(val); + settings_.n.convert_heights = yesno_uint(val); } - else if (iequals(var, EXPORT_GEO_FILE)) + else if (boost::iequals(var, EXPORT_GEO_FILE)) { if (val.empty()) return; - settings_.n.export_dna_geo_file = yesno_uint(val); + settings_.n.export_dna_geo_file = yesno_uint(val); } } -void CDnaProjectFile::LoadSettingSegment(const string& var, string& val) +void CDnaProjectFile::LoadSettingSegment(const std::string& var, std::string& val) { - if (iequals(var, NET_FILE)) + if (boost::iequals(var, NET_FILE)) { if (val.empty()) return; - settings_.s.net_file = formPath(settings_.g.input_folder, val); + settings_.s.net_file = formPath(settings_.g.input_folder, val); } - else if (iequals(var, SEG_FILE)) + else if (boost::iequals(var, SEG_FILE)) { if (val.empty()) return; settings_.s.seg_file = val; - if (!exists(val)) - if (exists(formPath(settings_.g.input_folder, val))) - settings_.s.seg_file = formPath(settings_.g.input_folder, val); + if (!boost::filesystem::exists(val)) + if (boost::filesystem::exists(formPath(settings_.g.input_folder, val))) + settings_.s.seg_file = formPath(settings_.g.input_folder, val); } - else if (iequals(var, BIN_STN_FILE)) + else if (boost::iequals(var, BIN_STN_FILE)) { if (val.empty()) return; settings_.s.bst_file = val; - if (!exists(val)) - if (exists(formPath(settings_.g.input_folder, val))) - settings_.s.bst_file = formPath(settings_.g.input_folder, val); + if (!boost::filesystem::exists(val)) + if (boost::filesystem::exists(formPath(settings_.g.input_folder, val))) + settings_.s.bst_file = formPath(settings_.g.input_folder, val); } - else if (iequals(var, BIN_MSR_FILE)) + else if (boost::iequals(var, BIN_MSR_FILE)) { if (val.empty()) return; settings_.s.bms_file = val; - if (!exists(val)) - if (exists(formPath(settings_.g.input_folder, val))) - settings_.s.bms_file = formPath(settings_.g.input_folder, val); + if (!boost::filesystem::exists(val)) + if (boost::filesystem::exists(formPath(settings_.g.input_folder, val))) + settings_.s.bms_file = formPath(settings_.g.input_folder, val); } - else if (iequals(var, SEG_MIN_INNER_STNS)) + else if (boost::iequals(var, SEG_MIN_INNER_STNS)) { if (val.empty()) return; - settings_.s.min_inner_stations = lexical_cast(val); + settings_.s.min_inner_stations = boost::lexical_cast(val); } - else if (iequals(var, SEG_THRESHOLD_STNS)) + else if (boost::iequals(var, SEG_THRESHOLD_STNS)) { if (val.empty()) return; - settings_.s.max_total_stations = lexical_cast(val); + settings_.s.max_total_stations = boost::lexical_cast(val); } - else if (iequals(var, SEG_FORCE_CONTIGUOUS)) + else if (boost::iequals(var, SEG_FORCE_CONTIGUOUS)) { if (val.empty()) return; - settings_.s.force_contiguous_blocks = yesno_uint(val); + settings_.s.force_contiguous_blocks = yesno_uint(val); } - else if (iequals(var, SEG_STARTING_STN)) + else if (boost::iequals(var, SEG_STARTING_STN)) { if (val.empty()) return; settings_.s.seg_starting_stns = val; } - else if (iequals(var, SEG_SEARCH_LEVEL)) + else if (boost::iequals(var, SEG_SEARCH_LEVEL)) { if (val.empty()) return; - settings_.s.seg_search_level = lexical_cast(val); + settings_.s.seg_search_level = boost::lexical_cast(val); } } -void CDnaProjectFile::LoadSettingAdjust(const string& var, string& val) +void CDnaProjectFile::LoadSettingAdjust(const std::string& var, std::string& val) { - if (iequals(var, BIN_STN_FILE)) + if (boost::iequals(var, BIN_STN_FILE)) { if (val.empty()) return; settings_.a.bst_file = val; - if (!exists(val)) - if (exists(formPath(settings_.g.input_folder, val))) - settings_.a.bst_file = formPath(settings_.g.input_folder, val); + if (!boost::filesystem::exists(val)) + if (boost::filesystem::exists(formPath(settings_.g.input_folder, val))) + settings_.a.bst_file = formPath(settings_.g.input_folder, val); } - else if (iequals(var, BIN_MSR_FILE)) + else if (boost::iequals(var, BIN_MSR_FILE)) { if (val.empty()) return; settings_.a.bms_file = val; - if (!exists(val)) - if (exists(formPath(settings_.g.input_folder, val))) - settings_.a.bms_file = formPath(settings_.g.input_folder, val); + if (!boost::filesystem::exists(val)) + if (boost::filesystem::exists(formPath(settings_.g.input_folder, val))) + settings_.a.bms_file = formPath(settings_.g.input_folder, val); } - else if (iequals(var, SEG_FILE)) + else if (boost::iequals(var, SEG_FILE)) { if (val.empty()) return; settings_.a.seg_file = val; - if (!exists(val)) - if (exists(formPath(settings_.g.input_folder, val))) - settings_.a.seg_file = formPath(settings_.g.input_folder, val); + if (!boost::filesystem::exists(val)) + if (boost::filesystem::exists(formPath(settings_.g.input_folder, val))) + settings_.a.seg_file = formPath(settings_.g.input_folder, val); } - else if (iequals(var, COMMENTS)) + else if (boost::iequals(var, COMMENTS)) { if (val.empty()) return; settings_.a.comments = val; } - if (iequals(var, ADJUSTMENT_MODE)) + if (boost::iequals(var, ADJUSTMENT_MODE)) { if (val.empty()) return; - if (iequals(val, MODE_SIMULTANEOUS)) + if (boost::iequals(val, MODE_SIMULTANEOUS)) { settings_.a.adjust_mode = SimultaneousMode; settings_.a.multi_thread = false; settings_.a.stage = false; } - else if (iequals(val, MODE_PHASED)) + else if (boost::iequals(val, MODE_PHASED)) { settings_.a.adjust_mode = PhasedMode; } - else if (iequals(val, MODE_PHASED_BLOCK1)) + else if (boost::iequals(val, MODE_PHASED_BLOCK1)) { settings_.a.adjust_mode = Phased_Block_1Mode; settings_.a.multi_thread = false; } - else if (iequals(val, MODE_SIMULATION)) + else if (boost::iequals(val, MODE_SIMULATION)) { settings_.a.adjust_mode = SimulationMode; settings_.a.multi_thread = false; @@ -1312,323 +1312,323 @@ void CDnaProjectFile::LoadSettingAdjust(const string& var, string& val) } } - else if (iequals(var, MODE_PHASED_MT)) + else if (boost::iequals(var, MODE_PHASED_MT)) { if (val.empty()) return; - settings_.a.multi_thread = yesno_uint(val); + settings_.a.multi_thread = yesno_uint(val); } - else if (iequals(var, STAGED_ADJUSTMENT)) + else if (boost::iequals(var, STAGED_ADJUSTMENT)) { if (val.empty()) return; - settings_.a.stage = yesno_uint(val); + settings_.a.stage = yesno_uint(val); } - else if (iequals(var, CONF_INTERVAL)) + else if (boost::iequals(var, CONF_INTERVAL)) { if (val.empty()) return; settings_.a.confidence_interval = FloatFromString(val); } - else if (iequals(var, ITERATION_THRESHOLD)) + else if (boost::iequals(var, ITERATION_THRESHOLD)) { if (val.empty()) return; settings_.a.iteration_threshold = FloatFromString(val); } - else if (iequals(var, MAX_ITERATIONS)) + else if (boost::iequals(var, MAX_ITERATIONS)) { if (val.empty()) return; - settings_.a.max_iterations = lexical_cast(val); + settings_.a.max_iterations = boost::lexical_cast(val); } - else if (iequals(var, STN_CONSTRAINTS)) + else if (boost::iequals(var, STN_CONSTRAINTS)) { if (val.empty()) return; settings_.a.station_constraints = val; } - else if (iequals(var, FREE_STN_SD)) + else if (boost::iequals(var, FREE_STN_SD)) { if (val.empty()) return; settings_.a.free_std_dev = DoubleFromString(val); } - else if (iequals(var, FIXED_STN_SD)) + else if (boost::iequals(var, FIXED_STN_SD)) { if (val.empty()) return; settings_.a.fixed_std_dev = DoubleFromString(val); } - //else if (iequals(var, LSQ_INVERSE_METHOD)) + //else if (boost::iequals(var, LSQ_INVERSE_METHOD)) //{ // if (val.empty()) // return; - // settings_.a.inverse_method_lsq = lexical_cast(val); + // settings_.a.inverse_method_lsq = boost::lexical_cast(val); //} - else if (iequals(var, SCALE_NORMAL_UNITY)) + else if (boost::iequals(var, SCALE_NORMAL_UNITY)) { if (val.empty()) return; - settings_.a.scale_normals_to_unity = yesno_uint(val); + settings_.a.scale_normals_to_unity = yesno_uint(val); } - else if (iequals(var, RECREATE_STAGE_FILES)) + else if (boost::iequals(var, RECREATE_STAGE_FILES)) { if (val.empty()) return; - settings_.a.recreate_stage_files = yesno_uint(val); + settings_.a.recreate_stage_files = yesno_uint(val); } - else if (iequals(var, PURGE_STAGE_FILES)) + else if (boost::iequals(var, PURGE_STAGE_FILES)) { if (val.empty()) return; - settings_.a.purge_stage_files = yesno_uint(val) == 1; + settings_.a.purge_stage_files = yesno_uint(val) == 1; } - else if (iequals(var, TYPE_B_GLOBAL)) + else if (boost::iequals(var, TYPE_B_GLOBAL)) { if (val.empty()) return; settings_.a.type_b_global = val; } - else if (iequals(var, TYPE_B_FILE)) + else if (boost::iequals(var, TYPE_B_FILE)) { if (val.empty()) return; settings_.a.type_b_file = val; - if (!exists(val)) - if (exists(formPath(settings_.g.input_folder, val))) - settings_.a.type_b_file = formPath(settings_.g.input_folder, val); + if (!boost::filesystem::exists(val)) + if (boost::filesystem::exists(formPath(settings_.g.input_folder, val))) + settings_.a.type_b_file = formPath(settings_.g.input_folder, val); } } -void CDnaProjectFile::LoadSettingOutput(const string& var, string& val) +void CDnaProjectFile::LoadSettingOutput(const std::string& var, std::string& val) { - if (iequals(var, OUTPUT_MSR_TO_STN)) + if (boost::iequals(var, OUTPUT_MSR_TO_STN)) { if (val.empty()) return; - settings_.o._msr_to_stn = yesno_uint(val); + settings_.o._msr_to_stn = yesno_uint(val); } - else if (iequals(var, OUTPUT_MSR_TO_STN_SORTBY)) + else if (boost::iequals(var, OUTPUT_MSR_TO_STN_SORTBY)) { if (val.empty()) return; - settings_.o._sort_msr_to_stn = lexical_cast(val); + settings_.o._sort_msr_to_stn = boost::lexical_cast(val); } - else if (iequals(var, OUTPUT_ADJ_STN_ITER)) + else if (boost::iequals(var, OUTPUT_ADJ_STN_ITER)) { if (val.empty()) return; - settings_.o._adj_stn_iteration = yesno_uint(val); + settings_.o._adj_stn_iteration = yesno_uint(val); } - else if (iequals(var, OUTPUT_ADJ_STAT_ITER)) + else if (boost::iequals(var, OUTPUT_ADJ_STAT_ITER)) { if (val.empty()) return; - settings_.o._adj_stat_iteration = yesno_uint(val); + settings_.o._adj_stat_iteration = yesno_uint(val); } - else if (iequals(var, OUTPUT_ADJ_MSR_ITER)) + else if (boost::iequals(var, OUTPUT_ADJ_MSR_ITER)) { if (val.empty()) return; - settings_.o._adj_msr_iteration = yesno_uint(val); + settings_.o._adj_msr_iteration = yesno_uint(val); } - else if (iequals(var, OUTPUT_CMP_MSR_ITER)) + else if (boost::iequals(var, OUTPUT_CMP_MSR_ITER)) { if (val.empty()) return; - settings_.o._cmp_msr_iteration = yesno_uint(val); + settings_.o._cmp_msr_iteration = yesno_uint(val); } - else if (iequals(var, OUTPUT_ADJ_MSR)) + else if (boost::iequals(var, OUTPUT_ADJ_MSR)) { if (val.empty()) return; - settings_.o._adj_msr_final = yesno_uint(val); + settings_.o._adj_msr_final = yesno_uint(val); } - else if (iequals(var, OUTPUT_ADJ_GNSS_UNITS)) + else if (boost::iequals(var, OUTPUT_ADJ_GNSS_UNITS)) { if (val.empty()) return; - settings_.o._adj_gnss_units = lexical_cast(val); + settings_.o._adj_gnss_units = boost::lexical_cast(val); } - else if (iequals(var, OUTPUT_ADJ_MSR_TSTAT)) + else if (boost::iequals(var, OUTPUT_ADJ_MSR_TSTAT)) { if (val.empty()) return; - settings_.o._adj_msr_tstat = yesno_uint(val); + settings_.o._adj_msr_tstat = yesno_uint(val); } - else if (iequals(var, OUTPUT_ADJ_MSR_SORTBY)) + else if (boost::iequals(var, OUTPUT_ADJ_MSR_SORTBY)) { if (val.empty()) return; - settings_.o._sort_adj_msr = lexical_cast(val); + settings_.o._sort_adj_msr = boost::lexical_cast(val); } - else if (iequals(var, OUTPUT_ADJ_MSR_DBID)) + else if (boost::iequals(var, OUTPUT_ADJ_MSR_DBID)) { if (val.empty()) return; - settings_.o._database_ids = yesno_uint(val); + settings_.o._database_ids = yesno_uint(val); } - else if (iequals(var, OUTPUT_ADJ_STN_BLOCKS)) + else if (boost::iequals(var, OUTPUT_ADJ_STN_BLOCKS)) { if (val.empty()) return; - settings_.o._output_stn_blocks = yesno_uint(val); + settings_.o._output_stn_blocks = yesno_uint(val); } - else if (iequals(var, OUTPUT_ADJ_MSR_BLOCKS)) + else if (boost::iequals(var, OUTPUT_ADJ_MSR_BLOCKS)) { if (val.empty()) return; - settings_.o._output_msr_blocks = yesno_uint(val); + settings_.o._output_msr_blocks = yesno_uint(val); } - else if (iequals(var, OUTPUT_ADJ_STN_SORT_ORDER)) + else if (boost::iequals(var, OUTPUT_ADJ_STN_SORT_ORDER)) { if (val.empty()) return; - settings_.o._sort_stn_file_order = yesno_uint(val); + settings_.o._sort_stn_file_order = yesno_uint(val); } - else if (iequals(var, OUTPUT_STN_COORD_TYPES)) + else if (boost::iequals(var, OUTPUT_STN_COORD_TYPES)) { if (val.empty()) return; settings_.o._stn_coord_types = val; } - else if (iequals(var, OUTPUT_ANGULAR_TYPE_STN)) + else if (boost::iequals(var, OUTPUT_ANGULAR_TYPE_STN)) { if (val.empty()) return; - settings_.o._angular_type_stn = lexical_cast(val); + settings_.o._angular_type_stn = boost::lexical_cast(val); } - else if (iequals(var, OUTPUT_STN_CORR)) + else if (boost::iequals(var, OUTPUT_STN_CORR)) { if (val.empty()) return; - settings_.o._stn_corr = yesno_uint(val); + settings_.o._stn_corr = yesno_uint(val); } - else if (iequals(var, OUTPUT_PRECISION_METRES_STN)) + else if (boost::iequals(var, OUTPUT_PRECISION_METRES_STN)) { if (val.empty()) return; - settings_.o._precision_metres_stn = lexical_cast(val); + settings_.o._precision_metres_stn = boost::lexical_cast(val); } - else if (iequals(var, OUTPUT_PRECISION_SECONDS_STN)) + else if (boost::iequals(var, OUTPUT_PRECISION_SECONDS_STN)) { if (val.empty()) return; - settings_.o._precision_seconds_stn = lexical_cast(val); + settings_.o._precision_seconds_stn = boost::lexical_cast(val); } - else if (iequals(var, OUTPUT_PRECISION_METRES_MSR)) + else if (boost::iequals(var, OUTPUT_PRECISION_METRES_MSR)) { if (val.empty()) return; - settings_.o._precision_metres_msr = lexical_cast(val); + settings_.o._precision_metres_msr = boost::lexical_cast(val); } - else if (iequals(var, OUTPUT_PRECISION_SECONDS_MSR)) + else if (boost::iequals(var, OUTPUT_PRECISION_SECONDS_MSR)) { if (val.empty()) return; - settings_.o._precision_seconds_msr = lexical_cast(val); + settings_.o._precision_seconds_msr = boost::lexical_cast(val); } - else if (iequals(var, OUTPUT_ANGULAR_TYPE_MSR)) + else if (boost::iequals(var, OUTPUT_ANGULAR_TYPE_MSR)) { if (val.empty()) return; - settings_.o._angular_type_msr = lexical_cast(val); + settings_.o._angular_type_msr = boost::lexical_cast(val); } - else if (iequals(var, OUTPUT_DMS_FORMAT_MSR)) + else if (boost::iequals(var, OUTPUT_DMS_FORMAT_MSR)) { if (val.empty()) return; - settings_.o._dms_format_msr = lexical_cast(val); + settings_.o._dms_format_msr = boost::lexical_cast(val); } - else if (iequals(var, OUTPUT_POS_UNCERTAINTY)) + else if (boost::iequals(var, OUTPUT_POS_UNCERTAINTY)) { if (val.empty()) return; - settings_.o._positional_uncertainty = yesno_uint(val); + settings_.o._positional_uncertainty = yesno_uint(val); } - else if (iequals(var, OUTPUT_APU_CORRELATIONS)) + else if (boost::iequals(var, OUTPUT_APU_CORRELATIONS)) { if (val.empty()) return; - settings_.o._output_pu_covariances = yesno_uint(val); + settings_.o._output_pu_covariances = yesno_uint(val); } - else if (iequals(var, OUTPUT_APU_UNITS)) + else if (boost::iequals(var, OUTPUT_APU_UNITS)) { if (val.empty()) return; - settings_.o._apu_vcv_units = lexical_cast(val); + settings_.o._apu_vcv_units = boost::lexical_cast(val); } - else if (iequals(var, OUTPUT_STN_COR_FILE)) + else if (boost::iequals(var, OUTPUT_STN_COR_FILE)) { if (val.empty()) return; - settings_.o._init_stn_corrections = yesno_uint(val); + settings_.o._init_stn_corrections = yesno_uint(val); } - else if (iequals(var, HZ_CORR_THRESHOLD)) + else if (boost::iequals(var, HZ_CORR_THRESHOLD)) { if (val.empty()) return; settings_.o._hz_corr_threshold = DoubleFromString(val); } - else if (iequals(var, VT_CORR_THRESHOLD)) + else if (boost::iequals(var, VT_CORR_THRESHOLD)) { if (val.empty()) return; settings_.o._vt_corr_threshold = DoubleFromString(val); } - //else if (iequals(var, UPDATE_ORIGINAL_STN_FILE)) + //else if (boost::iequals(var, UPDATE_ORIGINAL_STN_FILE)) //{ // if (val.empty()) // return; - // settings_.o. = yesno_uint(val); + // settings_.o. = yesno_uint(val); //} - else if (iequals(var, EXPORT_XML_STN_FILE)) + else if (boost::iequals(var, EXPORT_XML_STN_FILE)) { if (val.empty()) return; - settings_.o._export_xml_stn_file= yesno_uint(val); + settings_.o._export_xml_stn_file= yesno_uint(val); } - else if (iequals(var, EXPORT_DNA_STN_FILE)) + else if (boost::iequals(var, EXPORT_DNA_STN_FILE)) { if (val.empty()) return; - settings_.o._export_dna_stn_file = yesno_uint(val); + settings_.o._export_dna_stn_file = yesno_uint(val); } - else if (iequals(var, EXPORT_SNX_FILE)) + else if (boost::iequals(var, EXPORT_SNX_FILE)) { if (val.empty()) return; - settings_.o._export_snx_file = yesno_uint(val); + settings_.o._export_snx_file = yesno_uint(val); } // ??? // EXPORT_DISCONT_FILE = "export-discont-file"; } -//void CDnaProjectFile::LoadSettingPlot(const string& var, string& val) +//void CDnaProjectFile::LoadSettingPlot(const std::string& var, std::string& val) //{ //} // -//void CDnaProjectFile::LoadSettingDisplay(const string& var, string& val) +//void CDnaProjectFile::LoadSettingDisplay(const std::string& var, std::string& val) //{ //} template -void CDnaProjectFile::AddOptionValue(ostream& os, const char* const option, const T& value) { +void CDnaProjectFile::AddOptionValue(std::ostream& os, const char* const option, const T& value) { os << " --" << option << " " << value; } template -void CDnaProjectFile::AddDefaultValue(ostream& os, const T& value) +void CDnaProjectFile::AddDefaultValue(std::ostream& os, const T& value) { os << " " << value; } template -void CDnaProjectFile::PrintRecord(ostream& os, const T& variable, const U& value) { +void CDnaProjectFile::PrintRecord(std::ostream& os, const T& variable, const U& value) { PrintVariable(os, variable); PrintValue(os, value); @@ -1636,22 +1636,22 @@ void CDnaProjectFile::PrintRecord(ostream& os, const T& variable, const U& value template -void CDnaProjectFile::PrintVariable(ostream& os, const T& variable) { +void CDnaProjectFile::PrintVariable(std::ostream& os, const T& variable) { // width of 35 - os << setw(PRINT_VAR_PAD) << left << variable; + os << std::setw(PRINT_VAR_PAD) << std::left << variable; } template -void CDnaProjectFile::PrintValue(ostream& os, const T& value) { +void CDnaProjectFile::PrintValue(std::ostream& os, const T& value) { // width of 45 - os << setw(PRINT_VAL_PAD) << left << value << endl; + os << std::setw(PRINT_VAL_PAD) << std::left << value << std::endl; } -string CDnaProjectFile::FormCommandLineOptionsStringImport() +std::string CDnaProjectFile::FormCommandLineOptionsStringImport() { - stringstream options; + std::stringstream options; ////////////////////////////////////////////////////// // General settings AddDefaultValue(options, FormCommandLineOptionsStringGeneral()); @@ -1661,22 +1661,22 @@ string CDnaProjectFile::FormCommandLineOptionsStringImport() // files for (_it_vstr_const _it_tmp(settings_.i.input_files.begin()); _it_tmp!=settings_.i.input_files.end(); ++_it_tmp) - AddDefaultValue(options, - leafStr(trimstr(_it_tmp->c_str()))); + AddDefaultValue(options, + leafStr(trimstr(_it_tmp->c_str()))); return options.str(); } -string CDnaProjectFile::FormCommandLineOptionsStringGeneral() +std::string CDnaProjectFile::FormCommandLineOptionsStringGeneral() { - stringstream options; + std::stringstream options; ////////////////////////////////////////////////////// // General settings // project file - AddOptionValue(options, PROJECT_FILE, settings_.g.project_file); + AddOptionValue(options, PROJECT_FILE, settings_.g.project_file); // network name - AddOptionValue(options, NETWORK_NAME, settings_.g.network_name); + AddOptionValue(options, NETWORK_NAME, settings_.g.network_name); // verbose AddOptionValue(options, VERBOSE, settings_.g.verbose); // verbose @@ -1689,69 +1689,69 @@ void CDnaProjectFile::PrintProjectFile() { std::ofstream dnaproj_file; - stringstream err_msg; + std::stringstream err_msg; err_msg << "PrintProjectFile(): An error was encountered when opening " << - settings_.g.project_file << "." << endl; + settings_.g.project_file << "." << std::endl; try { // create binary aml file. Throws runtime_error on failure. file_opener(dnaproj_file, settings_.g.project_file, - ios::out, ascii); + std::ios::out, ascii); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { err_msg << e.what(); - throw boost::enable_current_exception(runtime_error(err_msg.str())); + throw boost::enable_current_exception(std::runtime_error(err_msg.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(err_msg.str())); + throw boost::enable_current_exception(std::runtime_error(err_msg.str())); } err_msg.str(""); err_msg << "PrintProjectFile(): An error was encountered when writing to " << - settings_.g.project_file << "." << endl; + settings_.g.project_file << "." << std::endl; - stringstream ss; + std::stringstream ss; // Write header line dnaproj_header(dnaproj_file, settings_.g.network_name + " project file"); - dnaproj_file << endl << endl; + dnaproj_file << std::endl << std::endl; //////////////////////////////////////////////////////////////////////////////////////////////// // #general ss.str(""); ss << section_general << " (" << PRINT_VAR_PAD << ")"; PrintRecord(dnaproj_file, ss.str(), "VALUE"); - dnaproj_file << OUTPUTLINE << endl; + dnaproj_file << OUTPUTLINE << std::endl; PrintRecord(dnaproj_file, NETWORK_NAME, settings_.g.network_name); // network name - PrintRecord(dnaproj_file, INPUT_FOLDER, system_complete(settings_.g.input_folder).string()); // Path containing all input files - PrintRecord(dnaproj_file, OUTPUT_FOLDER, system_complete(settings_.g.output_folder).string()); // Path for all output files + PrintRecord(dnaproj_file, INPUT_FOLDER, boost::filesystem::system_complete(settings_.g.input_folder).string()); // Path containing all input files + PrintRecord(dnaproj_file, OUTPUT_FOLDER, boost::filesystem::system_complete(settings_.g.output_folder).string()); // Path for all output files PrintRecord(dnaproj_file, VERBOSE, settings_.g.verbose); // Give detailed information about what dnainterop is doing. // 0: No information (default) // 1: Helpful information // 2: Extended information\n3: Debug level information PrintRecord(dnaproj_file, QUIET, yesno_string(settings_.g.quiet)); // Run quietly? - PrintRecord(dnaproj_file, PROJECT_FILE, system_complete(settings_.g.project_file).string()); // project file - PrintRecord(dnaproj_file, DYNADJUST_LOG_FILE, system_complete(settings_.g.log_file).string()); // dynadjust log file + PrintRecord(dnaproj_file, PROJECT_FILE, boost::filesystem::system_complete(settings_.g.project_file).string()); // project file + PrintRecord(dnaproj_file, DYNADJUST_LOG_FILE, boost::filesystem::system_complete(settings_.g.log_file).string()); // dynadjust log file - dnaproj_file << endl; + dnaproj_file << std::endl; //////////////////////////////////////////////////////////////////////////////////////////////// // #import ss.str(""); ss << section_import << " (" << PRINT_VAR_PAD << ")"; PrintRecord(dnaproj_file, ss.str(), "VALUE"); - dnaproj_file << OUTPUTLINE << endl; + dnaproj_file << OUTPUTLINE << std::endl; // Input files for_each (settings_.i.input_files.begin(), settings_.i.input_files.end(), - [&dnaproj_file, this] (string file) { - PrintRecord(dnaproj_file, IMPORT_FILE, leafStr(file.c_str())); + [&dnaproj_file, this] (std::string file) { + PrintRecord(dnaproj_file, IMPORT_FILE, leafStr(file.c_str())); }); // geoid file PrintRecord(dnaproj_file, IMPORT_GEO_FILE, - (settings_.i.geo_file.empty() ? " " : leafStr(settings_.i.geo_file))); + (settings_.i.geo_file.empty() ? " " : leafStr(settings_.i.geo_file))); // reference frame settings PrintRecord(dnaproj_file, REFERENCE_FRAME, settings_.i.reference_frame); @@ -1771,18 +1771,18 @@ void CDnaProjectFile::PrintProjectFile() PrintRecord(dnaproj_file, SPLIT_CLUSTERS, yesno_string(settings_.i.split_clusters)); PrintRecord(dnaproj_file, IMPORT_SEG_BLOCK, - (settings_.i.import_block ? val_uint(settings_.i.import_block_number) : "no")); + (settings_.i.import_block ? val_uint(settings_.i.import_block_number) : "no")); PrintRecord(dnaproj_file, SEG_FILE, - (settings_.i.seg_file.empty() ? " " : leafStr(settings_.i.seg_file))); + (settings_.i.seg_file.empty() ? " " : leafStr(settings_.i.seg_file))); PrintRecord(dnaproj_file, PREFER_X_MSR_AS_G, yesno_string(settings_.i.prefer_single_x_as_g)); PrintRecord(dnaproj_file, INCLUDE_MSRS, settings_.i.include_msrs); PrintRecord(dnaproj_file, EXCLUDE_MSRS, settings_.i.exclude_msrs); PrintRecord(dnaproj_file, STATION_RENAMING_FILE, - leafStr(settings_.i.stn_renamingfile)); + leafStr(settings_.i.stn_renamingfile)); PrintRecord(dnaproj_file, STATION_DISCONTINUITY_FILE, - leafStr(settings_.i.stn_discontinuityfile)); + leafStr(settings_.i.stn_discontinuityfile)); PrintRecord(dnaproj_file, TEST_NEARBY_STNS, yesno_string(settings_.i.search_nearby_stn)); PrintRecord(dnaproj_file, TEST_NEARBY_STN_DIST, settings_.i.search_stn_radius); @@ -1806,7 +1806,7 @@ void CDnaProjectFile::PrintProjectFile() PrintRecord(dnaproj_file, PSCALE, settings_.i.pscale); PrintRecord(dnaproj_file, LSCALE, settings_.i.lscale); PrintRecord(dnaproj_file, HSCALE, settings_.i.hscale); - PrintRecord(dnaproj_file, SCALAR_FILE, leafStr(settings_.i.scalar_file)); + PrintRecord(dnaproj_file, SCALAR_FILE, leafStr(settings_.i.scalar_file)); // export options PrintRecord(dnaproj_file, EXPORT_XML_FILES, @@ -1824,33 +1824,33 @@ void CDnaProjectFile::PrintProjectFile() PrintRecord(dnaproj_file, SIMULATE_MSR_FILE, yesno_string(settings_.i.simulate_measurements)); - dnaproj_file << endl; + dnaproj_file << std::endl; //////////////////////////////////////////////////////////////////////////////////////////////// // #reftran ss.str(""); ss << section_reftran << " (" << PRINT_VAR_PAD << ")"; PrintRecord(dnaproj_file, ss.str(), "VALUE"); - dnaproj_file << OUTPUTLINE << endl; + dnaproj_file << OUTPUTLINE << std::endl; PrintRecord(dnaproj_file, REFERENCE_FRAME, settings_.r.reference_frame); PrintRecord(dnaproj_file, EPOCH, settings_.r.epoch); PrintRecord(dnaproj_file, TECTONIC_PLATE_MODEL_OPTION, settings_.r.plate_model_option); // Plate motion model option - PrintRecord(dnaproj_file, TECTONIC_PLATE_BDY_FILE, leafStr(settings_.r.tpb_file)); // Tectonic plate boundary file - PrintRecord(dnaproj_file, TECTONIC_PLATE_POLE_FILE, leafStr(settings_.r.tpp_file)); // Tectonic plate pole file + PrintRecord(dnaproj_file, TECTONIC_PLATE_BDY_FILE, leafStr(settings_.r.tpb_file)); // Tectonic plate boundary file + PrintRecord(dnaproj_file, TECTONIC_PLATE_POLE_FILE, leafStr(settings_.r.tpp_file)); // Tectonic plate pole file - dnaproj_file << endl; + dnaproj_file << std::endl; //////////////////////////////////////////////////////////////////////////////////////////////// // #geoid ss.str(""); ss << section_geoid << " (" << PRINT_VAR_PAD << ")"; PrintRecord(dnaproj_file, ss.str(), "VALUE"); - dnaproj_file << OUTPUTLINE << endl; + dnaproj_file << OUTPUTLINE << std::endl; // Output configured to populate binary station files - PrintRecord(dnaproj_file, NTV2_FILEPATH, system_complete(settings_.n.ntv2_geoid_file).string()); // Full file path to geoid file + PrintRecord(dnaproj_file, NTV2_FILEPATH, boost::filesystem::system_complete(settings_.n.ntv2_geoid_file).string()); // Full file path to geoid file PrintRecord(dnaproj_file, METHOD, settings_.n.interpolation_method); PrintRecord(dnaproj_file, DDEG_FORMAT, settings_.n.coordinate_format); @@ -1860,17 +1860,17 @@ void CDnaProjectFile::PrintProjectFile() PrintRecord(dnaproj_file, EXPORT_GEO_FILE, yesno_string(settings_.n.export_dna_geo_file)); - dnaproj_file << endl; + dnaproj_file << std::endl; //////////////////////////////////////////////////////////////////////////////////////////////// // #segment ss.str(""); ss << section_segment << " (" << PRINT_VAR_PAD << ")"; PrintRecord(dnaproj_file, ss.str(), "VALUE"); - dnaproj_file << OUTPUTLINE << endl; + dnaproj_file << OUTPUTLINE << std::endl; - PrintRecord(dnaproj_file, NET_FILE, leafStr(settings_.s.net_file)); // Starting stations file - PrintRecord(dnaproj_file, SEG_FILE, leafStr(settings_.s.seg_file)); // Segmentation output file + PrintRecord(dnaproj_file, NET_FILE, leafStr(settings_.s.net_file)); // Starting stations file + PrintRecord(dnaproj_file, SEG_FILE, leafStr(settings_.s.seg_file)); // Segmentation output file PrintRecord(dnaproj_file, SEG_MIN_INNER_STNS, settings_.s.min_inner_stations); // Minimum number of inner stations per block PrintRecord(dnaproj_file, SEG_THRESHOLD_STNS, settings_.s.max_total_stations); // Maximum number of total stations per block PrintRecord(dnaproj_file, SEG_FORCE_CONTIGUOUS, @@ -1879,19 +1879,19 @@ void CDnaProjectFile::PrintProjectFile() // Stations to be incorporated within the first block. PrintRecord(dnaproj_file, SEG_STARTING_STN, settings_.s.seg_starting_stns); - dnaproj_file << endl; + dnaproj_file << std::endl; //////////////////////////////////////////////////////////////////////////////////////////////// // #adjust ss.str(""); ss << section_adjust << " (" << PRINT_VAR_PAD << ")"; PrintRecord(dnaproj_file, ss.str(), "VALUE"); - dnaproj_file << OUTPUTLINE << endl; + dnaproj_file << OUTPUTLINE << std::endl; - PrintRecord(dnaproj_file, SEG_FILE, leafStr(settings_.a.seg_file)); // Starting stations file + PrintRecord(dnaproj_file, SEG_FILE, leafStr(settings_.a.seg_file)); // Starting stations file PrintRecord(dnaproj_file, COMMENTS, settings_.a.comments); // Starting stations file - PrintRecord(dnaproj_file, ADJUSTMENT_MODE, adjustmentMode(settings_.a.adjust_mode)); + PrintRecord(dnaproj_file, ADJUSTMENT_MODE, adjustmentMode(settings_.a.adjust_mode)); PrintRecord(dnaproj_file, MODE_PHASED_MT, yesno_string(settings_.a.multi_thread)); @@ -1904,10 +1904,10 @@ void CDnaProjectFile::PrintProjectFile() PrintRecord(dnaproj_file, STN_CONSTRAINTS, settings_.a.station_constraints); ss.str(""); - ss << fixed << setprecision(3) << settings_.a.free_std_dev; + ss << std::fixed << std::setprecision(3) << settings_.a.free_std_dev; PrintRecord(dnaproj_file, FREE_STN_SD, ss.str()); // SD for free stations ss.str(""); - ss << scientific << setprecision(4) << settings_.a.fixed_std_dev; + ss << std::scientific << std::setprecision(4) << settings_.a.fixed_std_dev; PrintRecord(dnaproj_file, FIXED_STN_SD, ss.str()); // SD for fixed stations //PrintRecord(dnaproj_file, LSQ_INVERSE_METHOD, settings_.a.inverse_method_lsq); // Least squares inverse method @@ -1920,16 +1920,16 @@ void CDnaProjectFile::PrintProjectFile() yesno_string(settings_.a.purge_stage_files)); // Purge stage files PrintRecord(dnaproj_file, TYPE_B_GLOBAL, settings_.a.type_b_global); // Global Type B uncertainties - PrintRecord(dnaproj_file, TYPE_B_FILE, leafStr(settings_.a.type_b_file)); // Type B uncertainty file + PrintRecord(dnaproj_file, TYPE_B_FILE, leafStr(settings_.a.type_b_file)); // Type B uncertainty file - dnaproj_file << endl; + dnaproj_file << std::endl; //////////////////////////////////////////////////////////////////////////////////////////////// // #output ss.str(""); ss << section_output << " (" << PRINT_VAR_PAD << ")"; PrintRecord(dnaproj_file, ss.str(), "VALUE"); - dnaproj_file << OUTPUTLINE << endl; + dnaproj_file << OUTPUTLINE << std::endl; PrintRecord(dnaproj_file, OUTPUT_MSR_TO_STN, yesno_string(settings_.o._msr_to_stn)); @@ -1980,10 +1980,10 @@ void CDnaProjectFile::PrintProjectFile() yesno_string(settings_.o._init_stn_corrections)); ss.str(""); - ss << fixed << setprecision(3) << settings_.o._hz_corr_threshold; + ss << std::fixed << std::setprecision(3) << settings_.o._hz_corr_threshold; PrintRecord(dnaproj_file, HZ_CORR_THRESHOLD, ss.str()); ss.str(""); - ss << fixed << setprecision(3) << settings_.o._vt_corr_threshold; + ss << std::fixed << std::setprecision(3) << settings_.o._vt_corr_threshold; PrintRecord(dnaproj_file, VT_CORR_THRESHOLD, ss.str()); PrintRecord(dnaproj_file, EXPORT_XML_STN_FILE, @@ -1993,16 +1993,16 @@ void CDnaProjectFile::PrintProjectFile() PrintRecord(dnaproj_file, EXPORT_SNX_FILE, yesno_string(settings_.o._export_snx_file)); - dnaproj_file << endl; + dnaproj_file << std::endl; //////////////////////////////////////////////////////////////////////////////////////////////// // #plot ss.str(""); ss << section_plot << " (" << PRINT_VAR_PAD << ")"; PrintRecord(dnaproj_file, ss.str(), "VALUE"); - dnaproj_file << OUTPUTLINE << endl; + dnaproj_file << OUTPUTLINE << std::endl; - dnaproj_file << endl; + dnaproj_file << std::endl; dnaproj_file.close(); } diff --git a/dynadjust/include/config/dnaprojectfile.hpp b/dynadjust/include/config/dnaprojectfile.hpp index c17ec89a..a7a6b5a6 100644 --- a/dynadjust/include/config/dnaprojectfile.hpp +++ b/dynadjust/include/config/dnaprojectfile.hpp @@ -34,11 +34,6 @@ #include #include - -using namespace std; -using namespace boost; -using namespace boost::timer; - #include #include #include @@ -51,7 +46,7 @@ class CDnaProjectFile public: CDnaProjectFile(void); - CDnaProjectFile(const string& projectFile, const UINT16& verifyContext); + CDnaProjectFile(const std::string& projectFile, const UINT16& verifyContext); virtual inline ~CDnaProjectFile(void) {} //virtual inline CDnaProjectFile* clone() const { @@ -69,16 +64,16 @@ class CDnaProjectFile inline project_settings GetSettings() const { return settings_; } //inline CDnaProjectFile& operator[](int iIndex) { return this[iIndex]; } - void LoadProjectFile(const string& projectFile); + void LoadProjectFile(const std::string& projectFile); void LoadProjectFile(); void PrintProjectFile(); template - void PrintRecord(ostream& os, const T& variable, const U& value); + void PrintRecord(std::ostream& os, const T& variable, const U& value); template - void PrintVariable(ostream& os, const T& variable); + void PrintVariable(std::ostream& os, const T& variable); template - void PrintValue(ostream& os, const T& value); + void PrintValue(std::ostream& os, const T& value); inline void UpdateSettingsGeneral(const general_settings& g) { settings_.g = g; @@ -113,12 +108,12 @@ class CDnaProjectFile } template - void AddOptionValue(ostream& os, const char* const option, const T& value); + void AddOptionValue(std::ostream& os, const char* const option, const T& value); template - void AddDefaultValue(ostream& os, const T& value); + void AddDefaultValue(std::ostream& os, const T& value); - string FormCommandLineOptionsStringImport(); - string FormCommandLineOptionsStringGeneral(); + std::string FormCommandLineOptionsStringImport(); + std::string FormCommandLineOptionsStringGeneral(); private: void InitialiseGeneralSettings(); @@ -128,15 +123,15 @@ class CDnaProjectFile void InitialiseSegmentSettings(); void InitialiseAdjustSettings(); - void LoadSettingGeneral(const settingMode mSetting, const string& var, string& val); - void LoadSettingImport(const settingMode mSetting, const string& var, string& val); - void LoadSettingReftran(const string& var, string& val); - void LoadSettingGeoid(const string& var, string& val); - void LoadSettingSegment(const string& var, string& val); - void LoadSettingAdjust(const string& var, string& val); - void LoadSettingOutput(const string& var, string& val); - //void LoadSettingPlot(const string& var, string& val); - //void LoadSettingDisplay(const string& var, string& val); + void LoadSettingGeneral(const settingMode mSetting, const std::string& var, std::string& val); + void LoadSettingImport(const settingMode mSetting, const std::string& var, std::string& val); + void LoadSettingReftran(const std::string& var, std::string& val); + void LoadSettingGeoid(const std::string& var, std::string& val); + void LoadSettingSegment(const std::string& var, std::string& val); + void LoadSettingAdjust(const std::string& var, std::string& val); + void LoadSettingOutput(const std::string& var, std::string& val); + //void LoadSettingPlot(const std::string& var, std::string& val); + //void LoadSettingDisplay(const std::string& var, std::string& val); project_settings settings_; }; diff --git a/dynadjust/include/config/dnatypes.hpp b/dynadjust/include/config/dnatypes.hpp index f7164c9e..0809c30d 100644 --- a/dynadjust/include/config/dnatypes.hpp +++ b/dynadjust/include/config/dnatypes.hpp @@ -36,8 +36,6 @@ #include // memset #include -using namespace std; - #ifdef UINT32 #undef UINT32 #endif @@ -68,61 +66,61 @@ const char UPPER_TRIANGLE = 'U'; const UINT16 VALID_STATION = 1; const UINT16 INVALID_STATION = 0; -typedef vector vchar; +typedef std::vector vchar; typedef vchar::iterator _it_chr; -typedef vector vdouble; +typedef std::vector vdouble; typedef vdouble::iterator _it_dbl; -typedef vector vbool; +typedef std::vector vbool; typedef vbool::iterator _it_bool; -typedef vector::reference boolRef; +typedef std::vector::reference boolRef; -typedef string::iterator _it_str; -typedef string::const_iterator _it_str_const; -typedef vector vstring, *pvstring; +typedef std::string::iterator _it_str; +typedef std::string::const_iterator _it_str_const; +typedef std::vector vstring, *pvstring; typedef vstring::iterator _it_vstr; typedef vstring::const_iterator _it_vstr_const; -typedef pair _it_pair_vchar; +typedef std::pair _it_pair_vchar; -typedef pair _it_pair_vstring; +typedef std::pair _it_pair_vstring; -typedef queue qUINT32; +typedef std::queue qUINT32; -typedef vector vUINT32, *pvUINT32; -typedef vector vvUINT32, *pvvUINT32; +typedef std::vector vUINT32, *pvUINT32; +typedef std::vector vvUINT32, *pvvUINT32; typedef vUINT32::iterator it_vUINT32; typedef vUINT32::const_iterator it_vUINT32_const; typedef vvUINT32::iterator it_vvUINT32; -typedef pair string_string_pair; -typedef pair string_uint32_pair; -typedef pair uint32_uint32_pair; -typedef pair uint32_string_pair; +typedef std::pair string_string_pair; +typedef std::pair string_uint32_pair; +typedef std::pair uint32_uint32_pair; +typedef std::pair uint32_string_pair; -typedef pair bool_uint32_pair; +typedef std::pair bool_uint32_pair; -typedef pair string_vstring_pair; +typedef std::pair string_vstring_pair; -typedef pair u32u32_uint32_pair; -typedef pair uint32_u32u32_pair; +typedef std::pair u32u32_uint32_pair; +typedef std::pair uint32_u32u32_pair; -typedef pair doubledouble_pair; -typedef pair stringstring_doubledouble_pair; -typedef vector v_stringstring_doubledouble_pair, *pv_stringstring_doubledouble_pair; +typedef std::pair doubledouble_pair; +typedef std::pair stringstring_doubledouble_pair; +typedef std::vector v_stringstring_doubledouble_pair, *pv_stringstring_doubledouble_pair; typedef v_stringstring_doubledouble_pair::iterator _it_string_doubledouble_pair; -typedef vector v_doubledouble_pair, *pv_doubledouble_pair; -typedef pair string_v_doubledouble_pair; -typedef vector v_string_v_doubledouble_pair, *pv_string_v_doubledouble_pair; +typedef std::vector v_doubledouble_pair, *pv_doubledouble_pair; +typedef std::pair string_v_doubledouble_pair; +typedef std::vector v_string_v_doubledouble_pair, *pv_string_v_doubledouble_pair; typedef v_string_v_doubledouble_pair::iterator it_v_string_v_doubledouble_pair; -typedef pair u32u32_double_pair; +typedef std::pair u32u32_double_pair; -typedef pair stringbool_pair; -typedef pair stringuint32_stringbool_pair; +typedef std::pair stringbool_pair; +typedef std::pair stringuint32_stringbool_pair; ///////////////////////////////////////////////////////////// // Custom pair type to manage appearances of a station @@ -152,9 +150,9 @@ struct stn_appearance_t }; typedef stn_appearance_t stn_appear; -typedef vector v_stn_appear; +typedef std::vector v_stn_appear; typedef v_stn_appear::iterator it_vstn_appear; -typedef vector vv_stn_appear; +typedef std::vector vv_stn_appear; typedef vv_stn_appear::iterator it_vvstn_appear; ///////////////////////////////////////////////////////////// @@ -194,7 +192,7 @@ struct stn_block_map_t }; typedef stn_block_map_t stn_block_map; -typedef vector v_stn_block_map; +typedef std::vector v_stn_block_map; typedef v_stn_block_map::iterator it_vstn_block_map; ///////////////////////////////////////////////////////////// @@ -217,7 +215,7 @@ struct freestnpair_t }; typedef freestnpair_t freestn_pair; -typedef vector v_freestn_pair; +typedef std::vector v_freestn_pair; typedef v_freestn_pair::iterator it_freestn_pair; ///////////////////////////////////////////////////////////// @@ -239,7 +237,7 @@ struct amlpair_t }; typedef amlpair_t aml_pair; -typedef vector v_aml_pair; +typedef std::vector v_aml_pair; typedef v_aml_pair::iterator it_aml_pair; ///////////////////////////////////////////////////////////// @@ -265,23 +263,23 @@ struct sequential_adj_t }; typedef sequential_adj_t sequential_adj; -typedef vector v_sequential_adj; +typedef std::vector v_sequential_adj; typedef v_sequential_adj::iterator it_sequential_adj; ///////////////////////////////////////////////////////////// -typedef map uint32_uint32_map; +typedef std::map uint32_uint32_map; typedef uint32_uint32_map::iterator it_uint32_uint32_map; -typedef vector v_uint32_uint32_map; +typedef std::vector v_uint32_uint32_map; typedef v_uint32_uint32_map::iterator it_v_uint32_uint32_map; -typedef vector v_string_string_pair, *pv_string_string_pair; -typedef vector v_string_vstring_pair, *pv_string_vstring_pair; +typedef std::vector v_string_string_pair, *pv_string_string_pair; +typedef std::vector v_string_vstring_pair, *pv_string_vstring_pair; -typedef vector v_string_uint32_pair, *pv_string_uint32_pair; -typedef vector v_uint32_uint32_pair, *pv_uint32_uint32_pair; -typedef vector v_uint32_string_pair, *pv_uint32_string_pair; -typedef vector v_u32u32_uint32_pair; -typedef vector v_uint32_u32u32_pair; +typedef std::vector v_string_uint32_pair, *pv_string_uint32_pair; +typedef std::vector v_uint32_uint32_pair, *pv_uint32_uint32_pair; +typedef std::vector v_uint32_string_pair, *pv_uint32_string_pair; +typedef std::vector v_u32u32_uint32_pair; +typedef std::vector v_uint32_u32u32_pair; typedef v_string_vstring_pair::iterator _it_string_vstring_pair; typedef v_string_uint32_pair::iterator _it_string_uint32_pair; @@ -290,20 +288,20 @@ typedef v_u32u32_uint32_pair::iterator _it_u32u32_uint32_pair; typedef v_uint32_u32u32_pair::iterator _it_uint32_u32u32_pair; typedef v_uint32_uint32_pair::iterator _it_uint32_uint32_pair; -typedef pair<_it_u32u32_uint32_pair, _it_u32u32_uint32_pair> _it_pair_u32u32_uint32; +typedef std::pair<_it_u32u32_uint32_pair, _it_u32u32_uint32_pair> _it_pair_u32u32_uint32; -typedef vector vv_string_string_pair; +typedef std::vector vv_string_string_pair; -typedef pair _it_pair_vUINT32_const; -typedef pair it_pair_vUINT32; +typedef std::pair _it_pair_vUINT32_const; +typedef std::pair it_pair_vUINT32; typedef v_string_string_pair::iterator it_string_pair; -typedef pair it_pair_string; -typedef pair<_it_string_uint32_pair, _it_string_uint32_pair> it_pair_string_vUINT32; -typedef pair<_it_uint32_string_pair, _it_uint32_string_pair> it_pair_uint32_string; +typedef std::pair it_pair_string; +typedef std::pair<_it_string_uint32_pair, _it_string_uint32_pair> it_pair_string_vUINT32; +typedef std::pair<_it_uint32_string_pair, _it_uint32_string_pair> it_pair_uint32_string; -typedef pair it_pair_map_vUINT32_vUINT32; +typedef std::pair it_pair_map_vUINT32_vUINT32; typedef enum _SIGMA_ZERO_STAT_PASS_ { @@ -468,11 +466,11 @@ typedef struct { } statSummary_t; typedef struct stationCorrections { - stationCorrections(const string& stn="") + stationCorrections(const std::string& stn="") : _station(stn), _azimuth(0.), _vAngle(0.), _sDistance(0.) , _hDistance(0.), _east(0.), _north(0.), _up(0.) {} - string _station; + std::string _station; double _azimuth; double _vAngle; double _sDistance; @@ -482,12 +480,12 @@ typedef struct stationCorrections { double _up; } stationCorrections_t; -typedef vector vstnCor_t, *pvstnCor_t; -typedef vector vvstnCor_t; +typedef std::vector vstnCor_t, *pvstnCor_t; +typedef std::vector vvstnCor_t; typedef vstnCor_t::iterator it_vstnCor_t; typedef struct { - string _station; + std::string _station; double _latitude; double _longitude; double _hzPosU; @@ -503,12 +501,12 @@ typedef struct { double _zz; } stationPosUncertainty_t; -typedef vector vstnPU_t, *pvstnPU_t; -typedef vector vvstnPU_t; +typedef std::vector vstnPU_t, *pvstnPU_t; +typedef std::vector vvstnPU_t; typedef vstnPU_t::iterator it_vstnPU_t; typedef struct { - string _networkName; + std::string _networkName; vstring _initialStns; UINT32 _minInnerStns; UINT32 _maxTotalStns; @@ -592,13 +590,13 @@ typedef struct stn_t { } station_t; -typedef vector vstn_t, *pvstn_t; +typedef std::vector vstn_t, *pvstn_t; typedef vstn_t::iterator it_vstn_t; typedef vstn_t::const_iterator it_vstn_t_const; -typedef vector vsummary_t, *pvsummary_t; +typedef std::vector vsummary_t, *pvsummary_t; -typedef pair stn_t_string_pair; -typedef vector v_stn_string; +typedef std::pair stn_t_string_pair; +typedef std::vector v_stn_string; typedef v_stn_string::iterator it_stn_string; const UINT32 MOD_NAME_WIDTH(20); @@ -615,7 +613,7 @@ typedef struct input_file_meta { typedef struct binary_file_meta { binary_file_meta () : binCount(0), reduced(false), reftran(false), geoid(false), inputFileCount(0), inputFileMeta(NULL) {} - binary_file_meta (const string& app_name) + binary_file_meta (const std::string& app_name) : binCount(0), reduced(false), reftran(false), geoid(false), inputFileCount(0), inputFileMeta(NULL) { sprintf(modifiedBy, "%s", app_name.c_str()); } @@ -634,15 +632,15 @@ typedef struct binary_file_meta { input_file_meta_t* inputFileMeta; // Source file metadata } binary_file_meta_t; -typedef vector vifm_t; +typedef std::vector vifm_t; typedef vifm_t::iterator it_vifm_t; -typedef vector vbfm_t; +typedef std::vector vbfm_t; typedef vbfm_t::iterator it_vbfm_t; template S formatStnMsrFileSourceString(const vifm_t* vfile_meta, const size_t& file_type) { - string source_files(""); + std::string source_files(""); bool this_file; for (UINT32 i(0); isize(); ++i) @@ -678,7 +676,7 @@ S formatStnMsrFileSourceString(const vifm_t* vfile_meta, const size_t& file_type return source_files; } -template +template S FormatFileType(const size_t& file_type) { switch (file_type) diff --git a/dynadjust/include/config/dnaversion-stream.hpp b/dynadjust/include/config/dnaversion-stream.hpp index 2475132d..ec12b501 100644 --- a/dynadjust/include/config/dnaversion-stream.hpp +++ b/dynadjust/include/config/dnaversion-stream.hpp @@ -31,6 +31,8 @@ #include +using std::setw; + #include #include @@ -73,7 +75,7 @@ template void output_version(T& stream, bool PAD=false) { if (PAD) - stream << setw(PRINT_VAR_PAD) << left << "Version: "; + stream << std::setw(PRINT_VAR_PAD) << std::left << "Version: "; else stream << "Version: "; stream << __BINARY_VERSION__ << ", " << __BINARY_BUILDTYPE__; @@ -84,7 +86,7 @@ template void output_build(T& stream, bool PAD=false) { if (PAD) - stream << setw(PRINT_VAR_PAD) << left << "Build: "; + stream << std::setw(PRINT_VAR_PAD) << std::left << "Build: "; else stream << "Build: "; stream << diff --git a/dynadjust/include/config/dnaversion.hpp b/dynadjust/include/config/dnaversion.hpp index f45092b6..63483cbf 100644 --- a/dynadjust/include/config/dnaversion.hpp +++ b/dynadjust/include/config/dnaversion.hpp @@ -303,7 +303,7 @@ const char* const __plot_dll_name__ = "libdnaplot.so"; #define __COMPILER_VERSION__ __SUNPRO_CC #elif defined(__ICC) || defined(__INTEL_COMPILER) // Intel compiler #define __COMPILER__ "Intel ICC" -#define __COMPILER_VERSION__ lexical_cast(__INTEL_COMPILER) +#define __COMPILER_VERSION__ boost::lexical_cast(__INTEL_COMPILER) #elif defined(__HP_aCC) // Oracle Solaris #define __COMPILER__ "HP C++" #define __COMPILER_VERSION__ __HP_aCC diff --git a/dynadjust/include/exception/dnaexception.hpp b/dynadjust/include/exception/dnaexception.hpp index 4bc928d2..a9e3b9ff 100644 --- a/dynadjust/include/exception/dnaexception.hpp +++ b/dynadjust/include/exception/dnaexception.hpp @@ -35,9 +35,6 @@ #include #include -using namespace std; -using namespace boost; - typedef enum _PARSE_STATUS_ { PARSE_SUCCESS = 0, PARSE_MSR_MAP = 1, @@ -77,21 +74,19 @@ typedef enum _REFTRAN_STATUS_ { REFTRAN_WGS84_TRANS_UNSUPPORTED = 5 } REFTRAN_STATUS; -using namespace std; - namespace dynadjust { namespace exception { // Exception handler class XMLInteropException : public std::exception { public: - explicit XMLInteropException(const string& what, const UINT32& line_no) + explicit XMLInteropException(const std::string& what, const UINT32& line_no) : what_(what), line_no_(line_no) {} virtual const char* what() const throw() { return what_.c_str(); } virtual ~XMLInteropException() throw() {} private: - string what_; + std::string what_; UINT32 line_no_; }; @@ -99,13 +94,13 @@ class XMLInteropException : public std::exception class NetPlotException : public std::exception { public: - explicit NetPlotException(const string& what, const UINT32& line_no) + explicit NetPlotException(const std::string& what, const UINT32& line_no) : what_(what), line_no_(line_no) {} virtual const char* what() const throw() { return what_.c_str(); } virtual ~NetPlotException() throw() {} private: - string what_; + std::string what_; UINT32 line_no_; }; @@ -113,13 +108,13 @@ class NetPlotException : public std::exception class NetSegmentException : public std::exception { public: - explicit NetSegmentException(const string& what, const UINT32& line_no) + explicit NetSegmentException(const std::string& what, const UINT32& line_no) : what_(what), line_no_(line_no) {} virtual const char* what() const throw() { return what_.c_str(); } virtual ~NetSegmentException() throw() {} private: - string what_; + std::string what_; UINT32 line_no_; }; @@ -127,13 +122,13 @@ class NetSegmentException : public std::exception class NetAdjustException : public std::exception { public: - explicit NetAdjustException(const string& what, const UINT32 block_no) + explicit NetAdjustException(const std::string& what, const UINT32 block_no) : what_(what), block_no_(block_no) {} virtual const char* what() const throw() { return what_.c_str(); } virtual ~NetAdjustException() throw() {} private: - string what_; + std::string what_; UINT32 block_no_; }; @@ -141,20 +136,20 @@ class NetAdjustException : public std::exception class NetMemoryException : public std::exception { public: - explicit NetMemoryException(const string& what) + explicit NetMemoryException(const std::string& what) : what_(what) {} virtual const char* what() const throw() { return what_.c_str(); } virtual ~NetMemoryException() throw() {} private: - string what_; + std::string what_; }; // Exception handler class NetGeoidException : public std::exception { public: - explicit NetGeoidException(const string& what, const int& error_no, const UINT32& line_no = 0) + explicit NetGeoidException(const std::string& what, const int& error_no, const UINT32& line_no = 0) : what_(what), error_no_(error_no), line_no_(line_no) {} virtual const char* what() const throw() { return what_.c_str(); } virtual ~NetGeoidException() throw() {} @@ -163,7 +158,7 @@ class NetGeoidException : public std::exception inline UINT32 line_no () const { return line_no_; } private: - string what_; + std::string what_; int error_no_; UINT32 line_no_; }; @@ -172,7 +167,7 @@ class NetGeoidException : public std::exception class RefTranException : public std::exception { public: - explicit RefTranException(const string& what, size_t exception_type = REFTRAN_EXCEPTION_RAISED) + explicit RefTranException(const std::string& what, size_t exception_type = REFTRAN_EXCEPTION_RAISED) : what_(what) , exception_type_(exception_type) {} virtual const char* what() const throw() { return what_.c_str(); } @@ -180,7 +175,7 @@ class RefTranException : public std::exception virtual ~RefTranException() throw() {} private: - string what_; + std::string what_; size_t exception_type_; }; diff --git a/dynadjust/include/functions/dnafilepathfuncs.hpp b/dynadjust/include/functions/dnafilepathfuncs.hpp index b4fab9b7..b027f389 100644 --- a/dynadjust/include/functions/dnafilepathfuncs.hpp +++ b/dynadjust/include/functions/dnafilepathfuncs.hpp @@ -41,12 +41,6 @@ #include -using namespace std; -using namespace boost; -using namespace boost::filesystem; - -using namespace std; - template T formPath(const T& folder, const T& file, const T& ext) { @@ -62,7 +56,7 @@ T formPath(const T& folder, const T file) template T leafStr(const T& filePath) { - return path(filePath).filename().string(); + return boost::filesystem::path(filePath).filename().string(); } #endif //DNAFILEPATHFUNCS_H_ \ No newline at end of file diff --git a/dynadjust/include/functions/dnaintegermanipfuncs.hpp b/dynadjust/include/functions/dnaintegermanipfuncs.hpp index 77ae4a1a..8234b118 100644 --- a/dynadjust/include/functions/dnaintegermanipfuncs.hpp +++ b/dynadjust/include/functions/dnaintegermanipfuncs.hpp @@ -31,13 +31,10 @@ #include -using namespace std; -using namespace boost; - #include template -void initialiseIncrementingIntegerVector(vector& vt, const T& size) +void initialiseIncrementingIntegerVector(std::vector& vt, const T& size) { vt.resize(size); T t(0); @@ -48,15 +45,15 @@ void initialiseIncrementingIntegerVector(vector& vt, const T& size) } template -void initialiseIncrementingIntegerVector(vector* vt, const T& size) +void initialiseIncrementingIntegerVector(std::vector* vt, const T& size) { initialiseIncrementingIntegerVector(*vt, size); } template -vector createIncrementingIntegerVector(const T& size) +std::vector createIncrementingIntegerVector(const T& size) { - vector vt(size); + std::vector vt(size); initialiseIncrementingIntegerVector(vt, size); return vt; } diff --git a/dynadjust/include/functions/dnaiostreamfuncs.hpp b/dynadjust/include/functions/dnaiostreamfuncs.hpp index e80e79e7..2ab3727d 100644 --- a/dynadjust/include/functions/dnaiostreamfuncs.hpp +++ b/dynadjust/include/functions/dnaiostreamfuncs.hpp @@ -32,6 +32,9 @@ #include #include +using std::ostringstream; +using std::locale; + #include #include #include @@ -42,39 +45,6 @@ #include #include -using namespace std; -using namespace boost; -using namespace boost::filesystem; -using namespace boost::timer; -using namespace boost::posix_time; -using namespace boost::gregorian; - - -//template -//std::ostream &operator<<(std::ostream &output, T const &input) { -// T::size_type size = input.size(); -// -// output << size << "\n"; -// std::copy(input.begin(), input.end(), -// std::ostream_iterator(output, "\n")); -// -// return output; -//} -// -//template -//std::istream &operator>>(std::istream &input, T &output) { -// T::size_type size, i; -// -// input >> size; -// output.resize(size); -// std::copy_n( -// std::istream_iterator(input), -// size, -// output.begin()); -// -// return input; -//} - template T real_line_length_ascii(const T& line_length_ascii) { @@ -100,8 +70,8 @@ T real_line_length_ascii(const T& line_length_ascii) template void file_opener( T* stream, - const string& str, - ios_base::openmode mode=ios_base::out, // default: output + const std::string& str, + std::ios_base::openmode mode=std::ios_base::out, // default: output const iosMode type=ascii, // default: ascii bool fileMustExist=false) // default: no need for file to exist { @@ -111,62 +81,62 @@ void file_opener( template void file_opener( T& stream, - const string& str, - ios_base::openmode mode=ios_base::out, // default: output + const std::string& str, + std::ios_base::openmode mode=std::ios_base::out, // default: output const iosMode type=ascii, // default: ascii bool fileMustExist=false) // default: no need for file to exist { try { stream.open(str.c_str(), mode); - stream.exceptions (/*ios_base::eofbit | */ios_base::badbit | ios_base::failbit); + stream.exceptions (/*std::ios_base::eofbit | */std::ios_base::badbit | std::ios_base::failbit); stream.iword(0) = type; } - catch (const ios_base::failure& f) { - stringstream ss; + catch (const std::ios_base::failure& f) { + std::stringstream ss; if (fileMustExist && !boost::filesystem::exists(str.c_str())) ss << "file_opener(): Can't find " << str << "."; else ss << "file_opener(): An error was encountered when opening " << str << ". \n Check that the file is not already opened."; - ss << endl << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << std::endl << f.what(); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } if (!stream.good()) { - stringstream ss; + std::stringstream ss; ss << "file_opener(): An error was encountered when opening " << str << ". \n Check that the file is not already opened."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } template void print_file_header( T& stream, - const string& header) + const std::string& header) { // Print formatted header - stream << OUTPUTLINE << endl; - stream << header << endl << endl; + stream << OUTPUTLINE << std::endl; + stream << header << std::endl << std::endl; // version output_version(stream, true); - stream << endl; + stream << std::endl; // build output_build(stream, true); - stream << endl; + stream << std::endl; // File creation time - stream << setw(PRINT_VAR_PAD) << left << "File created:"; - ostringstream datetime_ss; - time_facet* p_time_output = new time_facet; - locale special_locale (locale(""), p_time_output); + stream << std::setw(PRINT_VAR_PAD) << std::left << "File created:"; + std::ostringstream datetime_ss; + boost::posix_time::time_facet* p_time_output = new boost::posix_time::time_facet; + std::locale special_locale (std::locale(""), p_time_output); // special_locale takes ownership of the p_time_output facet datetime_ss.imbue (special_locale); (*p_time_output).format("%A, %d %B %Y, %X"); - datetime_ss << second_clock::local_time(); - stream << datetime_ss.str().c_str() << endl; + datetime_ss << boost::posix_time::second_clock::local_time(); + stream << datetime_ss.str().c_str() << std::endl; } diff --git a/dynadjust/include/functions/dnaparallelfuncs.hpp b/dynadjust/include/functions/dnaparallelfuncs.hpp index 8cf80ff2..3ec12217 100644 --- a/dynadjust/include/functions/dnaparallelfuncs.hpp +++ b/dynadjust/include/functions/dnaparallelfuncs.hpp @@ -37,9 +37,6 @@ #include -using namespace std; -using namespace boost; - template void parallel_for_each(Iterator first, Iterator last, Func f) { diff --git a/dynadjust/include/functions/dnaprocessfuncs.cpp b/dynadjust/include/functions/dnaprocessfuncs.cpp index 17007af7..4551353f 100644 --- a/dynadjust/include/functions/dnaprocessfuncs.cpp +++ b/dynadjust/include/functions/dnaprocessfuncs.cpp @@ -24,9 +24,7 @@ #include -using namespace boost::process; - -bool run_command(const string& executable_path, const UINT16& quiet) +bool run_command(const std::string& executable_path, const UINT16& quiet) { // use boost's platform independent code to invoke a process // see https://www.boost.org/doc/libs/develop/doc/html/process.html diff --git a/dynadjust/include/functions/dnaprocessfuncs.hpp b/dynadjust/include/functions/dnaprocessfuncs.hpp index 10aeeb92..701b6711 100644 --- a/dynadjust/include/functions/dnaprocessfuncs.hpp +++ b/dynadjust/include/functions/dnaprocessfuncs.hpp @@ -35,16 +35,23 @@ #if defined(_WIN32) || defined(__WIN32__) #include + +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif + #endif + + #include -bool run_command(const string& executable_path, const UINT16& quiet = 0); +bool run_command(const std::string& executable_path, const UINT16& quiet = 0); class dna_create_threaded_process { public: - dna_create_threaded_process(const string& command_path, const UINT16& quiet = 0) + dna_create_threaded_process(const std::string& command_path, const UINT16& quiet = 0) : _command_path(command_path), _quiet(quiet) {}; @@ -55,7 +62,7 @@ class dna_create_threaded_process run_command(_command_path, _quiet); } private: - string _command_path; + std::string _command_path; UINT16 _quiet; }; diff --git a/dynadjust/include/functions/dnastringfuncs.cpp b/dynadjust/include/functions/dnastringfuncs.cpp index 21894212..f7cd350b 100644 --- a/dynadjust/include/functions/dnastringfuncs.cpp +++ b/dynadjust/include/functions/dnastringfuncs.cpp @@ -128,30 +128,30 @@ int GetFields(char *line, char delim, bool multiple_delim_as_one, const char *fm // + Contact : geodesy@ga.gov.au // + --------------------------------------------------------------------------- // -void fileproc_help_header(string* msg) +void fileproc_help_header(std::string* msg) { - stringstream str; + std::stringstream str; - str << "+---------------------------------------------------------------------------" << endl; + str << "+---------------------------------------------------------------------------" << std::endl; str << "+ "; output_binaryname(str); str << " - "; output_theappname(str); str << "."; - str << endl; + str << std::endl; str << "+ "; output_binarydescription(str); - str << endl; + str << std::endl; str << "+ "; output_version(str); - str << endl; + str << std::endl; str << "+ "; output_build(str); - str << endl; + str << std::endl; *msg = str.str(); @@ -170,100 +170,100 @@ void fileproc_help_header(string* msg) } -void dynaml_header(ostream& os, const string& fileType, const string& referenceFrame, const string& epoch) +void dynaml_header(std::ostream& os, const std::string& fileType, const std::string& referenceFrame, const std::string& epoch) { - os << "" << endl; + os << "" << std::endl; os << "" << endl; + "\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"DynaML.xsd\">" << std::endl; os << "" << endl; + os << " -->" << std::endl; os << "" << endl; + os << " -->" << std::endl; os << "" << endl; + os << " -->" << std::endl; } -void dynaml_footer(ostream& os) +void dynaml_footer(std::ostream& os) { - os << "" << endl; + os << "" << std::endl; } -void dynaml_comment(ostream& os, const string& comment) +void dynaml_comment(std::ostream& os, const std::string& comment) { - os << "" << endl; + os << "" << std::endl; } -string snx_softwarehardware_text() +std::string snx_softwarehardware_text() { - stringstream str, str2; + std::stringstream str, str2; // name output_globalname(str2); - str << " SOFTWARE " << left << setw(60) << str2.str() << endl; + str << " SOFTWARE " << std::left << std::setw(60) << str2.str() << std::endl; // version str2.str(""); output_version(str2); - str << " SOFTWARE " << left << setw(60) << str2.str() << endl; + str << " SOFTWARE " << std::left << std::setw(60) << str2.str() << std::endl; // build str2.str(""); output_build(str2); - str << " SOFTWARE " << left << setw(60) << str2.str() << endl; + str << " SOFTWARE " << std::left << std::setw(60) << str2.str() << std::endl; // hardware - str << " HARDWARE " << left << setw(60) << __HARDWARE__ << endl; + str << " HARDWARE " << std::left << std::setw(60) << __HARDWARE__ << std::endl; return str.str(); } -void dna_header(ostream& os, const string& fileVersion, const string& fileType, const string& reference_frame, const string& epoch_version, const size_t& count) +void dna_header(std::ostream& os, const std::string& fileVersion, const std::string& fileType, const std::string& reference_frame, const std::string& epoch_version, const size_t& count) { - stringstream str; + std::stringstream str; str << "!#=DNA " << fileVersion << " " << fileType; - date today(day_clock::local_day()); + boost::gregorian::date today(boost::gregorian::day_clock::local_day()); // creation date - str << setw(14) << right << stringFromDate(today); + str << std::setw(14) << std::right << stringFromDate(today); // default reference frame - str << setw(14) << right << reference_frame; + str << std::setw(14) << std::right << reference_frame; // default epoch - str << setw(14) << right << epoch_version; + str << std::setw(14) << std::right << epoch_version; // count of records - str << setw(10) << right << count; + str << std::setw(10) << std::right << count; - os << str.str() << endl; + os << str.str() << std::endl; // Provide comments on the version of DynAdjust that is creating this file os << "* "; output_createdby(os); - os << ". " << endl; + os << ". " << std::endl; os << "* "; output_version(os); - os << ". " << endl; + os << ". " << std::endl; os << "* "; output_build(os); - os << endl; + os << std::endl; } -void dna_comment(ostream& os, const string& comment) +void dna_comment(std::ostream& os, const std::string& comment) { - os << "* " << comment << endl; + os << "* " << comment << std::endl; } -void dnaproj_header(ostream& os, const string& comment) +void dnaproj_header(std::ostream& os, const std::string& comment) { // DynAdjust version os << "# " << comment << ". "; @@ -274,8 +274,8 @@ void dnaproj_header(ostream& os, const string& comment) output_build(os); } -void dnaproj_comment(ostream& os, const string& comment) +void dnaproj_comment(std::ostream& os, const std::string& comment) { - os << "# " << comment << endl; + os << "# " << comment << std::endl; } diff --git a/dynadjust/include/functions/dnastringfuncs.hpp b/dynadjust/include/functions/dnastringfuncs.hpp index 1b156ea3..a1617105 100644 --- a/dynadjust/include/functions/dnastringfuncs.hpp +++ b/dynadjust/include/functions/dnastringfuncs.hpp @@ -36,19 +36,17 @@ #include #include -using namespace std; - // Returns the number of fields with valid data int GetFields(char *line, char delim, bool multiple_delim_as_one, const char *fmt, ...); -void fileproc_help_header(string* msg); -void dynaml_header(ostream& os, const string& fileType, const string& referenceFrame, const string& epoch); -void dynaml_footer(ostream& os); -void dynaml_comment(ostream& os, const string& comment); -void dna_header(ostream& os, const string& fileVersion, const string& fileType, const string& reference_frame, const string& epoch_version, const size_t& count); -void dna_comment(ostream& os, const string& comment); -void dnaproj_header(ostream& os, const string& comment); -void dnaproj_comment(ostream& os, const string& comment); - -string snx_softwarehardware_text(); +void fileproc_help_header(std::string* msg); +void dynaml_header(std::ostream& os, const std::string& fileType, const std::string& referenceFrame, const std::string& epoch); +void dynaml_footer(std::ostream& os); +void dynaml_comment(std::ostream& os, const std::string& comment); +void dna_header(std::ostream& os, const std::string& fileVersion, const std::string& fileType, const std::string& reference_frame, const std::string& epoch_version, const size_t& count); +void dna_comment(std::ostream& os, const std::string& comment); +void dnaproj_header(std::ostream& os, const std::string& comment); +void dnaproj_comment(std::ostream& os, const std::string& comment); + +std::string snx_softwarehardware_text(); #endif // DNASTRINGFUNCS_HPP_ \ No newline at end of file diff --git a/dynadjust/include/functions/dnastrmanipfuncs.hpp b/dynadjust/include/functions/dnastrmanipfuncs.hpp index eecba071..e53dac47 100644 --- a/dynadjust/include/functions/dnastrmanipfuncs.hpp +++ b/dynadjust/include/functions/dnastrmanipfuncs.hpp @@ -47,7 +47,6 @@ #include #include -using namespace std; using boost::spirit::qi::double_; using boost::spirit::qi::float_; using boost::spirit::qi::parse; @@ -55,23 +54,23 @@ using boost::spirit::qi::parse; template T val_uint(const U& value) { - return lexical_cast(value); + return boost::lexical_cast(value); } template T valorno_uint(const U& value, T& var) { - if (iequals(value, "no")) + if (boost::iequals(value, "no")) return var = 0; var = 1; - return lexical_cast(value); + return boost::lexical_cast(value); } template T valorno_string(const T& value) { - if (iequals(value, "no")) + if (boost::iequals(value, "no")) return ""; return value; } @@ -79,29 +78,29 @@ T valorno_string(const T& value) template T yesno_uint(const U& value) { - if (iequals(value, "yes")) + if (boost::iequals(value, "yes")) return 1; - //if (iequals(value, "no")) + //if (boost::iequals(value, "no")) return 0; } template -string yesno_string(const T value) +std::string yesno_string(const T value) { if (value == 1) - return string("yes"); + return std::string("yes"); else - return string("no"); + return std::string("no"); } template -string bool_string(const T value) +std::string bool_string(const T value) { if (value) - return string("true"); + return std::string("true"); else - return string("false"); + return std::string("false"); } template @@ -116,7 +115,7 @@ T findandreplace(const T& source, const T& find, const T& replace) // convert to upper case template -void str_toupper(string& strtext) +void str_toupper(std::string& strtext) { transform(strtext.begin(), strtext.end(), strtext.begin(), (T(*)(T))toupper); } @@ -142,10 +141,10 @@ template T trimstr_(const T& Src, const T& c) { size_t p2 = Src.find_last_not_of(c); - if (p2 == string::npos) + if (p2 == std::string::npos) return std::string(); size_t p1 = Src.find_first_not_of(c); - if (p1 == string::npos) + if (p1 == std::string::npos) p1 = 0; return Src.substr(p1, (p2-p1)+1); } @@ -155,7 +154,7 @@ T trimstrleft_(const T& Src, const T& c) { size_t p2 = Src.length(); size_t p1 = Src.find_first_not_of(c); - if (p1 == string::npos) + if (p1 == std::string::npos) p1 = 0; return Src.substr(p1, (p2-p1)+1); } @@ -164,7 +163,7 @@ template T trimstrright_(const T& Src, const T& c) { size_t p2 = Src.find_last_not_of(c); - if (p2 == string::npos) + if (p2 == std::string::npos) return std::string(); return Src.substr(0, p2+1); } @@ -187,12 +186,12 @@ T trimstrright(const T& Src) { } template -string StringFromTW(const T& t, const U& width, const U& precision=0) +std::string StringFromTW(const T& t, const U& width, const U& precision=0) { - stringstream ss; + std::stringstream ss; // Assume number at precision prints within width - ss << setw(width) << fixed << right << setprecision(precision) << t; + ss << std::setw(width) << std::fixed << std::right << std::setprecision(precision) << t; int trim = (int)trimstr(ss.str()).length() - width; // Formatted string length is less than or equal to the fixed width @@ -212,7 +211,7 @@ string StringFromTW(const T& t, const U& width, const U& precision=0) if (width < UINT32(t < 0. ? 6 : 5)) { // insufficient space for scientific notation!!! - ss << setw(width) << string(width, '#'); + ss << std::setw(width) << std::string(width, '#'); return ss.str(); } @@ -222,29 +221,29 @@ string StringFromTW(const T& t, const U& width, const U& precision=0) if (prec1 > 0) prec1--; - int prec = min(precision, prec1); + int prec = std::min(precision, prec1); - ss << setw(width) << scientific << right << setprecision(prec) << t; + ss << std::setw(width) << std::scientific << std::right << std::setprecision(prec) << t; } else { int prec = precision - trim; if (prec < 0) prec = 0; - ss << setw(width) << fixed << right << setprecision(prec) << t; + ss << std::setw(width) << std::fixed << std::right << std::setprecision(prec) << t; } return ss.str(); } template -string StringFromT(const T& t, const int& precision=-1) +std::string StringFromT(const T& t, const int& precision=-1) { - stringstream ss; + std::stringstream ss; if (precision < 0) ss << t; else - ss << setprecision(precision) << fixed << t; + ss << std::setprecision(precision) << std::fixed << t; return ss.str(); } @@ -273,7 +272,7 @@ S double_string_width(const T value, const U& width) // http://tinodidriksen.com/2011/05/28/cpp-convert-string-to-double-speed/ template -T DoubleFromString(const string& str) +T DoubleFromString(const std::string& str) { T t(0.); parse(str.begin(), str.end(), double_, t); @@ -281,7 +280,7 @@ T DoubleFromString(const string& str) } template -T FloatFromString(const string& str) +T FloatFromString(const std::string& str) { T t(0.); parse(str.begin(), str.end(), float_, t); @@ -289,19 +288,19 @@ T FloatFromString(const string& str) } template -void DoubleFromString(T& t, const string& str) +void DoubleFromString(T& t, const std::string& str) { parse(str.begin(), str.end(), double_, t); } template -void FloatFromString(T& t, const string& str) +void FloatFromString(T& t, const std::string& str) { parse(str.begin(), str.end(), float_, t); } template -bool DoubleFromString_ZeroCheck(T& t, const string& str) +bool DoubleFromString_ZeroCheck(T& t, const std::string& str) { parse(str.begin(), str.end(), double_, t); if (fabs(t) < PRECISION_1E35) @@ -311,16 +310,16 @@ bool DoubleFromString_ZeroCheck(T& t, const string& str) template // signed -typename std::enable_if::value, T>::type LongFromString(const string& str) +typename std::enable_if::value, T>::type LongFromString(const std::string& str) { char* end(NULL); T t(strtol(str.c_str(), &end, 10)); if (*end) { - stringstream ss; + std::stringstream ss; ss << "String to long conversion error: non-convertible part: " << end; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } return t; @@ -328,53 +327,53 @@ typename std::enable_if::value, T>::type LongFromString(const template // unsigned -typename std::enable_if::value, T>::type LongFromString(const string& str) +typename std::enable_if::value, T>::type LongFromString(const std::string& str) { char* end(NULL); T t(strtoul(str.c_str(), &end, 10)); if (*end) { - stringstream ss; + std::stringstream ss; ss << "String to long conversion error: non-convertible part: " << end; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } return t; } //template -//T LongFromString(const string& str) +//T LongFromString(const std::string& str) //{ // char* end(NULL); // T t; -// string s(typeid(t).name()); +// std::string s(typeid(t).name()); // -// if (iequals(s, "unsigned int") || iequals(s, "unsigned long") || // msvc -// iequals(s, "j") || iequals(s, "m")) // gcc +// if (boost::iequals(s, "unsigned int") || boost::iequals(s, "unsigned long") || // msvc +// boost::iequals(s, "j") || boost::iequals(s, "m")) // gcc // t = strtoul(str.c_str(), &end, 10); -// else if (iequals(s, "int") || iequals(s, "long") || // msvc -// iequals(s, "i") || iequals(s, "l")) // gcc +// else if (boost::iequals(s, "int") || boost::iequals(s, "long") || // msvc +// boost::iequals(s, "i") || boost::iequals(s, "l")) // gcc // t = strtol(str.c_str(), &end, 10); // else // { -// stringstream ss; +// std::stringstream ss; // ss << "String to long conversion error: " << s << " is not an integer." << end; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // if (*end) // { -// stringstream ss; +// std::stringstream ss; // ss << "String to long conversion error: non-convertible part: " << end; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // return t; //} //template -//void LongFromString(T *l, const string& str) +//void LongFromString(T *l, const std::string& str) //{ // //*l = atol(str.c_str()); // @@ -382,41 +381,41 @@ typename std::enable_if::value, T>::type LongFromString(cons //} // template -void FromDmsString(T *d, const string& str) +void FromDmsString(T *d, const std::string& str) { DmstoDeg(atof(str.c_str()), d); } template -T FromDmsString(const string& str) +T FromDmsString(const std::string& str) { return DmstoDeg(atof(str.c_str())); } template -void RadFromDmsString(T *d, const string& str) +void RadFromDmsString(T *d, const std::string& str) { DmstoDeg(atof(str.c_str()), d); Radians(d); } template -void RadFromSecondsString(T *d, const string& str) +void RadFromSecondsString(T *d, const std::string& str) { *d = SecondstoRadians(atof(str.c_str())); } template -void SplitDelimitedString(const T& str, const T& separator, vector* tokenList) +void SplitDelimitedString(const T& str, const T& separator, std::vector* tokenList) { // use boost to extract stations from comma delimited string - typedef tokenizer > tokenizer; - char_separator sepa(separator.c_str()); - tokenizer tokens(str, sepa); + typedef boost::tokenizer > btokenizer; + boost::char_separator sepa(separator.c_str()); + btokenizer tokens(str, sepa); tokenList->clear(); try { for_each(tokens.begin(), tokens.end(), - [&tokenList](const string& s) { + [&tokenList](const std::string& s) { if (!trimstr(s).empty()) tokenList->push_back(trimstr(s)); }); diff --git a/dynadjust/include/functions/dnatemplatecalcfuncs.hpp b/dynadjust/include/functions/dnatemplatecalcfuncs.hpp index 49d7c0b9..db2ef3ad 100644 --- a/dynadjust/include/functions/dnatemplatecalcfuncs.hpp +++ b/dynadjust/include/functions/dnatemplatecalcfuncs.hpp @@ -45,9 +45,6 @@ #include #include -using namespace std; -using namespace boost; - template U sumOfConsecutiveIntegers(const U& max, const U& min = 1) { diff --git a/dynadjust/include/functions/dnatemplatedatetimefuncs.hpp b/dynadjust/include/functions/dnatemplatedatetimefuncs.hpp index 9e4f33bc..eb60c75d 100644 --- a/dynadjust/include/functions/dnatemplatedatetimefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatedatetimefuncs.hpp @@ -37,11 +37,6 @@ const UINT32 TIME_IMMEMORIAL = 1900; -using namespace std; -using namespace boost::timer; -using namespace boost::posix_time; -using namespace boost::gregorian; - // Boost implementation of gregorian calendar supports dates in the range 1400-Jan-01 to 9999-Dec-31. // Integer representation of these dates is 2232400 and 5373484, which appears to be the Julian Date. // GPS time begins on 6 January 1980 (2444245) @@ -54,21 +49,21 @@ using namespace boost::gregorian; //UINT32 itoday = today.day_number(); //stringstream str; -//const std::locale fmt(locale::classic(), new date_facet("%m/%d/%Y")); +//const std::locale fmt(std::locale::classic(), new date_facet("%m/%d/%Y")); //str.imbue(fmt); -//str << gpsday << endl; -//str << "Today: " << today.day_number() << endl; +//str << gpsday << std::endl; +//str << "Today: " << today.day_number() << std::endl; //str << -// static_cast(today.year()) << endl << -// static_cast(today.month()) << endl << -// static_cast(today.day()) << endl << endl; -//str << "GPS day: " << gpsday.day_number() << endl; +// static_cast(today.year()) << std::endl << +// static_cast(today.month()) << std::endl << +// static_cast(today.day()) << std::endl << std::endl; +//str << "GPS day: " << gpsday.day_number() << std::endl; //str << -// static_cast(gpsday.year()) << endl << -// static_cast(gpsday.month()) << endl << -// static_cast(gpsday.day()) << endl; +// static_cast(gpsday.year()) << std::endl << +// static_cast(gpsday.month()) << std::endl << +// static_cast(gpsday.day()) << std::endl; -//cout << str.str().c_str() << endl; +//cout << str.str().c_str() << std::endl; //TRACE("%s", str.str().c_str()); @@ -79,7 +74,7 @@ using namespace boost::gregorian; //TRACE("Today is %d days since the beginning of GPS time\n", str.str().c_str()); template -void dateSINEXFormat(T* os, const date& theDate, bool calculateSeconds=false) +void dateSINEXFormat(T* os, const boost::gregorian::date& theDate, bool calculateSeconds=false) { // Time stamps must be in the following format: YY:DOY:SECOD // where: @@ -90,32 +85,32 @@ void dateSINEXFormat(T* os, const date& theDate, bool calculateSeconds=false) // 95:120:86399 denotes April 30, 1995 (23:59:59UT). // - stringstream year; - time_facet* facet(new time_facet("%y")); + std::stringstream year; + boost::posix_time::time_facet* facet(new boost::posix_time::time_facet("%y")); - year.imbue(locale(year.getloc(), facet)); - ptime dateTime(theDate); + year.imbue(std::locale(year.getloc(), facet)); + boost::posix_time::ptime dateTime(theDate); year << dateTime; - stringstream dayofyear; - dayofyear << right << setw(3) << theDate.day_of_year(); - string dayofyearstr(dayofyear.str()); - dayofyearstr = findandreplace(dayofyearstr, " ", "0"); + std::stringstream dayofyear; + dayofyear << std::right << std::setw(3) << theDate.day_of_year(); + std::string dayofyearstr(dayofyear.str()); + dayofyearstr = findandreplace(dayofyearstr, " ", "0"); *os << - right << setw(2) << + std::right << std::setw(2) << year.str() << ":" << // year (YY) - right << setw(3) << + std::right << std::setw(3) << dayofyearstr << ":"; // day of year if (calculateSeconds) { - ptime currentTime(second_clock::local_time()); - time_duration timeInterval(currentTime - dateTime); + boost::posix_time::ptime currentTime(boost::posix_time::second_clock::local_time()); + boost::posix_time::time_duration timeInterval(currentTime - dateTime); - stringstream secondsofday; - secondsofday << left << setw(5) << timeInterval.total_seconds(); - *os << left << setw(5) << secondsofday.str(); + std::stringstream secondsofday; + secondsofday << std::left << std::setw(5) << timeInterval.total_seconds(); + *os << std::left << std::setw(5) << secondsofday.str(); return; } @@ -123,31 +118,31 @@ void dateSINEXFormat(T* os, const date& theDate, bool calculateSeconds=false) } template -U dateYear(const date& theDate) +U dateYear(const boost::gregorian::date& theDate) { return theDate.year(); } template -U dateDOY(const date& theDate) +U dateDOY(const boost::gregorian::date& theDate) { return theDate.day_of_year(); } template -U dateMonth(const date& theDate) +U dateMonth(const boost::gregorian::date& theDate) { return theDate.month(); } template -U dateDay(const date& theDate) +U dateDay(const boost::gregorian::date& theDate) { return theDate.day(); } template -U dateDaynumber(const date& theDate) +U dateDaynumber(const boost::gregorian::date& theDate) { return theDate.day_number(); } @@ -155,31 +150,31 @@ U dateDaynumber(const date& theDate) template U todayYear() { - return dateYear(day_clock::local_day()); + return dateYear(boost::gregorian::day_clock::local_day()); } template U todayMonth() { - return dateMonth(day_clock::local_day()); + return dateMonth(boost::gregorian::day_clock::local_day()); } template U todayDay() { - return dateDay(day_clock::local_day()); + return dateDay(boost::gregorian::day_clock::local_day()); } template U todayDaynumber() { - return dateDaynumber(day_clock::local_day()); + return dateDaynumber(boost::gregorian::day_clock::local_day()); } template T integerToDate(const U& integer) { - return date(integer); + return boost::gregorian::date(integer); } template @@ -191,7 +186,7 @@ T dateToInteger(const T& theDate) template T ymdToDate(const U& year, const U& month, const U& day) { - return date(year, month, day); + return boost::gregorian::date(year, month, day); } template @@ -290,7 +285,7 @@ void year_doy_Average(const T& start_year, const T& end_year, template // epochFrom -> epochTo -T yearFraction(const date& epoch) +T yearFraction(const boost::gregorian::date& epoch) { // Day of year, less 0.5 day correction to // bring to middle of day, divided by number @@ -322,7 +317,7 @@ T yearFraction(const date& epoch) template // Return as a double or float the decimal year -T referenceEpoch(const date& theDate) +T referenceEpoch(const boost::gregorian::date& theDate) { // Epoch of interest return yearFraction(theDate) + theDate.year(); @@ -338,58 +333,58 @@ T elapsedTime(const T& current_epoch, const T& reference_epoch) template // elapsedTime = current_epoch - reference_epoch -T elapsedTime(const T& current_epoch, const date& reference_epoch) +T elapsedTime(const T& current_epoch, const boost::gregorian::date& reference_epoch) { return elapsedTime(current_epoch, referenceEpoch(reference_epoch)); } template // elapsedTime = current_epoch - reference_epoch -T elapsedTime(const date& current_epoch, const T& reference_epoch) +T elapsedTime(const boost::gregorian::date& current_epoch, const T& reference_epoch) { return elapsedTime(referenceEpoch(current_epoch), reference_epoch); } template // elapsedTime = current_epoch - reference_epoch -T elapsedTime(const date& current_epoch, const date& reference_epoch) +T elapsedTime(const boost::gregorian::date& current_epoch, const boost::gregorian::date& reference_epoch) { return elapsedTime(referenceEpoch(current_epoch), referenceEpoch(reference_epoch)); } template // dateString = dd.mm.yyyy -date dateFromString_safe(const string& dateString) +boost::gregorian::date dateFromString_safe(const std::string& dateString) { - vector vdateList; - SplitDelimitedString(dateString, string("."), &vdateList); + std::vector vdateList; + SplitDelimitedString(dateString, std::string("."), &vdateList); try { // boost date requires input in the following order: year, month, day - return date( + return boost::gregorian::date( LongFromString(vdateList.at(2)), // year LongFromString(vdateList.at(1)), // month LongFromString(vdateList.at(0))); // day } - catch (runtime_error& e) + catch (std::runtime_error& e) { - stringstream ss; - ss << "dateFromString_safe(): Could not parse the date string \"" << dateString << "\"" << endl << - " Details: " << e.what() << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "dateFromString_safe(): Could not parse the date string \"" << dateString << "\"" << std::endl << + " Details: " << e.what() << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - stringstream ss; - ss << "dateFromString_safe(): Could not parse the date string \"" << dateString << "\"." << endl << - " Check that the epoch is formatted as dd.mm.yyyy" << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "dateFromString_safe(): Could not parse the date string \"" << dateString << "\"." << std::endl << + " Check that the epoch is formatted as dd.mm.yyyy" << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } template // dateString = ddd yyyy -T dateFromStringstream_doy_year(S& date) +T dateFromStringstream_doy_year(S& thedate) { T parsedDate; // From boost_1_54_0/doc/html/date_time/date_time_io.html @@ -401,14 +396,14 @@ T dateFromStringstream_doy_year(S& date) // "2005" => 2005 // But! 94 => 2094! // So use %Y" - date.imbue(locale(date.getloc(), new date_input_facet("%j %Y"))); - date >> parsedDate; + thedate.imbue(std::locale(thedate.getloc(), new boost::gregorian::date_input_facet("%j %Y"))); + thedate >> parsedDate; return parsedDate; } template // dateString = ddd yyyy -T dateFromString_doy_year(S& date) +T dateFromString_doy_year(S& thedate) { T parsedDate; // From boost_1_54_0/doc/html/date_time/date_time_io.html @@ -420,20 +415,20 @@ T dateFromString_doy_year(S& date) // "2005" => 2005 // But! 94 => 2094! // So use %Y" - stringstream ss_date; - ss_date << date; - ss_date.imbue(locale(ss_date.getloc(), new date_input_facet("%j %Y"))); + std::stringstream ss_date; + ss_date << thedate; + ss_date.imbue(std::locale(ss_date.getloc(), new boost::gregorian::date_input_facet("%j %Y"))); ss_date >> parsedDate; return parsedDate; } template // date = yyyy.yyyyy -T dateFromDouble_doy_year(const D& date) +T dateFromDouble_doy_year(const D& thedate) { T parsedDate; - D year(floor(date)); - D year_fraction(date - year); + D year(floor(thedate)); + D year_fraction(thedate - year); D days_in_year(365.0); if (fmod(year, 400.) == 0) @@ -460,59 +455,59 @@ T dateFromDouble_doy_year(const D& date) // "2005" => 2005 // But! 94 => 2094! // So use %Y" - stringstream strdate; + std::stringstream strdate; if (idoy < 10.) strdate << "00"; else if (idoy < 100.) strdate << "0"; - strdate << idoy << " " << fixed << setprecision(0) << year; - strdate.imbue(locale(strdate.getloc(), new date_input_facet("%j %Y"))); + strdate << idoy << " " << std::fixed << std::setprecision(0) << year; + strdate.imbue(std::locale(strdate.getloc(), new boost::gregorian::date_input_facet("%j %Y"))); strdate >> parsedDate; return parsedDate; } template // dateString = dd.mm.yyyy -string stringFromDate(const T& date) +std::string stringFromDate(const T& thedate) { - stringstream ss; - ss.imbue(locale(ss.getloc(), new date_facet("%d.%m.%Y"))); + std::stringstream ss; + ss.imbue(std::locale(ss.getloc(), new boost::gregorian::date_facet("%d.%m.%Y"))); - ss << date; + ss << thedate; return ss.str(); } template // dateString = dd.mm.yyyy -string stringFromToday() +std::string stringFromToday() { - stringstream ss; - ss.imbue(locale(ss.getloc(), new date_facet("%d.%m.%Y"))); + std::stringstream ss; + ss.imbue(std::locale(ss.getloc(), new boost::gregorian::date_facet("%d.%m.%Y"))); - ss << date(day_clock::local_day()); + ss << boost::gregorian::date(boost::gregorian::day_clock::local_day()); return ss.str(); } template // dateString = dd.mm.yyyy -string stringFromDate(const T& date, const string& format) +std::string stringFromDate(const T& thedate, const std::string& format) { - stringstream ss; - ss.imbue(locale(ss.getloc(), new date_facet(format.c_str()))); + std::stringstream ss; + ss.imbue(std::locale(ss.getloc(), new boost::gregorian::date_facet(format.c_str()))); - ss << date; + ss << thedate; return ss.str(); } template // dateString = dd.mm.yyyy -T dateFromString(const string& dateString) +T dateFromString(const std::string& dateString) { // The following works well when dateString is "03.02.2013", but fails // if dateString is "3.2.2013". // //istringstream ss(dateString); - //ss.imbue(locale(std::locale::classic(), new gregorian::date_input_facet("%e.%m.%Y"))); + //ss.imbue(std::locale(std::locale::classic(), new boost::gregorian::date_input_facet("%e.%m.%Y"))); //T date; //ss >> date; //return date; @@ -524,8 +519,8 @@ T dateFromString(const string& dateString) // The flags marked with a hash sign (#) are implemented by system locale and are known to be missing on some platforms // Is today's date required? - if (iequals(dateString, "today")) - return dateFromString_safe(stringFromDate(T(day_clock::local_day()))); + if (boost::iequals(dateString, "today")) + return dateFromString_safe(stringFromDate(T(boost::gregorian::day_clock::local_day()))); // Parse manually. return dateFromString_safe(dateString); @@ -534,66 +529,66 @@ T dateFromString(const string& dateString) template // dateString = dd.mm.yyyy -string formattedDateStringFromNumericString(const string& dateString) +std::string formattedDateStringFromNumericString(const std::string& dateString) { - date date(dateFromString(dateString)); + boost::gregorian::date ddate(dateFromString(dateString)); - stringstream ss; - ss.imbue(locale(ss.getloc(), new date_facet("%A, %d %B %Y"))); + std::stringstream ss; + ss.imbue(std::locale(ss.getloc(), new boost::gregorian::date_facet("%A, %d %B %Y"))); - ss << date; + ss << ddate; return ss.str(); } template T formattedDateTimeString() { - stringstream datetime_ss, stream; - time_facet* p_time_output = new time_facet; - locale special_locale (locale(""), p_time_output); + std::stringstream datetime_ss, stream; + boost::posix_time::time_facet* p_time_output = new boost::posix_time::time_facet; + std::locale special_locale (std::locale(""), p_time_output); // special_locale takes ownership of the p_time_output facet datetime_ss.imbue (special_locale); (*p_time_output).format("%d-%m-%Y %X"); - datetime_ss << second_clock::local_time(); + datetime_ss << boost::posix_time::second_clock::local_time(); stream << datetime_ss.str().c_str(); return stream.str(); } template -S formatedElapsedTime(milliseconds* elapsed_time, S app_message) +S formatedElapsedTime(boost::posix_time::milliseconds* elapsed_time, S app_message) { - ostringstream ss_time; - ptime pt(ptime(gregorian::day_clock::local_day(), *elapsed_time)); + std::ostringstream ss_time; + boost::posix_time::ptime pt(boost::posix_time::ptime(boost::gregorian::day_clock::local_day(), *elapsed_time)); - if (*elapsed_time < seconds(3)) + if (*elapsed_time < boost::posix_time::seconds(3)) { - time_facet* facet(new time_facet("%s")); - ss_time.imbue(locale(ss_time.getloc(), facet)); + boost::posix_time::time_facet* facet(new boost::posix_time::time_facet("%s")); + ss_time.imbue(std::locale(ss_time.getloc(), facet)); ss_time.str(""); ss_time << pt << "s"; } - else if (*elapsed_time < seconds(61)) + else if (*elapsed_time < boost::posix_time::seconds(61)) { - time_facet* facet(new time_facet("%S")); - ss_time.imbue(locale(ss_time.getloc(), facet)); + boost::posix_time::time_facet* facet(new boost::posix_time::time_facet("%S")); + ss_time.imbue(std::locale(ss_time.getloc(), facet)); ss_time.str(""); ss_time << pt << "s"; } else - ss_time << seconds(static_cast(elapsed_time->total_seconds())); + ss_time << boost::posix_time::seconds(static_cast(elapsed_time->total_seconds())); - size_t pos = string::npos; - string time_message = ss_time.str(); - while ((pos = time_message.find("0s")) != string::npos) + size_t pos = std::string::npos; + std::string time_message = ss_time.str(); + while ((pos = time_message.find("0s")) != std::string::npos) time_message = time_message.substr(0, pos) + "s"; time_message = app_message + time_message + "."; - if ((pos = time_message.find(" 00.")) != string::npos) + if ((pos = time_message.find(" 00.")) != std::string::npos) time_message = time_message.replace(pos, 4, " 0."); - if ((pos = time_message.find(" 0.s")) != string::npos) + if ((pos = time_message.find(" 0.s")) != std::string::npos) time_message = time_message.replace(pos, 4, " 0s"); return time_message; diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index e292cfc3..8646d5c6 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -44,9 +44,6 @@ #include #include -using namespace std; -using namespace boost; - using namespace dynadjust::datum_parameters; using namespace dynadjust::measurements; @@ -119,7 +116,7 @@ void copy_if_all_occurrences(InputIterator begin, InputIterator end, Predicate p template void erase_if_impl(T* t, InputIterator begin, InputIterator end, Predicate pred) { - t->erase(remove_if(begin, end, pred), end); + t->erase(std::remove_if(begin, end, pred), end); } template @@ -137,8 +134,8 @@ void erase_if(T* t, Predicate pred) template void strip_duplicates(T& t) { - sort(t.begin(), t.end()); - typename T::iterator it_newend(unique(t.begin(), t.end())); + std::sort(t.begin(), t.end()); + typename T::iterator it_newend(std::unique(t.begin(), t.end())); if (it_newend != t.end()) t.resize(it_newend - t.begin()); } @@ -151,7 +148,7 @@ void strip_duplicates(T* t) // template function for output to file or cout template -void outputObject(T t, ostream &os) { os << t; } +void outputObject(T t, std::ostream &os) { os << t; } //// template functor for equality of (type)value //template @@ -184,7 +181,7 @@ class value_equals { value_equals (const V& v) : value(v) { } // comparison - bool operator() (pair elem) { + bool operator() (std::pair elem) { return elem.second == value; } }; @@ -194,10 +191,10 @@ class value_equals { // Use of NSEW to indicate negative/positive hemispheres // is not supported yet. template -T ParseDmsString(const string& dmsString, const string& delimiter) +T ParseDmsString(const std::string& dmsString, const std::string& delimiter) { - vector tokenList; - SplitDelimitedString(dmsString, delimiter, &tokenList); + std::vector tokenList; + SplitDelimitedString(dmsString, delimiter, &tokenList); // "-38 43 28.24255" // "-38" -> 38.000000000 @@ -233,23 +230,23 @@ T ParseDmsString(const string& dmsString, const string& delimiter) //symbols is only optional if withSpaces is true template -string FormatDmsString(const T& dDegMinSec, const int precision, bool withSpaces, bool withSymbols) +std::string FormatDmsString(const T& dDegMinSec, const int precision, bool withSpaces, bool withSymbols) { - stringstream ss; - ss << fixed << setprecision(precision) << dDegMinSec; + std::stringstream ss; + ss << std::fixed << std::setprecision(precision) << dDegMinSec; - // No symbols or spaces? return string + // No symbols or spaces? return std::string if (!withSpaces && !withSymbols) return ss.str(); - string strNumber(ss.str()), strBuf(ss.str()); + std::string strNumber(ss.str()), strBuf(ss.str()); size_t decimal(0); int precision_fmt(precision); int minute_symbol_loc(withSymbols?4:3), second_symbol_loc(withSymbols?8:6); // Add symbols for degrees minutes and seconds - if ((decimal = strNumber.find('.')) != string::npos) + if ((decimal = strNumber.find('.')) != std::string::npos) { // found a decimal point! if (decimal == 0) // decimal point at start, ie >> .0123 @@ -326,19 +323,19 @@ string FormatDmsString(const T& dDegMinSec, const int precision, bool withSpaces //symbols is only optional if withSpaces is true template -string FormatDnaDmsString(const T& dDegMinSec, int precision) +std::string FormatDnaDmsString(const T& dDegMinSec, int precision) { - stringstream ss; + std::stringstream ss; if (precision < 4) precision = 4; - ss << fixed << setprecision(precision) << dDegMinSec; - string strBuf(ss.str()); + ss << std::fixed << std::setprecision(precision) << dDegMinSec; + std::string strBuf(ss.str()); size_t decimal(0); - string d, m, s; + std::string d, m, s; // Format degrees minutes and seconds - if ((decimal = strBuf.find('.')) != string::npos) + if ((decimal = strBuf.find('.')) != std::string::npos) { // found a decimal point! if (decimal == 0) // decimal point at start, ie >> .0123 @@ -380,7 +377,7 @@ string FormatDnaDmsString(const T& dDegMinSec, int precision) } ss.str(""); - ss << setw(3) << d << setw(3) << right << m << " " << setw(6) << s; + ss << std::setw(3) << d << std::setw(3) << std::right << m << " " << std::setw(6) << s; strBuf = ss.str(); } @@ -406,7 +403,7 @@ class CompareClusterID public: CompareClusterID() : _m(0), _id(0) {} - CompareClusterID(const vector* m, const U& id=0) + CompareClusterID(const std::vector* m, const U& id=0) : _m(m), _id(id) {} // used for lower_bound, upper_bound, etc... bool operator()(const boost::shared_ptr lhs, const U& rhs) { @@ -433,11 +430,11 @@ class CompareClusterID bool operator()(const U& id) { return _m->at(id).clusterID == _id; } - inline void SetAMLPointer(const vector* m) { _m = m; } + inline void SetAMLPointer(const std::vector* m) { _m = m; } inline void SetClusterID(const U& id) { _id = id; } inline bool IsAMLPointerNull() { return _m == NULL; } private: - const vector* _m; + const std::vector* _m; U _id; }; @@ -451,7 +448,7 @@ template class CompareMeasCount { public: - CompareMeasCount(const vector* a) : _a(a) {} + CompareMeasCount(const std::vector* a) : _a(a) {} // used for lower_bound, upper_bound, etc... bool operator()(const boost::shared_ptr lhs, const U& rhs) { @@ -466,10 +463,10 @@ class CompareMeasCount return _a->at(lhs).GetAMLStnIndex() < _a->at(rhs).GetAMLStnIndex(); return _a->at(lhs).GetAssocMsrCount() < _a->at(rhs).GetAssocMsrCount(); } - inline void SetASLPointer(const vector* a) { _a = a; } + inline void SetASLPointer(const std::vector* a) { _a = a; } inline bool IsASLPointerNull() { return _a == NULL; } private: - const vector* _a; + const std::vector* _a; }; @@ -477,7 +474,7 @@ template class CompareMeasCount2 { public: - CompareMeasCount2(const vector* a) : _a(a) {} + CompareMeasCount2(const std::vector* a) : _a(a) {} bool operator()(const U& lhs, const U& rhs) { @@ -486,7 +483,7 @@ class CompareMeasCount2 return _a->at(lhs).get()->GetAssocMsrCount() < _a->at(rhs).get()->GetAssocMsrCount(); } private: - const vector* _a; + const std::vector* _a; }; @@ -494,7 +491,7 @@ template class CompareValidity { public: - CompareValidity(const vector* a, const UINT16& v) : _a(a), _v(v) {} + CompareValidity(const std::vector* a, const UINT16& v) : _a(a), _v(v) {} // used for lower_bound, upper_bound, etc... bool operator()(const U& asl_index) { @@ -505,7 +502,7 @@ class CompareValidity return _a->at(lhs).Validity() < _a->at(rhs).Validity(); } private: - const vector* _a; + const std::vector* _a; const UINT16 _v; }; @@ -515,7 +512,7 @@ template class CompareMeasStart { public: - CompareMeasStart(vector* m, MEASUREMENT_START id=xMeas) + CompareMeasStart(std::vector* m, MEASUREMENT_START id=xMeas) : _m(m), _id(id) {} bool operator()(const U& freemsr_index) { return _m->at(freemsr_index).measStart == _id; @@ -524,7 +521,7 @@ class CompareMeasStart return _m->at(lhs).measStart < _m->at(rhs).measStart; } private: - vector* _m; + std::vector* _m; MEASUREMENT_START _id; }; @@ -533,7 +530,7 @@ template class CompareNonMeasStart { public: - CompareNonMeasStart(vector* m, MEASUREMENT_START id=xMeas) + CompareNonMeasStart(std::vector* m, MEASUREMENT_START id=xMeas) : _m(m), _id(id) {} bool operator()(const U& freemsr_index) { return _m->at(freemsr_index).measStart != _id; @@ -542,7 +539,7 @@ class CompareNonMeasStart return _m->at(lhs).measStart < _m->at(rhs).measStart; } private: - vector* _m; + std::vector* _m; MEASUREMENT_START _id; }; @@ -551,13 +548,13 @@ template class CompareMsrFileOrder { public: - CompareMsrFileOrder(vector* m) + CompareMsrFileOrder(std::vector* m) : _m(m) {} bool operator()(const U& lhs, const U& rhs) { return _m->at(lhs).fileOrder < _m->at(rhs).fileOrder; } private: - vector* _m; + std::vector* _m; }; @@ -595,13 +592,13 @@ class CompareBlockStationMapUnique_Station { template class CompareBlockStationMapUnique_byFileOrder { public: - CompareBlockStationMapUnique_byFileOrder(vector* s) + CompareBlockStationMapUnique_byFileOrder(std::vector* s) : _s(s) {} bool operator()(const U& left, const U& right) { return _s->at(left.first.first).fileOrder < _s->at(right.first.first).fileOrder; } private: - vector* _s; + std::vector* _s; }; // M = measurement_t, U = UINT32 @@ -609,9 +606,9 @@ template class CompareMeasType_PairFirst { public: - CompareMeasType_PairFirst(vector* m) + CompareMeasType_PairFirst(std::vector* m) : _m(m) {} - bool operator()(const pair >& lhs, const pair >& rhs) { + bool operator()(const std::pair >& lhs, const std::pair >& rhs) { if (_m->at(lhs.first).measType == _m->at(rhs.first).measType) { if (_m->at(lhs.first).station1 == _m->at(rhs.first).station1) @@ -626,7 +623,7 @@ class CompareMeasType_PairFirst return _m->at(lhs.first).measType < _m->at(rhs.first).measType; } private: - vector* _m; + std::vector* _m; }; @@ -635,9 +632,9 @@ template class CompareMeasFromStn_PairFirst { public: - CompareMeasFromStn_PairFirst(vector* m) + CompareMeasFromStn_PairFirst(std::vector* m) : _m(m) {} - bool operator()(const pair >& lhs, const pair >& rhs) { + bool operator()(const std::pair >& lhs, const std::pair >& rhs) { if (_m->at(lhs.first).station1 == _m->at(rhs.first).station1) { if (_m->at(lhs.first).measType == _m->at(rhs.first).measType) @@ -652,7 +649,7 @@ class CompareMeasFromStn_PairFirst return _m->at(lhs.first).station1 < _m->at(rhs.first).station1; } private: - vector* _m; + std::vector* _m; }; @@ -661,9 +658,9 @@ template class CompareMeasToStn_PairFirst { public: - CompareMeasToStn_PairFirst(vector* m) + CompareMeasToStn_PairFirst(std::vector* m) : _m(m) {} - bool operator()(const pair >& lhs, const pair >& rhs) { + bool operator()(const std::pair >& lhs, const std::pair >& rhs) { if (_m->at(lhs.first).station2 == _m->at(rhs.first).station2) { if (_m->at(lhs.first).measType == _m->at(rhs.first).measType) @@ -678,7 +675,7 @@ class CompareMeasToStn_PairFirst return _m->at(lhs.first).station2 < _m->at(rhs.first).station2; } private: - vector* _m; + std::vector* _m; }; @@ -743,9 +740,9 @@ template class CompareMeasValue_PairFirst { public: - CompareMeasValue_PairFirst(vector* m) + CompareMeasValue_PairFirst(std::vector* m) : _m(m) {} - bool operator()(const pair >& lhs, const pair >& rhs) { + bool operator()(const std::pair >& lhs, const std::pair >& rhs) { if (isCompoundMeasAll(_m->at(lhs.first).measType) && notCompoundMeasAll(_m->at(rhs.first).measType)) { double lhsValue = 0.0; @@ -901,7 +898,7 @@ class CompareMeasValue_PairFirst return fabs(_m->at(lhs.first).term1) > fabs(_m->at(rhs.first).term1); } private: - vector* _m; + std::vector* _m; }; @@ -910,9 +907,9 @@ template class CompareMeasResidual_PairFirst { public: - CompareMeasResidual_PairFirst(vector* m) + CompareMeasResidual_PairFirst(std::vector* m) : _m(m) {} - bool operator()(const pair >& lhs, const pair >& rhs) { + bool operator()(const std::pair >& lhs, const std::pair >& rhs) { if (isCompoundMeasAll(_m->at(lhs.first).measType) && notCompoundMeasAll(_m->at(rhs.first).measType)) { double lhsValue = 0.0; @@ -1068,7 +1065,7 @@ class CompareMeasResidual_PairFirst return fabs(_m->at(lhs.first).measCorr) > fabs(_m->at(rhs.first).measCorr); } private: - vector* _m; + std::vector* _m; }; @@ -1077,9 +1074,9 @@ template class CompareMeasAdjSD_PairFirst { public: - CompareMeasAdjSD_PairFirst(vector* m) + CompareMeasAdjSD_PairFirst(std::vector* m) : _m(m) {} - bool operator()(const pair >& lhs, const pair >& rhs) { + bool operator()(const std::pair >& lhs, const std::pair >& rhs) { if (isCompoundMeasAll(_m->at(lhs.first).measType) && notCompoundMeasAll(_m->at(rhs.first).measType)) { double lhsValue = 0.0; @@ -1235,7 +1232,7 @@ class CompareMeasAdjSD_PairFirst return fabs(_m->at(lhs.first).measAdjPrec) > fabs(_m->at(rhs.first).measAdjPrec); } private: - vector* _m; + std::vector* _m; }; @@ -1244,9 +1241,9 @@ template class CompareMeasNstat_PairFirst { public: - CompareMeasNstat_PairFirst(vector* m) + CompareMeasNstat_PairFirst(std::vector* m) : _m(m) {} - bool operator()(const pair >& lhs, const pair >& rhs) { + bool operator()(const std::pair >& lhs, const std::pair >& rhs) { if (isCompoundMeasAll(_m->at(lhs.first).measType) && notCompoundMeasAll(_m->at(rhs.first).measType)) { double lhsValue = 0.0; @@ -1402,7 +1399,7 @@ class CompareMeasNstat_PairFirst return fabs(_m->at(lhs.first).NStat) > fabs(_m->at(rhs.first).NStat); } private: - vector* _m; + std::vector* _m; }; @@ -1411,13 +1408,13 @@ template class CompareStnFileOrder { public: - CompareStnFileOrder(vector* s) + CompareStnFileOrder(std::vector* s) : _s(s) {} bool operator()(const U& lhs, const U& rhs) { return _s->at(lhs).fileOrder < _s->at(rhs).fileOrder; } private: - vector* _s; + std::vector* _s; }; @@ -1464,13 +1461,13 @@ template class CompareStnFileOrder_StnBlockMap { public: - CompareStnFileOrder_StnBlockMap(vector* s) + CompareStnFileOrder_StnBlockMap(std::vector* s) : _s(s) {} bool operator()(const U& lhs, const U& rhs) { return _s->at(lhs.station_id).fileOrder < _s->at(rhs.station_id).fileOrder; } private: - vector* _s; + std::vector* _s; }; @@ -1487,30 +1484,30 @@ class CompareStnOrder_StnBlockMap }; -// T = station_t, S = string +// T = station_t, S = std::string template class CompareStnName { public: bool operator()(const T& lhs, const T& rhs) { - return string(lhs.stationName) < string(rhs.stationName); + return std::string(lhs.stationName) < std::string(rhs.stationName); } }; -// T = station_t, S = string +// T = station_t, S = std::string template class CompareStnOriginalName { public: bool operator()(const T& lhs, const T& rhs) { - return string(lhs.stationNameOrig) < string(rhs.stationNameOrig); + return std::string(lhs.stationNameOrig) < std::string(rhs.stationNameOrig); } bool operator()(const T& lhs, const S& rhs) { - return string(lhs.stationNameOrig) < rhs; + return std::string(lhs.stationNameOrig) < rhs; } bool operator()(const S& lhs, const T& rhs) { - return lhs < string(rhs.stationNameOrig); + return lhs < std::string(rhs.stationNameOrig); } }; @@ -1520,7 +1517,7 @@ template class CompareStnLongitude { public: - CompareStnLongitude(vector* s, bool leftToRight=true) + CompareStnLongitude(std::vector* s, bool leftToRight=true) : _s(s) , _leftToRight(leftToRight) {} bool operator()(const U& lhs, const U& rhs) { @@ -1530,7 +1527,7 @@ class CompareStnLongitude return _s->at(lhs).initialLongitude > _s->at(rhs).initialLongitude; } private: - vector* _s; + std::vector* _s; bool _leftToRight; }; @@ -1581,7 +1578,7 @@ class CompareScalars } }; -template +template class CompareScalarStations { public: @@ -1607,10 +1604,10 @@ template class CompareValidFreeMeasType_vT { public: - CompareValidFreeMeasType_vT(vector* msrs, vector& vtypes) + CompareValidFreeMeasType_vT(std::vector* msrs, std::vector& vtypes) : _msrs(msrs), _vtypes(vtypes) { - sort(vtypes.begin(), vtypes.end()); + std::sort(vtypes.begin(), vtypes.end()); } bool operator()(const U& msr_index) { return _msrs->at(msr_index).ignore == false && @@ -1618,8 +1615,8 @@ class CompareValidFreeMeasType_vT } private: - vector* _msrs; - vector _vtypes; + std::vector* _msrs; + std::vector _vtypes; }; @@ -1628,7 +1625,7 @@ template class CompareIgnoreedMeas { public: - CompareIgnoreedMeas(vector* m) : _m(m) {} + CompareIgnoreedMeas(std::vector* m) : _m(m) {} bool operator()(const U& freemsr_index) { return _m->at(freemsr_index).ignore; } @@ -1636,7 +1633,7 @@ class CompareIgnoreedMeas return _m->at(lhs).ignore < _m->at(rhs).ignore; } private: - vector* _m; + std::vector* _m; }; @@ -1744,7 +1741,7 @@ template class CompareMeasType { public: - CompareMeasType(const string& s) : _s(s) {} + CompareMeasType(const std::string& s) : _s(s) {} inline void SetComparand(const char& s) { _s = s; } bool operator()(boost::shared_ptr m) { @@ -1756,7 +1753,7 @@ class CompareMeasType } private: - string _s; + std::string _s; _it_str _it_s; }; @@ -1765,8 +1762,8 @@ template class CompareNonMeasType { public: - CompareNonMeasType(const string& s) : _s(s), _bFd(false) {} - inline void SetComparand(const string& s) { _s = s; } + CompareNonMeasType(const std::string& s) : _s(s), _bFd(false) {} + inline void SetComparand(const std::string& s) { _s = s; } bool operator()(boost::shared_ptr m) { _bFd = true; @@ -1777,7 +1774,7 @@ class CompareNonMeasType private: - string _s; + std::string _s; _it_str _it_s; bool _bFd; }; @@ -1787,12 +1784,12 @@ template class CompareCovarianceStart { public: - CompareCovarianceStart(vector* m) : _m(m) {} + CompareCovarianceStart(std::vector* m) : _m(m) {} bool operator()(const U& freemsr_index) { return _m->at(freemsr_index).measStart > zMeas; } private: - vector* _m; + std::vector* _m; }; @@ -1800,13 +1797,13 @@ template class ComparePairSecond { public: - bool operator()(const pair& lhs, const pair& rhs) const { + bool operator()(const std::pair& lhs, const std::pair& rhs) const { return pair_secondless(lhs.second, rhs.second); } - bool operator()(const pair& lhs, const T& rhs) { + bool operator()(const std::pair& lhs, const T& rhs) { return pair_secondless(lhs.second, rhs); } - bool operator()(const T& lhs, const pair& rhs) { + bool operator()(const T& lhs, const std::pair& rhs) { return pair_secondless(lhs, rhs.second); } private: @@ -1819,13 +1816,13 @@ template class ComparePairFirst { public: - bool operator()(const pair& lhs, const pair& rhs) const { + bool operator()(const std::pair& lhs, const std::pair& rhs) const { return pair_firstless(lhs.first, rhs.first); } - bool operator()(const pair& lhs, const T& rhs) { + bool operator()(const std::pair& lhs, const T& rhs) { return pair_firstless(lhs.first, rhs); } - bool operator()(const T& lhs, const pair& rhs) { + bool operator()(const T& lhs, const std::pair& rhs) { return pair_firstless(lhs, rhs.first); } private: @@ -1839,23 +1836,23 @@ template class CompareOddPairFirst { public: - bool operator()(const pair& lhs, const pair& rhs) const { + bool operator()(const std::pair& lhs, const std::pair& rhs) const { return lhs.first < rhs.first; } }; -// S = station_t, T = UINT32, U = string +// S = station_t, T = UINT32, U = std::string template class CompareOddPairFirst_FileOrder { public: - CompareOddPairFirst_FileOrder(vector* s) + CompareOddPairFirst_FileOrder(std::vector* s) : _s(s) {} - bool operator()(const pair& lhs, const pair& rhs) { + bool operator()(const std::pair& lhs, const std::pair& rhs) { return _s->at(lhs.first).fileOrder < _s->at(rhs.first).fileOrder; } private: - vector* _s; + std::vector* _s; }; @@ -1864,7 +1861,7 @@ class ComparePairSecondf { public: ComparePairSecondf(T t) : _t(t) {} - bool operator()(const pair& t) { + bool operator()(const std::pair& t) { return t.second == _t; } @@ -1913,7 +1910,7 @@ template class CompareFreeClusterAllStns { public: - CompareFreeClusterAllStns(vector* u, vector* m, const C& c) : _u(u), _m(m), _c(c) {} + CompareFreeClusterAllStns(std::vector* u, std::vector* m, const C& c) : _u(u), _m(m), _c(c) {} bool operator()(const U& amlindex) { // one-station measurement types // is this station on the list? @@ -1961,8 +1958,8 @@ class CompareFreeClusterAllStns return false; } private: - vector* _u; - vector* _m; + std::vector* _u; + std::vector* _m; char _c; }; @@ -1972,23 +1969,23 @@ template class PairCompareFirst { public: //functions // comparison func for sorting - //bool operator()(const pair& lhs, const pair& rhs) const { + //bool operator()(const std::pair& lhs, const std::pair& rhs) const { bool operator()(const string_string_pair& lhs, const string_string_pair& rhs) const { return keyLess(lhs.first, rhs.first); } // comparison func for lookups - //bool operator()(const pair& lhs, const pair::first_type& rhs) const { + //bool operator()(const std::pair& lhs, const std::pair::first_type& rhs) const { bool operator()(const string_string_pair& lhs, const string_string_pair::first_type& rhs) const { return keyLess(lhs.first, rhs); } // comparison func for lookups - //bool operator()(const pair::first_type& lhs, const pair& rhs) const { + //bool operator()(const std::pair::first_type& lhs, const std::pair& rhs) const { bool operator()(const string_string_pair::first_type& lhs, const string_string_pair& rhs) const { return keyLess(lhs, rhs.first); } private: // the "real" comparison function - //bool keyLess(const pair::first_type& k1, const pair::first_type& k2) const { + //bool keyLess(const std::pair::first_type& k1, const std::pair::first_type& k2) const { bool keyLess(const string_string_pair::first_type& k1, const string_string_pair::first_type& k2) const { return k1 < k2; } diff --git a/dynadjust/include/functions/dnatemplategeodesyfuncs.hpp b/dynadjust/include/functions/dnatemplategeodesyfuncs.hpp index 46754e0e..2a7699ec 100644 --- a/dynadjust/include/functions/dnatemplategeodesyfuncs.hpp +++ b/dynadjust/include/functions/dnatemplategeodesyfuncs.hpp @@ -44,9 +44,6 @@ #include #include -using namespace std; -using namespace boost; - using namespace dynadjust::datum_parameters; // nu helper @@ -148,11 +145,11 @@ template // double dXAxis(-3563081.362), dYAxis(-2057145.984), dZAxis(-4870449.482), dHeight(0.); // CDnaEllipsoid e; // CartToGeo(dXAxis, dYAxis, dZAxis, &dXAxis, &dYAxis, &dHeight, &e); -// stringstream ss; -// ss << setw(MSR) << right << FormatDmsString(RadtoDms(dXAxis), 5, true, false) << ", "; -// ss << setw(MSR) << right << FormatDmsString(RadtoDms(dYAxis), 5, true, false) << ", "; -// ss << setw(MSR) << setprecision(4) << fixed << right << dHeight; -// string comp(ss.str()); +// std::stringstream ss; +// ss << std::setw(MSR) << std::right << FormatDmsString(RadtoDms(dXAxis), 5, true, false) << ", "; +// ss << std::setw(MSR) << std::right << FormatDmsString(RadtoDms(dYAxis), 5, true, false) << ", "; +// ss << std::setw(MSR) << std::setprecision(4) << std::fixed << std::right << dHeight; +// std::string comp(ss.str()); // comp should equal "-50 00 00.0000, -150 00 00.0000, 10000.000" // void CartToGeo(const T& X, const T& Y, const T& Z, diff --git a/dynadjust/include/functions/dnatemplatematrixfuncs.hpp b/dynadjust/include/functions/dnatemplatematrixfuncs.hpp index e4948a15..421bca97 100644 --- a/dynadjust/include/functions/dnatemplatematrixfuncs.hpp +++ b/dynadjust/include/functions/dnatemplatematrixfuncs.hpp @@ -45,13 +45,10 @@ #include #include -using namespace std; -using namespace boost; - using namespace dynadjust::datum_parameters; using namespace dynadjust::math; -// msr_t_Iterator = vector::iterator +// msr_t_Iterator = std::vector::iterator template // Fills upper triangle void GetDirectionsVarianceMatrix(msr_t_Iterator begin, matrix_2d* vmat) @@ -129,7 +126,7 @@ void GetGPSVarianceMatrix(const msr_t_Iterator begin, matrix_2d* vmat) } -// msr_t_Iterator = vector::iterator +// msr_t_Iterator = std::vector::iterator template // Sets values based on upper triangle void SetDirectionsVarianceMatrix(msr_t_Iterator begin, const matrix_2d& vmat) @@ -167,7 +164,7 @@ void SetDirectionsVarianceMatrix(msr_t_Iterator begin, const matrix_2d& vmat) } } -// msr_t_Iterator = vector::iterator +// msr_t_Iterator = std::vector::iterator template // Sets values based on upper triangle void SetGPSVarianceMatrix(msr_t_Iterator begin, const matrix_2d& vmat) diff --git a/dynadjust/include/functions/dnatemplatematrixio.hpp b/dynadjust/include/functions/dnatemplatematrixio.hpp index 7dbbe795..b668417e 100644 --- a/dynadjust/include/functions/dnatemplatematrixio.hpp +++ b/dynadjust/include/functions/dnatemplatematrixio.hpp @@ -24,9 +24,6 @@ #include -using namespace std; -using namespace boost; - using namespace dynadjust::math; diff --git a/dynadjust/include/functions/dnatemplatestnmsrfuncs.hpp b/dynadjust/include/functions/dnatemplatestnmsrfuncs.hpp index 347c50d5..4481d9db 100644 --- a/dynadjust/include/functions/dnatemplatestnmsrfuncs.hpp +++ b/dynadjust/include/functions/dnatemplatestnmsrfuncs.hpp @@ -49,13 +49,11 @@ #include -using namespace std; -using namespace boost; using namespace dynadjust::measurements; template // Get all the statons asociated with a measurement -void GetGXMsrStations(vector* vgpsBsls, vector& msrStations) +void GetGXMsrStations(std::vector* vgpsBsls, std::vector& msrStations) { msrStations.clear(); @@ -73,7 +71,7 @@ void GetGXMsrStations(vector* vgpsBsls, vector& msrStations) template // Get all the statons asociated with a measurement -void GetMsrStations(const vmsr_t& binaryMsrs, const T& bmsIndex, vector& msrStations) +void GetMsrStations(const vmsr_t& binaryMsrs, const T& bmsIndex, std::vector& msrStations) { msrStations.clear(); T clusterID(binaryMsrs.at(bmsIndex).clusterID); @@ -140,7 +138,7 @@ template // Get all the binary measurement indices involved in a measurement // On return, msrIndices will contain only one index. For clusters // and directions, msrIndices will be more than one. -void GetMsrIndices(const vmsr_t& binaryMsrs, const T& bmsIndex, vector& msrIndices) +void GetMsrIndices(const vmsr_t& binaryMsrs, const T& bmsIndex, std::vector& msrIndices) { msrIndices.clear(); @@ -394,7 +392,7 @@ void CopyClusterMsr(T& cluster, const msriterator _it_msr, T& clusterCopy) // Comparison functions -template +template class CompareStationName { public: bool operator()(const T& left, const T& right) { @@ -410,19 +408,19 @@ class CompareStationName { } }; -template +template class EqualStationNameSaveDuplicates { public: - EqualStationNameSaveDuplicates(vector* stns) : _stns(stns) {} + EqualStationNameSaveDuplicates(std::vector* stns) : _stns(stns) {} bool operator()(const T& left, const T& right) { - if (equals(left->GetName(), right->GetName())) + if (boost::equals(left->GetName(), right->GetName())) _stns->push_back(right->GetName()); return (left->GetName() == right->GetName()); } - vector* _stns; + std::vector* _stns; }; @@ -435,27 +433,27 @@ class EqualStationName { }; -template +template class EqualStationName_CaseInsensitive { public: - EqualStationName_CaseInsensitive(vector* stns) : _stns(stns) {} + EqualStationName_CaseInsensitive(std::vector* stns) : _stns(stns) {} bool operator()(const T& left, const T& right) { - if (iequals(left->GetName(), right->GetName())) + if (boost::iequals(left->GetName(), right->GetName())) { _stns->push_back(right->GetName()); return true; } return false; } - vector* _stns; + std::vector* _stns; }; -template +template class TestEqualStationName { public: - TestEqualStationName(vector* usedStns, vector* unusedStns) + TestEqualStationName(std::vector* usedStns, std::vector* unusedStns) : _usedStns(usedStns) , _unusedStns(unusedStns) {} @@ -468,15 +466,15 @@ class TestEqualStationName { _unusedStns->push_back(stn->GetName()); return false; } - vector* _usedStns; - vector* _unusedStns; + std::vector* _usedStns; + std::vector* _unusedStns; }; -template +template class TestNotEqualStationName { public: - TestNotEqualStationName(vector* usedStns, vector* unusedStns) + TestNotEqualStationName(std::vector* usedStns, std::vector* unusedStns) : _usedStns(usedStns) , _unusedStns(unusedStns) {} @@ -489,8 +487,8 @@ class TestNotEqualStationName { _unusedStns->push_back(stn->GetName()); return true; } - vector* _usedStns; - vector* _unusedStns; + std::vector* _usedStns; + std::vector* _unusedStns; }; @@ -498,7 +496,7 @@ class TestNotEqualStationName { template class NearbyStation_LowAcc { public: - NearbyStation_LowAcc (const U& tolerance, vector* stns) + NearbyStation_LowAcc (const U& tolerance, std::vector* stns) : _tolerance(tolerance), _stns(stns), _dist(0.) {} bool operator()(const T& left, const T& right) { @@ -517,7 +515,7 @@ class NearbyStation_LowAcc { } U _tolerance; - vector* _stns; + std::vector* _stns; double _dist; }; @@ -526,7 +524,7 @@ class NearbyStation_LowAcc { template class NearbyStation_HighAcc { public: - NearbyStation_HighAcc(const U& tolerance, vector* stns, const E& ellipsoid) + NearbyStation_HighAcc(const U& tolerance, std::vector* stns, const E& ellipsoid) : _tolerance(tolerance), _stns(stns), _dAzimuth(0.), _dist(0.), _ellipsoid(ellipsoid) {} bool operator()(const T& left, const T& right) { @@ -546,7 +544,7 @@ class NearbyStation_HighAcc { } U _tolerance; - vector* _stns; + std::vector* _stns; U _dAzimuth; double _dist; E _ellipsoid; // GDA by default @@ -594,7 +592,7 @@ class FindStnsWithinBoundingBox{ }; // requires stns to be sorted -template +template class FindMsrsConnectedToStns_GX{ public: FindMsrsConnectedToStns_GX(const pvstring stns) @@ -612,7 +610,7 @@ class FindMsrsConnectedToStns_GX{ }; // requires stns to be sorted -template +template class FindMsrsConnectedToStns_Y{ public: FindMsrsConnectedToStns_Y(const pvstring stns) @@ -628,7 +626,7 @@ class FindMsrsConnectedToStns_Y{ }; // requires stns to be sorted -template +template class FindMsrsConnectedToStns_D{ public: FindMsrsConnectedToStns_D(const pvstring stns) @@ -653,9 +651,9 @@ class FindMsrsConnectedToStns{ bool operator()(dnaMsrPtr m) { - FindMsrsConnectedToStns_GX gpsbslFunc(_stns); - FindMsrsConnectedToStns_Y gpspntFunc(_stns); - FindMsrsConnectedToStns_D dirnFunc(_stns); + FindMsrsConnectedToStns_GX gpsbslFunc(_stns); + FindMsrsConnectedToStns_Y gpspntFunc(_stns); + FindMsrsConnectedToStns_D dirnFunc(_stns); switch (m->GetTypeC()) { @@ -817,7 +815,7 @@ class CompareMsr { public: bool operator()(const boost::shared_ptr left, const boost::shared_ptr right) { if (left->GetIgnore() == right->GetIgnore()) { - if (iequals(left->GetType(), right->GetType())) + if (boost::iequals(left->GetType(), right->GetType())) { switch (left->GetTypeC()) { @@ -883,7 +881,7 @@ class CompareMsr { template -basic_istream& operator>>(basic_istream& is, CAStationList t) +std::basic_istream& operator>>(std::basic_istream& is, CAStationList t) { is.read(reinterpret_cast(t.GetAssocMsrCountPtr()), sizeof(UINT32)); is.read(reinterpret_cast(t.GetAMLStnIndexPtr()), sizeof(UINT32)); @@ -892,7 +890,7 @@ basic_istream& operator>>(basic_istream& is, CASta } template -basic_istream& operator>>(basic_istream& is, CAStationList* t) +std::basic_istream& operator>>(std::basic_istream& is, CAStationList* t) { is.read(reinterpret_cast(t->GetAssocMsrCountPtr()), sizeof(UINT32)); is.read(reinterpret_cast(t->GetAMLStnIndexPtr()), sizeof(UINT32)); @@ -901,7 +899,7 @@ basic_istream& operator>>(basic_istream& is, CASta } template -basic_ostream& operator<<(std::basic_ostream& os, CAStationList t) +std::basic_ostream& operator<<(std::basic_ostream& os, CAStationList t) { os.write(reinterpret_cast(t.GetAssocMsrCountPtr()), sizeof(UINT32)); os.write(reinterpret_cast(t.GetAMLStnIndexPtr()), sizeof(UINT32)); @@ -910,7 +908,7 @@ basic_ostream& operator<<(std::basic_ostream& os } template -basic_ostream& operator<<(std::basic_ostream& os, CAStationList* t) +std::basic_ostream& operator<<(std::basic_ostream& os, CAStationList* t) { os.write(reinterpret_cast(t->GetAssocMsrCountPtr()), sizeof(UINT32)); os.write(reinterpret_cast(t->GetAMLStnIndexPtr()), sizeof(UINT32)); diff --git a/dynadjust/include/functions/dnatransparamfuncs.hpp b/dynadjust/include/functions/dnatransparamfuncs.hpp index 6528127e..af634191 100644 --- a/dynadjust/include/functions/dnatransparamfuncs.hpp +++ b/dynadjust/include/functions/dnatransparamfuncs.hpp @@ -38,9 +38,6 @@ #include #include -using namespace std; -using namespace boost; - using namespace dynadjust::epsg; namespace dynadjust { @@ -51,7 +48,7 @@ template S message_parameters_undefined(U from_epsg_code, U to_epsg_code) { // No direct parameters exist! - stringstream ss; + std::stringstream ss; ss << datumFromEpsgCode(from_epsg_code) << " to " << datumFromEpsgCode(to_epsg_code) << " parameters have not been defined."; return ss.str(); @@ -104,7 +101,7 @@ void determineGDA94Parameters(transformation_parameter_set& tParam) case ITRF1994_i_xyz: case ITRF1994_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // GDA94-to-ITRF1996 case ITRF1996_i_xyz: @@ -164,7 +161,7 @@ void determineGDA94Parameters(transformation_parameter_set& tParam) case ITRF2020_i_xyz: case ITRF2020_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // GDA94-to-WGS84 case WGS84_i_xyz: @@ -184,7 +181,7 @@ void determineGDA94Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineGDA94Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineGDA94Parameters(): ")); } } @@ -236,7 +233,7 @@ void determineGDA2020Parameters(transformation_parameter_set& tParam) case ITRF1994_i_xyz: case ITRF1994_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // GDA2020-to-ITRF1996 case ITRF1996_i_xyz: @@ -319,7 +316,7 @@ void determineGDA2020Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineGDA2020Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineGDA2020Parameters(): ")); } } @@ -368,7 +365,7 @@ void determineITRF1988Parameters(transformation_parameter_set& tParam) case ITRF2005_i_xyz: case ITRF2005_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // ITRF1988-to-ITRF1988 case ITRF1988_i_xyz: @@ -431,7 +428,7 @@ void determineITRF1988Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF1988Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF1988Parameters(): ")); } } @@ -479,7 +476,7 @@ void determineITRF1989Parameters(transformation_parameter_set& tParam) case ITRF2005_i_xyz: case ITRF2005_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // ITRF1989-to-ITRF1989 case ITRF1989_i_xyz: @@ -542,7 +539,7 @@ void determineITRF1989Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF1989Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF1989Parameters(): ")); } } @@ -590,7 +587,7 @@ void determineITRF1990Parameters(transformation_parameter_set& tParam) case ITRF2005_i_xyz: case ITRF2005_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // ITRF1990-to-ITRF1990 case ITRF1990_i_xyz: @@ -653,7 +650,7 @@ void determineITRF1990Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF1990Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF1990Parameters(): ")); } } @@ -701,7 +698,7 @@ void determineITRF1991Parameters(transformation_parameter_set& tParam) case ITRF2005_i_xyz: case ITRF2005_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // ITRF1991-to-ITRF1991 case ITRF1991_i_xyz: @@ -764,7 +761,7 @@ void determineITRF1991Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF1991Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF1991Parameters(): ")); } } @@ -812,7 +809,7 @@ void determineITRF1992Parameters(transformation_parameter_set& tParam) case ITRF2005_i_xyz: case ITRF2005_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // ITRF1992-to-ITRF1992 case ITRF1992_i_xyz: @@ -875,7 +872,7 @@ void determineITRF1992Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF1992Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF1992Parameters(): ")); } } @@ -923,7 +920,7 @@ void determineITRF1993Parameters(transformation_parameter_set& tParam) case ITRF2005_i_xyz: case ITRF2005_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // ITRF1993-to-ITRF1993 case ITRF1993_i_xyz: @@ -986,7 +983,7 @@ void determineITRF1993Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF1993Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF1993Parameters(): ")); } } @@ -1034,7 +1031,7 @@ void determineITRF1994Parameters(transformation_parameter_set& tParam) case ITRF2005_i_xyz: case ITRF2005_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // ITRF1994-to-ITRF1994 case ITRF1994_i_xyz: @@ -1097,7 +1094,7 @@ void determineITRF1994Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF1994Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF1994Parameters(): ")); } } @@ -1153,7 +1150,7 @@ void determineITRF1996Parameters(transformation_parameter_set& tParam) case ITRF2005_i_xyz: case ITRF2005_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // ITRF1996-to-ITRF1996 case ITRF1996_i_xyz: @@ -1216,7 +1213,7 @@ void determineITRF1996Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF1996Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF1996Parameters(): ")); } } @@ -1272,7 +1269,7 @@ void determineITRF1997Parameters(transformation_parameter_set& tParam) case ITRF2005_i_xyz: case ITRF2005_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // ITRF1997-to-ITRF1997 case ITRF1997_i_xyz: @@ -1335,7 +1332,7 @@ void determineITRF1997Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF1997Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF1997Parameters(): ")); } } @@ -1487,7 +1484,7 @@ void determineITRF2000Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF2000Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF2000Parameters(): ")); } } @@ -1543,7 +1540,7 @@ void determineITRF2005Parameters(transformation_parameter_set& tParam) case ITRF1997_i_xyz: case ITRF1997_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); // ITRF2005-to-ITRF2000 case ITRF2000_i_xyz: @@ -1604,7 +1601,7 @@ void determineITRF2005Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF2005Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF2005Parameters(): ")); } } @@ -1752,7 +1749,7 @@ void determineITRF2008Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF2008Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF2008Parameters(): ")); } } @@ -1899,7 +1896,7 @@ void determineITRF2014Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF2014Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF2014Parameters(): ")); } } @@ -1923,7 +1920,7 @@ void determineITRF2020Parameters(transformation_parameter_set& tParam) case GDA94_i_2d: case GDA94_i: // No direct parameters exist! - throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), + throw RefTranException(message_parameters_undefined(tParam.from_to_.first, tParam.from_to_.second), REFTRAN_DIRECT_PARAMS_UNAVAILABLE); break; ////////////////////////////////// @@ -2043,7 +2040,7 @@ void determineITRF2020Parameters(transformation_parameter_set& tParam) case WGS84_G2139_i_xyz: case WGS84_G2139_i: default: - throw boost::enable_current_exception(runtime_error("determineITRF2020Parameters(): ")); + throw boost::enable_current_exception(std::runtime_error("determineITRF2020Parameters(): ")); } } @@ -2194,18 +2191,18 @@ void determineHelmertParameters(transformation_parameter_set& tParam) REFTRAN_WGS84_TRANS_UNSUPPORTED); break; default: - throw boost::enable_current_exception(runtime_error("")); + throw boost::enable_current_exception(std::runtime_error("")); } } - catch (runtime_error& e) + catch (std::runtime_error& e) { - stringstream ss; - ss << "determineHelmertParameters():" << endl << - " " << e.what() << " Parameters for transforming between" << endl << - " " << datumFromEpsgCode(tParam.from_to_.first) << " and " << - datumFromEpsgCode(tParam.from_to_.second) << - " have not been defined yet." << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "determineHelmertParameters():" << std::endl << + " " << e.what() << " Parameters for transforming between" << std::endl << + " " << datumFromEpsgCode(tParam.from_to_.first) << " and " << + datumFromEpsgCode(tParam.from_to_.second) << + " have not been defined yet." << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } diff --git a/dynadjust/include/ide/trace.cpp b/dynadjust/include/ide/trace.cpp index c4d662ed..5067cb2e 100644 --- a/dynadjust/include/ide/trace.cpp +++ b/dynadjust/include/ide/trace.cpp @@ -25,6 +25,10 @@ #include #include +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif + void _trace(const char *fmt, ...) { char out[1024]; diff --git a/dynadjust/include/io/dnaioadj.cpp b/dynadjust/include/io/dnaioadj.cpp index 16e6152b..4e5c7c6c 100644 --- a/dynadjust/include/io/dnaioadj.cpp +++ b/dynadjust/include/io/dnaioadj.cpp @@ -29,22 +29,22 @@ using namespace dynadjust::measurements; namespace dynadjust { namespace iostreams { -void dna_io_adj::print_adj_stn_header(ostream& os) +void dna_io_adj::print_adj_stn_header(std::ostream& os) { - os << endl << "Adjusted Coordinates" << endl << - "------------------------------------------" << endl << endl; + os << std::endl << "Adjusted Coordinates" << std::endl << + "------------------------------------------" << std::endl << std::endl; } -void dna_io_adj::print_adj_stn_block_header(ostream& os, const UINT32& block) +void dna_io_adj::print_adj_stn_block_header(std::ostream& os, const UINT32& block) { - os << endl << "Adjusted Coordinates (Block " << block + 1 << ")" << endl << - "------------------------------------------" << endl << endl; + os << std::endl << "Adjusted Coordinates (Block " << block + 1 << ")" << std::endl << + "------------------------------------------" << std::endl << std::endl; } -void dna_io_adj::print_stn_info_col_header(ostream& os, - const string& stn_coord_types, const UINT16& printStationCorrections) +void dna_io_adj::print_stn_info_col_header(std::ostream& os, + const std::string& stn_coord_types, const UINT16& printStationCorrections) { - os << setw(STATION) << left << "Station" << setw(CONSTRAINT) << left << "Const"; + os << std::setw(STATION) << std::left << "Station" << std::setw(CONSTRAINT) << std::left << "Const"; _it_str_const it_s; UINT32 width(0); @@ -90,32 +90,32 @@ void dna_io_adj::print_stn_info_col_header(ostream& os, } if (validType) - os << right << setw(width) << CDnaStation::CoordinateName(c); + os << std::right << std::setw(width) << CDnaStation::CoordinateName(c); } - os << setw(PAD2) << " " << - right << setw(STDDEV) << "SD(e)" << - right << setw(STDDEV) << "SD(n)" << - right << setw(STDDEV) << "SD(up)"; + os << std::setw(PAD2) << " " << + std::right << std::setw(STDDEV) << "SD(e)" << + std::right << std::setw(STDDEV) << "SD(n)" << + std::right << std::setw(STDDEV) << "SD(up)"; j += PAD2+STDDEV+STDDEV+STDDEV+PAD2+COMMENT; if (printStationCorrections) { - os << setw(PAD2) << " " << - right << setw(HEIGHT) << "Corr(e)" << - right << setw(HEIGHT) << "Corr(n)" << - right << setw(HEIGHT) << "Corr(up)"; + os << std::setw(PAD2) << " " << + std::right << std::setw(HEIGHT) << "Corr(e)" << + std::right << std::setw(HEIGHT) << "Corr(n)" << + std::right << std::setw(HEIGHT) << "Corr(up)"; j += PAD2+HEIGHT+HEIGHT+HEIGHT; } - os << setw(PAD2) << " " << left << "Description" << endl; + os << std::setw(PAD2) << " " << std::left << "Description" << std::endl; UINT32 i; for (i=0; i(vbinary_aml->size())); @@ -128,16 +128,16 @@ void dna_io_aml::write_aml_file(const string& aml_filename, pvUINT32 vbinary_aml aml_file.write(reinterpret_cast(&(*_it_aml)), sizeof(UINT32)); } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } aml_file.close(); @@ -171,11 +171,11 @@ void dna_io_aml::create_msr_to_stn_tally(const pvASLPtr vAssocStnList, v_aml_pai } -void dna_io_aml::write_msr_to_stn(ostream &os, pvstn_t bstBinaryRecords, +void dna_io_aml::write_msr_to_stn(std::ostream &os, pvstn_t bstBinaryRecords, pvUINT32 vStationList, vmsrtally& v_stnmsrTally, MsrTally* parsemsrTally) { // Print measurement to station summary header - string header("MEASUREMENT TO STATIONS "); + std::string header("MEASUREMENT TO STATIONS "); MsrToStnSummaryHeader(os, header); it_vUINT32 _it_stn(vStationList->begin()); @@ -211,7 +211,7 @@ void dna_io_aml::write_msr_to_stn(ostream &os, pvstn_t bstBinaryRecords, // Print the total count per measurement parsemsrTally->coutSummaryMsrToStn(os, "Totals"); - os << endl << endl; + os << std::endl << std::endl; if (msrRedundancies > 0) { @@ -221,11 +221,11 @@ void dna_io_aml::write_msr_to_stn(ostream &os, pvstn_t bstBinaryRecords, else os << " stations were"; - os << " found to have GNSS measurements and absolute terrestrial measurements:" << endl << endl; + os << " found to have GNSS measurements and absolute terrestrial measurements:" << std::endl << std::endl; // Print header - os << setw(STATION) << left << "Station" << setw(30) << "Measurement types" << "Count" << endl; - os << "------------------------------------------------------------" << endl; + os << std::setw(STATION) << std::left << "Station" << std::setw(30) << "Measurement types" << "Count" << std::endl; + os << "------------------------------------------------------------" << std::endl; // Print measurements to each station and the total count for each station for (_it_stn=vStationList->begin(); _it_stn != vStationList->end(); ++_it_stn) @@ -249,11 +249,11 @@ void dna_io_aml::write_msr_to_stn(ostream &os, pvstn_t bstBinaryRecords, } -void dna_io_aml::write_aml_file_txt(const string& bms_filename, const string& aml_filename, pvUINT32 vbinary_aml, const pvASLPtr vAssocStnList, vdnaStnPtr* vStations) +void dna_io_aml::write_aml_file_txt(const std::string& bms_filename, const std::string& aml_filename, pvUINT32 vbinary_aml, const pvASLPtr vAssocStnList, vdnaStnPtr* vStations) { vmsr_t binaryMsrRecords; - stringstream ss; - ss << "write_aml_file(): An error was encountered when opening " << bms_filename << "." << endl; + std::stringstream ss; + ss << "write_aml_file(): An error was encountered when opening " << bms_filename << "." << std::endl; binary_file_meta_t bms_meta; try { @@ -261,42 +261,42 @@ void dna_io_aml::write_aml_file_txt(const string& bms_filename, const string& am // Load binary stations data. Throws runtime_error on failure. bms.load_bms_file(bms_filename, &binaryMsrRecords, bms_meta); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } std::ofstream aml_file; ss.str(""); - ss << "write_aml_file(): An error was encountered when opening " << aml_filename << "." << endl; + ss << "write_aml_file(): An error was encountered when opening " << aml_filename << "." << std::endl; try { // create binary aml file. Throws runtime_error on failure. file_opener(aml_file, aml_filename, - ios::out | ios::binary, binary); + std::ios::out | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "write_aml_file(): An error was encountered when writing to " << aml_filename << "." << endl; + ss << "write_aml_file(): An error was encountered when writing to " << aml_filename << "." << std::endl; // Write number of measurement records to file - stringstream ss_aml; + std::stringstream ss_aml; ss_aml << vbinary_aml->size() << " records"; - aml_file << left << setw(HEADER_18) << ss_aml.str(); - aml_file << left << setw(MSR) << "Msr index"; - aml_file << left << setw(MSR) << "Msr type"; - aml_file << left << setw(MSR) << "Cluster"; - aml_file << left << setw(MSR) << "Ignored msr?" << endl; + aml_file << std::left << std::setw(HEADER_18) << ss_aml.str(); + aml_file << std::left << std::setw(MSR) << "Msr index"; + aml_file << std::left << std::setw(MSR) << "Msr type"; + aml_file << std::left << std::setw(MSR) << "Cluster"; + aml_file << std::left << std::setw(MSR) << "Ignored msr?" << std::endl; it_vUINT32_const _it_aml(vbinary_aml->begin()); @@ -340,11 +340,11 @@ void dna_io_aml::write_aml_file_txt(const string& bms_filename, const string& am // may be unused. // Print station name - aml_file << setw(HEADER_18) << left << vStations->at(stn_index)->GetName(); + aml_file << std::setw(HEADER_18) << std::left << vStations->at(stn_index)->GetName(); // print the bmsr index // For clusters, this will be the index of the first binary element - aml_file << setw(MSR) << left << *_it_aml; + aml_file << std::setw(MSR) << std::left << *_it_aml; GetMsrIndices(binaryMsrRecords, *_it_aml, msrIndices); @@ -356,18 +356,18 @@ void dna_io_aml::write_aml_file_txt(const string& bms_filename, const string& am if (stn_index == binaryMsrRecords.at(*_it_msr).station1) { // All measurements have a first station - ss_aml << left << " (First)"; - aml_file << setw(MSR) << left << ss_aml.str(); + ss_aml << std::left << " (First)"; + aml_file << std::setw(MSR) << std::left << ss_aml.str(); ss_aml.str(""); switch (binaryMsrRecords.at(*_it_msr).measType) { case 'D': // Direction set case 'X': // GPS Baseline cluster case 'Y': // GPS point cluster - ss_aml << setw(MSR) << left << binaryMsrRecords.at(*_it_msr).clusterID; + ss_aml << std::setw(MSR) << std::left << binaryMsrRecords.at(*_it_msr).clusterID; break; default: - ss_aml << setw(MSR) << left << " "; + ss_aml << std::setw(MSR) << std::left << " "; break; } continue; @@ -382,13 +382,13 @@ void dna_io_aml::write_aml_file_txt(const string& bms_filename, const string& am if (stn_index == binaryMsrRecords.at(*_it_msr).station2) { if (binaryMsrRecords.at(*_it_msr).vectorCount1 > 0) - ss_aml << left << " (Second)"; + ss_aml << std::left << " (Second)"; else - ss_aml << left << " (Target)"; + ss_aml << std::left << " (Target)"; } - aml_file << setw(MSR) << left << ss_aml.str(); + aml_file << std::setw(MSR) << std::left << ss_aml.str(); ss_aml.str(""); - ss_aml << setw(MSR) << left << binaryMsrRecords.at(*_it_msr).clusterID; + ss_aml << std::setw(MSR) << std::left << binaryMsrRecords.at(*_it_msr).clusterID; break; case 'B': // Geodetic azimuth case 'C': // Chord dist @@ -401,37 +401,37 @@ void dna_io_aml::write_aml_file_txt(const string& bms_filename, const string& am case 'V': // Zenith distance case 'Z': // Vertical angle if (stn_index == binaryMsrRecords.at(*_it_msr).station2) - ss_aml << left << " (Second)"; - aml_file << setw(MSR) << left << ss_aml.str(); + ss_aml << std::left << " (Second)"; + aml_file << std::setw(MSR) << std::left << ss_aml.str(); ss_aml.str(""); - ss_aml << setw(MSR) << left << " "; + ss_aml << std::setw(MSR) << std::left << " "; break; case 'X': // GPS Baseline cluster if (stn_index == binaryMsrRecords.at(*_it_msr).station2) - ss_aml << left << " (Second)"; - aml_file << setw(MSR) << left << ss_aml.str(); + ss_aml << std::left << " (Second)"; + aml_file << std::setw(MSR) << std::left << ss_aml.str(); ss_aml.str(""); - ss_aml << setw(MSR) << left << binaryMsrRecords.at(*_it_msr).clusterID; + ss_aml << std::setw(MSR) << std::left << binaryMsrRecords.at(*_it_msr).clusterID; break; case 'A': // Horizontal angle if (stn_index == binaryMsrRecords.at(*_it_msr).station2) - ss_aml << left << " (Second)"; + ss_aml << std::left << " (Second)"; else if (stn_index == binaryMsrRecords.at(*_it_msr).station3) - ss_aml << left << " (Third)"; - aml_file << setw(MSR) << left << ss_aml.str(); + ss_aml << std::left << " (Third)"; + aml_file << std::setw(MSR) << std::left << ss_aml.str(); ss_aml.str(""); - ss_aml << setw(MSR) << left << " "; + ss_aml << std::setw(MSR) << std::left << " "; break; } } } - aml_file << setw(MSR) << left << ss_aml.str(); + aml_file << std::setw(MSR) << std::left << ss_aml.str(); if (binaryMsrRecords.at(*_it_aml).ignore) - aml_file << setw(MSR) << left << "*" << endl; // Ignored + aml_file << std::setw(MSR) << std::left << "*" << std::endl; // Ignored else - aml_file << setw(MSR) << left << " " << endl; + aml_file << std::setw(MSR) << std::left << " " << std::endl; // Move to the next AML record if (++_it_aml == vbinary_aml->end()) @@ -443,16 +443,16 @@ void dna_io_aml::write_aml_file_txt(const string& bms_filename, const string& am } while (_it_aml != vbinary_aml->end()); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } aml_file.close(); diff --git a/dynadjust/include/io/dnaioaml.hpp b/dynadjust/include/io/dnaioaml.hpp index 412838c4..7ab1ddde 100644 --- a/dynadjust/include/io/dnaioaml.hpp +++ b/dynadjust/include/io/dnaioaml.hpp @@ -44,14 +44,14 @@ class dna_io_aml : public dna_io_base dna_io_aml& operator=(const dna_io_aml& rhs); - void load_aml_file(const string& aml_filename, v_aml_pair* vbinary_aml, pvmsr_t bmsRecords); - void write_aml_file(const string& aml_filename, pvUINT32 vbinary_aml); - void write_aml_file_txt(const string& bms_filename, const string& aml_filename, pvUINT32 vbinary_aml, const pvASLPtr vAssocStnList, vdnaStnPtr* vStations); + void load_aml_file(const std::string& aml_filename, v_aml_pair* vbinary_aml, pvmsr_t bmsRecords); + void write_aml_file(const std::string& aml_filename, pvUINT32 vbinary_aml); + void write_aml_file_txt(const std::string& bms_filename, const std::string& aml_filename, pvUINT32 vbinary_aml, const pvASLPtr vAssocStnList, vdnaStnPtr* vStations); void create_msr_to_stn_tally(const pvASLPtr vAssocStnList, v_aml_pair& vAssocMsrList, vmsrtally& stnmsrTally, vmsr_t& bmsBinaryRecords); - void write_msr_to_stn(ostream &os, pvstn_t bstBinaryRecords, + void write_msr_to_stn(std::ostream &os, pvstn_t bstBinaryRecords, pvUINT32 vStationList, vmsrtally& v_stnmsrTally, MsrTally* parsemsrTally); protected: diff --git a/dynadjust/include/io/dnaioasl.cpp b/dynadjust/include/io/dnaioasl.cpp index f5cfe6ab..34b4237f 100644 --- a/dynadjust/include/io/dnaioasl.cpp +++ b/dynadjust/include/io/dnaioasl.cpp @@ -30,26 +30,26 @@ namespace iostreams { // open the asl file. the asl file is required to ensure invalid stations are // excluded from the adjustment. invalid stations are those with no measurements. -UINT32 dna_io_asl::load_asl_file(const string& asl_filename, vASL* vbinary_asl, vUINT32* vfree_stn) +UINT32 dna_io_asl::load_asl_file(const std::string& asl_filename, vASL* vbinary_asl, vUINT32* vfree_stn) { std::ifstream asl_file; - stringstream ss; - ss << "load_asl_file(): An error was encountered when opening " << asl_filename << "." << endl; + std::stringstream ss; + ss << "load_asl_file(): An error was encountered when opening " << asl_filename << "." << std::endl; try { // open stations asl file. Throws runtime_error on failure. - file_opener(asl_file, asl_filename, ios::in | ios::binary, binary, true); + file_opener(asl_file, asl_filename, std::ios::in | std::ios::binary, binary, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "load_asl_file(): An error was encountered when reading from " << asl_filename << "." << endl; + ss << "load_asl_file(): An error was encountered when reading from " << asl_filename << "." << std::endl; UINT32 stnCount; @@ -77,16 +77,16 @@ UINT32 dna_io_asl::load_asl_file(const string& asl_filename, vASL* vbinary_asl, } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } asl_file.close(); @@ -94,27 +94,27 @@ UINT32 dna_io_asl::load_asl_file(const string& asl_filename, vASL* vbinary_asl, return stnCount; } -void dna_io_asl::write_asl_file(const string& asl_filename, pvASLPtr vbinary_asl) +void dna_io_asl::write_asl_file(const std::string& asl_filename, pvASLPtr vbinary_asl) { std::ofstream asl_file; - stringstream ss; - ss << "write_asl_file(): An error was encountered when opening " << asl_filename << "." << endl; + std::stringstream ss; + ss << "write_asl_file(): An error was encountered when opening " << asl_filename << "." << std::endl; try { // create binary asl file. Throws runtime_error on failure. file_opener(asl_file, asl_filename, - ios::out | ios::binary, binary); + std::ios::out | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "write_asl_file(): An error was encountered when writing to " << asl_filename << "." << endl; + ss << "write_asl_file(): An error was encountered when writing to " << asl_filename << "." << std::endl; // Calculate number of station records and write to binary file UINT32 aslCount = static_cast(vbinary_asl->size()); @@ -130,16 +130,16 @@ void dna_io_asl::write_asl_file(const string& asl_filename, pvASLPtr vbinary_asl if (_it_asl->get()) asl_file << _it_asl->get(); // see dnastation.hpp (region CAStationList stream handlers) } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } asl_file.close(); @@ -147,37 +147,37 @@ void dna_io_asl::write_asl_file(const string& asl_filename, pvASLPtr vbinary_asl // prints ASL entries sorted according to measurement count, which is useful when determining // the starting station to begin network segmentation. -void dna_io_asl::write_asl_file_txt(const string& asl_filename, pvASLPtr vbinary_asl, vdnaStnPtr* vStations) +void dna_io_asl::write_asl_file_txt(const std::string& asl_filename, pvASLPtr vbinary_asl, vdnaStnPtr* vStations) { std::ofstream asl_file; - stringstream ss; - ss << "write_asl_file_txt(): An error was encountered when opening " << asl_filename << "." << endl; + std::stringstream ss; + ss << "write_asl_file_txt(): An error was encountered when opening " << asl_filename << "." << std::endl; try { // create binary asl file. Throws runtime_error on failure. file_opener(asl_file, asl_filename); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "write_asl_file_txt(): An error was encountered when writing to " << asl_filename << "." << endl; + ss << "write_asl_file_txt(): An error was encountered when writing to " << asl_filename << "." << std::endl; // Calculate number of station records and write to binary file size_t aslCount = vbinary_asl->size(); // Pump to text file - stringstream ss_asl; + std::stringstream ss_asl; ss_asl << aslCount << " stations"; - asl_file << left << setw(STATION) << ss_asl.str(); - asl_file << setw(HEADER_20) << right << "No. connected msrs"; - asl_file << setw(STATION) << right << "AML index"; - asl_file << setw(STATION) << right << "Unused?" << endl; + asl_file << std::left << std::setw(STATION) << ss_asl.str(); + asl_file << std::setw(HEADER_20) << std::right << "No. connected msrs"; + asl_file << std::setw(STATION) << std::right << "AML index"; + asl_file << std::setw(STATION) << std::right << "Unused?" << std::endl; // Create an incrementing list and sort on number of measurements to each station vUINT32 aslPtrs(vbinary_asl->size()); @@ -185,7 +185,7 @@ void dna_io_asl::write_asl_file_txt(const string& asl_filename, pvASLPtr vbinary // Sort on measurement count CompareMeasCount2 msrcountCompareFunc(vbinary_asl); - sort(aslPtrs.begin(), aslPtrs.end(), msrcountCompareFunc); + std::sort(aslPtrs.begin(), aslPtrs.end(), msrcountCompareFunc); vbinary_asl->at(0).get()->GetAMLStnIndex(); @@ -202,28 +202,28 @@ void dna_io_asl::write_asl_file_txt(const string& asl_filename, pvASLPtr vbinary _it_pasl = vbinary_asl->begin() + *_it_asl; // Name and measurement count - asl_file << setw(STATION) << left << + asl_file << std::setw(STATION) << std::left << vStations->at(*_it_asl)->GetName() << - setw(HEADER_20) << right << _it_pasl->get()->GetAssocMsrCount(); + std::setw(HEADER_20) << std::right << _it_pasl->get()->GetAssocMsrCount(); // Aml station index if (_it_pasl->get()->GetAssocMsrCount() == 0) - asl_file << setw(STATION) << "-"; + asl_file << std::setw(STATION) << "-"; else - asl_file << setw(STATION) << right << _it_pasl->get()->GetAMLStnIndex(); + asl_file << std::setw(STATION) << std::right << _it_pasl->get()->GetAMLStnIndex(); // Valid station? - asl_file << setw(STATION) << right << (_it_pasl->get()->IsValid() ? " " : "*") << endl; + asl_file << std::setw(STATION) << std::right << (_it_pasl->get()->IsValid() ? " " : "*") << std::endl; } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } asl_file.close(); diff --git a/dynadjust/include/io/dnaioasl.hpp b/dynadjust/include/io/dnaioasl.hpp index 72327167..d288bf9d 100644 --- a/dynadjust/include/io/dnaioasl.hpp +++ b/dynadjust/include/io/dnaioasl.hpp @@ -47,9 +47,9 @@ class dna_io_asl : public dna_io_base dna_io_asl& operator=(const dna_io_asl& rhs); - UINT32 load_asl_file(const string& asl_filename, vASL* vbinary_asl, vUINT32* vfree_stn); - void write_asl_file(const string& asl_filename, pvASLPtr vbinary_asl); - void write_asl_file_txt(const string& asl_filename, pvASLPtr vbinary_asl, vdnaStnPtr* vStations); + UINT32 load_asl_file(const std::string& asl_filename, vASL* vbinary_asl, vUINT32* vfree_stn); + void write_asl_file(const std::string& asl_filename, pvASLPtr vbinary_asl); + void write_asl_file_txt(const std::string& asl_filename, pvASLPtr vbinary_asl, vdnaStnPtr* vStations); protected: diff --git a/dynadjust/include/io/dnaiobase.cpp b/dynadjust/include/io/dnaiobase.cpp index c2f4fec2..a47fd6d4 100644 --- a/dynadjust/include/io/dnaiobase.cpp +++ b/dynadjust/include/io/dnaiobase.cpp @@ -25,15 +25,13 @@ #include #include -using namespace boost::gregorian; - namespace dynadjust { namespace iostreams { dna_io_base::dna_io_base(void) : m_strVersion(__FILE_VERSION__) , m_strDate("") - , m_strApp("DNA" + string(__SHORT_VERSION__)) + , m_strApp("DNA" + std::string(__SHORT_VERSION__)) { } @@ -170,9 +168,9 @@ void dna_io_base::writeDate(std::ofstream& file_stream) char dateField[identifier_field_width+1]; // Form date string - date today(day_clock::local_day()); - stringstream date_string; - date_string << right << to_iso_extended_string(today); + boost::gregorian::date today(boost::gregorian::day_clock::local_day()); + std::stringstream date_string; + date_string << std::right << to_iso_extended_string(today); m_strDate = date_string.str(); // write creation date field name diff --git a/dynadjust/include/io/dnaiobase.hpp b/dynadjust/include/io/dnaiobase.hpp index dd90662a..e8aa9b16 100644 --- a/dynadjust/include/io/dnaiobase.hpp +++ b/dynadjust/include/io/dnaiobase.hpp @@ -36,8 +36,6 @@ #define __FILE_VERSION__ "1.0" -using namespace std; - namespace dynadjust { namespace iostreams { @@ -69,8 +67,8 @@ class dna_io_base dna_io_base& operator=(const dna_io_base& rhs); - inline string getVersion() const { return m_strVersion; } - inline void setVersion(const string& version) { m_strVersion = version; } + inline std::string getVersion() const { return m_strVersion; } + inline void setVersion(const std::string& version) { m_strVersion = version; } void writeFileInfo(std::ofstream& file_stream); void readFileInfo(std::ifstream& file_stream); @@ -87,9 +85,9 @@ class dna_io_base void writeApp(std::ofstream& file_stream); void readApp(std::ifstream& file_stream); - string m_strVersion; - string m_strDate; - string m_strApp; + std::string m_strVersion; + std::string m_strDate; + std::string m_strApp; }; } // namespace measurements diff --git a/dynadjust/include/io/dnaiobms.cpp b/dynadjust/include/io/dnaiobms.cpp index a541e02b..f9e1f6ac 100644 --- a/dynadjust/include/io/dnaiobms.cpp +++ b/dynadjust/include/io/dnaiobms.cpp @@ -29,9 +29,9 @@ namespace iostreams { UINT16 dna_io_bms::create_msr_input_file_meta(vifm_t& vinput_file_meta, input_file_meta_t** input_file_meta) { UINT16 msr_file_count(0); - stringstream ss; - ss << "create_msr_input_file_meta(): An error was encountered when creating " << endl << - " the binary measurement file metadata." << endl; + std::stringstream ss; + ss << "create_msr_input_file_meta(): An error was encountered when creating " << std::endl << + " the binary measurement file metadata." << std::endl; // Determine how many measurement files were supplied try { @@ -58,32 +58,32 @@ UINT16 dna_io_bms::create_msr_input_file_meta(vifm_t& vinput_file_meta, input_fi } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } return msr_file_count; } -void dna_io_bms::load_bms_file_meta(const string& bms_filename, binary_file_meta_t& bms_meta) +void dna_io_bms::load_bms_file_meta(const std::string& bms_filename, binary_file_meta_t& bms_meta) { std::ifstream bms_file; - stringstream ss; - ss << "load_bms_file(): An error was encountered when opening " << bms_filename << "." << endl; + std::stringstream ss; + ss << "load_bms_file(): An error was encountered when opening " << bms_filename << "." << std::endl; try { // open binary measurements file. Throws runtime_error on failure. - file_opener(bms_file, bms_filename, ios::in | ios::binary, binary, true); + file_opener(bms_file, bms_filename, std::ios::in | std::ios::binary, binary, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "load_bms_file(): An error was encountered when reading from " << bms_filename << "." << endl; + ss << "load_bms_file(): An error was encountered when reading from " << bms_filename << "." << std::endl; try { // read the file information @@ -92,44 +92,44 @@ void dna_io_bms::load_bms_file_meta(const string& bms_filename, binary_file_meta // read the metadata readFileMetadata(bms_file, bms_meta); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } bms_file.close(); } -UINT32 dna_io_bms::load_bms_file(const string& bms_filename, pvmsr_t vbinary_msr, binary_file_meta_t& bms_meta) +UINT32 dna_io_bms::load_bms_file(const std::string& bms_filename, pvmsr_t vbinary_msr, binary_file_meta_t& bms_meta) { std::ifstream bms_file; - stringstream ss; - ss << "load_bms_file(): An error was encountered when opening " << bms_filename << "." << endl; + std::stringstream ss; + ss << "load_bms_file(): An error was encountered when opening " << bms_filename << "." << std::endl; try { // open binary measurements file. Throws runtime_error on failure. - file_opener(bms_file, bms_filename, ios::in | ios::binary, binary, true); + file_opener(bms_file, bms_filename, std::ios::in | std::ios::binary, binary, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } measurement_t measRecord; UINT32 msr; ss.str(""); - ss << "load_bms_file(): An error was encountered when reading from " << bms_filename << "." << endl; + ss << "load_bms_file(): An error was encountered when reading from " << bms_filename << "." << std::endl; try { // read the file information @@ -146,16 +146,16 @@ UINT32 dna_io_bms::load_bms_file(const string& bms_filename, pvmsr_t vbinary_msr vbinary_msr->push_back(measRecord); } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } bms_file.close(); @@ -163,27 +163,27 @@ UINT32 dna_io_bms::load_bms_file(const string& bms_filename, pvmsr_t vbinary_msr return bms_meta.binCount; } -void dna_io_bms::write_bms_file(const string& bms_filename, pvmsr_t vbinary_msr, binary_file_meta_t& bms_meta) +void dna_io_bms::write_bms_file(const std::string& bms_filename, pvmsr_t vbinary_msr, binary_file_meta_t& bms_meta) { std::ofstream bms_file; - stringstream ss; - ss << "write_bms_file(): An error was encountered when opening " << bms_filename << "." << endl; + std::stringstream ss; + ss << "write_bms_file(): An error was encountered when opening " << bms_filename << "." << std::endl; try { // open binary measurements file. Throws runtime_error on failure. file_opener(bms_file, bms_filename, - ios::out | ios::binary, binary); + std::ios::out | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "write_bms_file(): An error was encountered when writing to " << bms_filename << "." << endl; + ss << "write_bms_file(): An error was encountered when writing to " << bms_filename << "." << std::endl; try { // write the file information @@ -197,42 +197,42 @@ void dna_io_bms::write_bms_file(const string& bms_filename, pvmsr_t vbinary_msr, for (_it_msr=vbinary_msr->begin(); _it_msr!=vbinary_msr->end(); ++_it_msr) bms_file.write(reinterpret_cast(&(*_it_msr)), sizeof(measurement_t)); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } bms_file.close(); } -void dna_io_bms::write_bms_file(const string& bms_filename, vdnaMsrPtr* vMeasurements, binary_file_meta_t& bms_meta) +void dna_io_bms::write_bms_file(const std::string& bms_filename, vdnaMsrPtr* vMeasurements, binary_file_meta_t& bms_meta) { std::ofstream bms_file; - stringstream ss; - ss << "write_bms_file(): An error was encountered when opening " << bms_filename << "." << endl; + std::stringstream ss; + ss << "write_bms_file(): An error was encountered when opening " << bms_filename << "." << std::endl; try { // open binary measurements file. Throws runtime_error on failure. file_opener(bms_file, bms_filename, - ios::out | ios::binary, binary); + std::ios::out | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "write_bms_file(): An error was encountered when writing to " << bms_filename << "." << endl; + ss << "write_bms_file(): An error was encountered when writing to " << bms_filename << "." << std::endl; _it_vdnamsrptr _it_msr; UINT32 msrIndex(0); @@ -248,16 +248,16 @@ void dna_io_bms::write_bms_file(const string& bms_filename, vdnaMsrPtr* vMeasure for (_it_msr=vMeasurements->begin(); _it_msr!=vMeasurements->end(); ++_it_msr) _it_msr->get()->WriteBinaryMsr(&bms_file, &msrIndex); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } bms_file.close(); diff --git a/dynadjust/include/io/dnaiobms.hpp b/dynadjust/include/io/dnaiobms.hpp index 61f10728..8f7d4192 100644 --- a/dynadjust/include/io/dnaiobms.hpp +++ b/dynadjust/include/io/dnaiobms.hpp @@ -48,10 +48,10 @@ class dna_io_bms : public dna_io_base dna_io_bms& operator=(const dna_io_bms& rhs); UINT16 create_msr_input_file_meta(vifm_t& vinput_file_meta, input_file_meta_t** input_file_meta); - void load_bms_file_meta(const string& bms_filename, binary_file_meta_t& bms_meta); - UINT32 load_bms_file(const string& bms_filename, pvmsr_t vbinary_msr, binary_file_meta_t& bms_meta); - void write_bms_file(const string& bms_filename, pvmsr_t vbinary_msr, binary_file_meta_t& bms_meta); - void write_bms_file(const string& bms_filename, vdnaMsrPtr* vMeasurements, binary_file_meta_t& bms_meta); + void load_bms_file_meta(const std::string& bms_filename, binary_file_meta_t& bms_meta); + UINT32 load_bms_file(const std::string& bms_filename, pvmsr_t vbinary_msr, binary_file_meta_t& bms_meta); + void write_bms_file(const std::string& bms_filename, pvmsr_t vbinary_msr, binary_file_meta_t& bms_meta); + void write_bms_file(const std::string& bms_filename, vdnaMsrPtr* vMeasurements, binary_file_meta_t& bms_meta); protected: diff --git a/dynadjust/include/io/dnaiobst.cpp b/dynadjust/include/io/dnaiobst.cpp index 731f409b..f3132259 100644 --- a/dynadjust/include/io/dnaiobst.cpp +++ b/dynadjust/include/io/dnaiobst.cpp @@ -29,9 +29,9 @@ namespace iostreams { UINT16 dna_io_bst::create_stn_input_file_meta(vifm_t& vinput_file_meta, input_file_meta_t** input_file_meta) { UINT16 stn_file_count(0); - stringstream ss; - ss << "create_stn_input_file_meta(): An error was encountered when creating " << endl << - " the binary station file metadata." << endl; + std::stringstream ss; + ss << "create_stn_input_file_meta(): An error was encountered when creating " << std::endl << + " the binary station file metadata." << std::endl; // Determine how many station files were supplied try { @@ -58,32 +58,32 @@ UINT16 dna_io_bst::create_stn_input_file_meta(vifm_t& vinput_file_meta, input_fi } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } return stn_file_count; } -void dna_io_bst::load_bst_file_meta(const string& bst_filename, binary_file_meta_t& bst_meta) +void dna_io_bst::load_bst_file_meta(const std::string& bst_filename, binary_file_meta_t& bst_meta) { std::ifstream bst_file; - stringstream ss; - ss << "load_bst_file(): An error was encountered when opening " << bst_filename << "." << endl; + std::stringstream ss; + ss << "load_bst_file(): An error was encountered when opening " << bst_filename << "." << std::endl; try { // open binary stations file. Throws runtime_error on failure. - file_opener(bst_file, bst_filename, ios::in | ios::binary, binary, true); + file_opener(bst_file, bst_filename, std::ios::in | std::ios::binary, binary, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "load_bst_file(): An error was encountered when reading from " << bst_filename << "." << endl; + ss << "load_bst_file(): An error was encountered when reading from " << bst_filename << "." << std::endl; try { // read the file information @@ -92,45 +92,45 @@ void dna_io_bst::load_bst_file_meta(const string& bst_filename, binary_file_meta // read the metadata readFileMetadata(bst_file, bst_meta); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } bst_file.close(); } -UINT32 dna_io_bst::load_bst_file(const string& bst_filename, pvstn_t vbinary_stn, binary_file_meta_t& bst_meta) +UINT32 dna_io_bst::load_bst_file(const std::string& bst_filename, pvstn_t vbinary_stn, binary_file_meta_t& bst_meta) { std::ifstream bst_file; - stringstream ss; - ss << "load_bst_file(): An error was encountered when opening " << bst_filename << "." << endl; + std::stringstream ss; + ss << "load_bst_file(): An error was encountered when opening " << bst_filename << "." << std::endl; try { // open binary stations file. Throws runtime_error on failure. - file_opener(bst_file, bst_filename, ios::in | ios::binary, binary, true); + file_opener(bst_file, bst_filename, std::ios::in | std::ios::binary, binary, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } station_t stationRecord; UINT32 stn; ss.str(""); - ss << "load_bst_file(): An error was encountered when reading from " << bst_filename << "." << endl; + ss << "load_bst_file(): An error was encountered when reading from " << bst_filename << "." << std::endl; try { // read the file information @@ -147,16 +147,16 @@ UINT32 dna_io_bst::load_bst_file(const string& bst_filename, pvstn_t vbinary_stn vbinary_stn->push_back(stationRecord); } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } bst_file.close(); @@ -164,27 +164,27 @@ UINT32 dna_io_bst::load_bst_file(const string& bst_filename, pvstn_t vbinary_stn return bst_meta.binCount; } -void dna_io_bst::write_bst_file(const string& bst_filename, pvstn_t vbinary_stn, binary_file_meta_t& bst_meta) +void dna_io_bst::write_bst_file(const std::string& bst_filename, pvstn_t vbinary_stn, binary_file_meta_t& bst_meta) { std::ofstream bst_file; - stringstream ss; - ss << "write_bst_file(): An error was encountered when opening " << bst_filename << "." << endl; + std::stringstream ss; + ss << "write_bst_file(): An error was encountered when opening " << bst_filename << "." << std::endl; try { // open binary stations file. Throws runtime_error on failure. file_opener(bst_file, bst_filename, - ios::out | ios::binary, binary); + std::ios::out | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "write_bst_file(): An error was encountered when writing to " << bst_filename << "." << endl; + ss << "write_bst_file(): An error was encountered when writing to " << bst_filename << "." << std::endl; try { // write version @@ -198,42 +198,42 @@ void dna_io_bst::write_bst_file(const string& bst_filename, pvstn_t vbinary_stn, for (; _it_stn!=vbinary_stn->end(); ++_it_stn) bst_file.write(reinterpret_cast(&(*_it_stn)), sizeof(station_t)); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } bst_file.close(); } -bool dna_io_bst::write_bst_file(const string& bst_filename, vdnaStnPtr* vStations, pvstring vUnusedStns, binary_file_meta_t& bst_meta, bool flagUnused) +bool dna_io_bst::write_bst_file(const std::string& bst_filename, vdnaStnPtr* vStations, pvstring vUnusedStns, binary_file_meta_t& bst_meta, bool flagUnused) { std::ofstream bst_file; - stringstream ss; - ss << "write_bst_file(): An error was encountered when opening " << bst_filename << "." << endl; + std::stringstream ss; + ss << "write_bst_file(): An error was encountered when opening " << bst_filename << "." << std::endl; try { // open binary stations file. Throws runtime_error on failure. file_opener(bst_file, bst_filename, - ios::out | ios::binary, binary); + std::ios::out | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "write_bst_file(): An error was encountered when writing to " << bst_filename << "." << endl; + ss << "write_bst_file(): An error was encountered when writing to " << bst_filename << "." << std::endl; _it_vdnastnptr _it_stn; @@ -247,7 +247,7 @@ bool dna_io_bst::write_bst_file(const string& bst_filename, vdnaStnPtr* vStation // write the bst data if (flagUnused) { - sort(vUnusedStns->begin(), vUnusedStns->end()); + std::sort(vUnusedStns->begin(), vUnusedStns->end()); for (_it_stn=vStations->begin(); _it_stn!=vStations->end(); _it_stn++) { if (binary_search(vUnusedStns->begin(), vUnusedStns->end(), _it_stn->get()->GetName())) @@ -263,16 +263,16 @@ bool dna_io_bst::write_bst_file(const string& bst_filename, vdnaStnPtr* vStation for (_it_stn=vStations->begin(); _it_stn!=vStations->end(); _it_stn++) _it_stn->get()->WriteBinaryStn(&bst_file); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } bst_file.close(); diff --git a/dynadjust/include/io/dnaiobst.hpp b/dynadjust/include/io/dnaiobst.hpp index b9146f05..7b844c5a 100644 --- a/dynadjust/include/io/dnaiobst.hpp +++ b/dynadjust/include/io/dnaiobst.hpp @@ -48,10 +48,10 @@ class dna_io_bst : public dna_io_base dna_io_bst& operator=(const dna_io_bst& rhs); UINT16 create_stn_input_file_meta(vifm_t& vinput_file_meta, input_file_meta_t** input_file_meta); - void load_bst_file_meta(const string& bst_filename, binary_file_meta_t& bst_meta); - UINT32 load_bst_file(const string& bst_filename, pvstn_t vbinary_stn, binary_file_meta_t& bst_meta); - void write_bst_file(const string& bst_filename, pvstn_t vbinary_stn, binary_file_meta_t& bst_meta); - bool write_bst_file(const string& bst_filename, vdnaStnPtr* vStations, pvstring vUnusedStns, binary_file_meta_t& bst_meta, bool flagUnused); + void load_bst_file_meta(const std::string& bst_filename, binary_file_meta_t& bst_meta); + UINT32 load_bst_file(const std::string& bst_filename, pvstn_t vbinary_stn, binary_file_meta_t& bst_meta); + void write_bst_file(const std::string& bst_filename, pvstn_t vbinary_stn, binary_file_meta_t& bst_meta); + bool write_bst_file(const std::string& bst_filename, vdnaStnPtr* vStations, pvstring vUnusedStns, binary_file_meta_t& bst_meta, bool flagUnused); protected: diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index e5bc8ed4..ad42a57f 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -31,9 +31,9 @@ namespace dynadjust { namespace iostreams { void dna_io_dna::write_dna_files(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, - const string& stnfilename, const string& msrfilename, const string& networkname, + const std::string& stnfilename, const std::string& msrfilename, const std::string& networkname, const CDnaDatum& datum, const CDnaProjection& projection, bool flagUnused, - const string& stn_comment, const string& msr_comment) + const std::string& stn_comment, const std::string& msr_comment) { write_stn_file(vStations, stnfilename, networkname, datum, projection, flagUnused, stn_comment); @@ -41,21 +41,21 @@ void dna_io_dna::write_dna_files(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurement } void dna_io_dna::write_dna_files(pvstn_t vbinary_stn, pvmsr_t vbinary_msr, - const string& stnfilename, const string& msrfilename, const string& networkname, + const std::string& stnfilename, const std::string& msrfilename, const std::string& networkname, const CDnaDatum& datum, const CDnaProjection& projection, bool flagUnused, - const string& stn_comment, const string& msr_comment) + const std::string& stn_comment, const std::string& msr_comment) { write_stn_file(vbinary_stn, stnfilename, networkname, datum, projection, flagUnused, stn_comment); write_msr_file(*vbinary_stn, vbinary_msr, msrfilename, networkname, datum, msr_comment); } -void dna_io_dna::create_file_stn(std::ofstream* ptr, const string& filename) +void dna_io_dna::create_file_stn(std::ofstream* ptr, const std::string& filename) { determineDNASTNFieldParameters("3.01", dsl_, dsw_); create_file_pointer(ptr, filename); } -void dna_io_dna::create_file_msr(std::ofstream* ptr, const string& filename) +void dna_io_dna::create_file_msr(std::ofstream* ptr, const std::string& filename) { determineDNAMSRFieldParameters("3.01", dml_, dmw_); create_file_pointer(ptr, filename); @@ -69,30 +69,30 @@ void dna_io_dna::prepare_sort_list(const UINT32 count) initialiseIncrementingIntegerVector(vStationList_, count); } -void dna_io_dna::create_file_pointer(std::ofstream* ptr, const string& filename) +void dna_io_dna::create_file_pointer(std::ofstream* ptr, const std::string& filename) { try { // Create file pointer to DNA file. file_opener(*ptr, filename); } - catch (const runtime_error& e) { - throw boost::enable_current_exception(runtime_error(e.what())); + catch (const std::runtime_error& e) { + throw boost::enable_current_exception(std::runtime_error(e.what())); } } -void dna_io_dna::open_file_pointer(std::ifstream* ptr, const string& filename) +void dna_io_dna::open_file_pointer(std::ifstream* ptr, const std::string& filename) { try { // Open DNA file. - file_opener(*ptr, filename, ios::in, ascii, true); + file_opener(*ptr, filename, std::ios::in, ascii, true); } - catch (const runtime_error& e) { - throw boost::enable_current_exception(runtime_error(e.what())); + catch (const std::runtime_error& e) { + throw boost::enable_current_exception(std::runtime_error(e.what())); } } -void dna_io_dna::write_stn_header_data(std::ofstream* ptr, const string& networkname, const string& datum, - const string& epoch, const size_t& count, const string& comment) +void dna_io_dna::write_stn_header_data(std::ofstream* ptr, const std::string& networkname, const std::string& datum, + const std::string& epoch, const size_t& count, const std::string& comment) { // Write version line dna_header(*ptr, "3.01", "STN", datum, epoch, count); @@ -105,8 +105,8 @@ void dna_io_dna::write_stn_header_data(std::ofstream* ptr, const string& network dna_comment(*ptr, comment); } -void dna_io_dna::write_stn_header(std::ofstream* ptr, vdnaStnPtr* vStations, const string& networkname, - const CDnaDatum& datum, bool flagUnused, const string& comment) +void dna_io_dna::write_stn_header(std::ofstream* ptr, vdnaStnPtr* vStations, const std::string& networkname, + const CDnaDatum& datum, bool flagUnused, const std::string& comment) { // print stations // Has the user specified --flag-unused-stations, in which case, do not @@ -128,8 +128,8 @@ void dna_io_dna::write_stn_header(std::ofstream* ptr, vdnaStnPtr* vStations, con } -void dna_io_dna::write_stn_header(std::ofstream* ptr, pvstn_t vbinary_stn, const string& networkname, - const CDnaDatum& datum, bool flagUnused, const string& comment) +void dna_io_dna::write_stn_header(std::ofstream* ptr, pvstn_t vbinary_stn, const std::string& networkname, + const CDnaDatum& datum, bool flagUnused, const std::string& comment) { // print stations // Has the user specified --flag-unused-stations, in which case, do not @@ -151,17 +151,17 @@ void dna_io_dna::write_stn_header(std::ofstream* ptr, pvstn_t vbinary_stn, const } -void dna_io_dna::read_ren_file(const string& filename, pv_string_vstring_pair stnRenaming) +void dna_io_dna::read_ren_file(const std::string& filename, pv_string_vstring_pair stnRenaming) { std::ifstream renaming_file; // create file pointer open_file_pointer(&renaming_file, filename); - string version; + std::string version; INPUT_DATA_TYPE idt; CDnaDatum datum; - string geoidVersion, fileEpsg, fileEpoch; + std::string geoidVersion, fileEpsg, fileEpoch; UINT32 count(0); // read header information @@ -174,7 +174,7 @@ void dna_io_dna::read_ren_file(const string& filename, pv_string_vstring_pair st void dna_io_dna::read_ren_data(std::ifstream* ptr, pv_string_vstring_pair stnRenaming) { - string sBuf; + std::string sBuf; string_vstring_pair stnNames; vstring altStnNames; @@ -187,9 +187,9 @@ void dna_io_dna::read_ren_data(std::ifstream* ptr, pv_string_vstring_pair stnRen catch (...) { if (ptr->eof()) return; - stringstream ss; - ss << "read_ren_data(): Could not read from the renaming file." << endl; - boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "read_ren_data(): Could not read from the renaming file." << std::endl; + boost::enable_current_exception(std::runtime_error(ss.str())); } // blank or whitespace? @@ -204,7 +204,7 @@ void dna_io_dna::read_ren_data(std::ifstream* ptr, pv_string_vstring_pair stnRen if (sBuf.compare(0, 1, "*") == 0) continue; - string tmp; + std::string tmp; // Add the preferred name try { @@ -212,10 +212,10 @@ void dna_io_dna::read_ren_data(std::ifstream* ptr, pv_string_vstring_pair stnRen stnNames.first = tmp; } catch (...) { - stringstream ss; + std::stringstream ss; ss << "read_ren_data(): Could not extract station name from the record: " << - endl << " " << sBuf << endl; - boost::enable_current_exception(runtime_error(ss.str())); + std::endl << " " << sBuf << std::endl; + boost::enable_current_exception(std::runtime_error(ss.str())); } // Alternative names @@ -237,7 +237,7 @@ void dna_io_dna::read_ren_data(std::ifstream* ptr, pv_string_vstring_pair stnRen } // sort for faster searching - sort(altStnNames.begin(), altStnNames.end()); + std::sort(altStnNames.begin(), altStnNames.end()); // Add the alternate names stnNames.second = altStnNames; @@ -248,11 +248,11 @@ void dna_io_dna::read_ren_data(std::ifstream* ptr, pv_string_vstring_pair stnRen } -void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA_TYPE& idt, +void dna_io_dna::read_dna_header(std::ifstream* ptr, std::string& version, INPUT_DATA_TYPE& idt, CDnaDatum& referenceframe, bool user_supplied_frame, - string& fileEpsg, string& fileEpoch, string& geoidversion, UINT32& count) + std::string& fileEpsg, std::string& fileEpoch, std::string& geoidversion, UINT32& count) { - string sBuf; + std::string sBuf; getline((*ptr), sBuf); sBuf = trimstr(sBuf); m_filespecifiedReferenceFrame_ = false; @@ -262,11 +262,11 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA // Attempt to get the file's version try { - if (iequals("!#=DNA", sBuf.substr(0, 6))) + if (boost::iequals("!#=DNA", sBuf.substr(0, 6))) version = trimstr(sBuf.substr(6, 6)); } - catch (const runtime_error& e) { - throw boost::enable_current_exception(runtime_error(e.what())); + catch (const std::runtime_error& e) { + throw boost::enable_current_exception(std::runtime_error(e.what())); } // Attempt to get the file's type @@ -274,51 +274,51 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA determineDNASTNFieldParameters(version, dsl_, dsw_); determineDNAMSRFieldParameters(version, dml_, dmw_); } - catch (const runtime_error& e) { - stringstream ssError; - ssError << "- Error: Unable to determine DNA file version." << endl << - sBuf << endl << " " << e.what() << endl; - throw boost::enable_current_exception(runtime_error(ssError.str())); + catch (const std::runtime_error& e) { + std::stringstream ssError; + ssError << "- Error: Unable to determine DNA file version." << std::endl << + sBuf << std::endl << " " << e.what() << std::endl; + throw boost::enable_current_exception(std::runtime_error(ssError.str())); } // Version 1 - if (iequals(version, "1.00")) + if (boost::iequals(version, "1.00")) { idt = unknown; // could be stn or msr count = 100; // set default 100 stations return; } - string type; + std::string type; // Attempt to get the file's type try { type = trimstr(sBuf.substr(12, 3)); } - catch (const runtime_error& e) { - stringstream ssError; - ssError << "- Error: File type has not been provided in the header" << endl << - sBuf << endl << e.what() << endl; - throw boost::enable_current_exception(runtime_error(ssError.str())); + catch (const std::runtime_error& e) { + std::stringstream ssError; + ssError << "- Error: File type has not been provided in the header" << std::endl << + sBuf << std::endl << e.what() << std::endl; + throw boost::enable_current_exception(std::runtime_error(ssError.str())); } // Station file - if (iequals(type, "stn")) + if (boost::iequals(type, "stn")) idt = stn_data; // Measurement file - else if (iequals(type, "msr")) + else if (boost::iequals(type, "msr")) idt = msr_data; // Geoid information file - else if (iequals(type, "geo")) + else if (boost::iequals(type, "geo")) idt = geo_data; // Station renaming - else if (iequals(type, "ren")) + else if (boost::iequals(type, "ren")) idt = ren_data; else { idt = unknown; - stringstream ssError; - ssError << "The supplied filetype '" << type << "' is not recognised" << endl; - throw boost::enable_current_exception(runtime_error(ssError.str())); + std::stringstream ssError; + ssError << "The supplied filetype '" << type << "' is not recognised" << std::endl; + throw boost::enable_current_exception(std::runtime_error(ssError.str())); } if (sBuf.length() < 29) @@ -327,7 +327,7 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA return; } - string file_referenceframe; + std::string file_referenceframe; // Attempt to get the default reference frame try { if (sBuf.length() > 42) @@ -345,7 +345,7 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA if (!file_referenceframe.empty()) m_filespecifiedReferenceFrame_ = true; - string epoch_version; + std::string epoch_version; // Attempt to get the default epoch / geoid version try { if (sBuf.length() > 56) @@ -375,7 +375,7 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA // Empty? Get the epsg code from the project datum fileEpsg = referenceframe.GetEpsgCode_s(); else - fileEpsg = epsgStringFromName(file_referenceframe); + fileEpsg = epsgStringFromName(file_referenceframe); // capture file epoch if (epoch_version.empty()) @@ -386,7 +386,7 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA fileEpoch = referenceframe.GetEpoch_s(); else // take from file's epsg's epoch - fileEpoch = referenceepochFromEpsgString(fileEpsg); + fileEpoch = referenceepochFromEpsgString(fileEpsg); } else fileEpoch = epoch_version; @@ -399,19 +399,19 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA break; } } - catch (const runtime_error& e) { - stringstream ssError; - ssError << "The supplied frame is not recognised" << endl << - e.what() << endl; - throw boost::enable_current_exception(runtime_error(ssError.str())); + catch (const std::runtime_error& e) { + std::stringstream ssError; + ssError << "The supplied frame is not recognised" << std::endl << + e.what() << std::endl; + throw boost::enable_current_exception(std::runtime_error(ssError.str())); } // Attempt to get the data count try { if (sBuf.length() > 66) - count = val_uint(trimstr(sBuf.substr(57, 10))); + count = val_uint(trimstr(sBuf.substr(57, 10))); else if (sBuf.length() > 57) - count = val_uint(trimstr(sBuf.substr(57))); + count = val_uint(trimstr(sBuf.substr(57))); else count = 100; } @@ -421,9 +421,9 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA } -void dna_io_dna::write_stn_file(pvstn_t vbinary_stn, const string& stnfilename, const string& networkname, +void dna_io_dna::write_stn_file(pvstn_t vbinary_stn, const std::string& stnfilename, const std::string& networkname, const CDnaDatum& datum, const CDnaProjection& projection, bool flagUnused, - const string& comment) + const std::string& comment) { // Print DNA stations from a vector of stn_t std::ofstream dna_stn_file; @@ -438,7 +438,7 @@ void dna_io_dna::write_stn_file(pvstn_t vbinary_stn, const string& stnfilename, // Sort on original file order prepare_sort_list(static_cast(vbinary_stn->size())); CompareStnFileOrder stnorderCompareFunc(vbinary_stn); - sort(vStationList_.begin(), vStationList_.end(), stnorderCompareFunc); + std::sort(vStationList_.begin(), vStationList_.end(), stnorderCompareFunc); dnaStnPtr stnPtr(new CDnaStation(datum.GetName(), datum.GetEpoch_s())); @@ -473,14 +473,14 @@ void dna_io_dna::write_stn_file(pvstn_t vbinary_stn, const string& stnfilename, } catch (const std::ifstream::failure& f) { - throw boost::enable_current_exception(runtime_error(f.what())); + throw boost::enable_current_exception(std::runtime_error(f.what())); } } -void dna_io_dna::write_stn_file(vdnaStnPtr* vStations, const string& stnfilename, const string& networkname, +void dna_io_dna::write_stn_file(vdnaStnPtr* vStations, const std::string& stnfilename, const std::string& networkname, const CDnaDatum& datum, const CDnaProjection& projection, bool flagUnused, - const string& comment) + const std::string& comment) { // Print DNA stations from a vector of dnaStnPtr std::ofstream dna_stn_file; @@ -493,7 +493,7 @@ void dna_io_dna::write_stn_file(vdnaStnPtr* vStations, const string& stnfilename write_stn_header(&dna_stn_file, vStations, networkname, datum, flagUnused, comment); // Sort on original file order - sort(vStations->begin(), vStations->end(), CompareStnFileOrder_CDnaStn()); + std::sort(vStations->begin(), vStations->end(), CompareStnFileOrder_CDnaStn()); // print stations // Has the user specified --flag-unused-stations, in wich case, do not @@ -522,12 +522,12 @@ void dna_io_dna::write_stn_file(vdnaStnPtr* vStations, const string& stnfilename } catch (const std::ifstream::failure& f) { - throw boost::enable_current_exception(runtime_error(f.what())); + throw boost::enable_current_exception(std::runtime_error(f.what())); } } -void dna_io_dna::write_msr_header_data(std::ofstream* ptr, const string& networkname, const string& datum, - const string& epoch, const size_t& count, const string& comment) +void dna_io_dna::write_msr_header_data(std::ofstream* ptr, const std::string& networkname, const std::string& datum, + const std::string& epoch, const size_t& count, const std::string& comment) { // Write version line dna_header(*ptr, "3.01", "MSR", datum, epoch, count); @@ -542,24 +542,24 @@ void dna_io_dna::write_msr_header_data(std::ofstream* ptr, const string& network } -void dna_io_dna::write_msr_header(std::ofstream* ptr, vdnaMsrPtr* vMeasurements, const string& networkname, - const CDnaDatum& datum, const string& comment) +void dna_io_dna::write_msr_header(std::ofstream* ptr, vdnaMsrPtr* vMeasurements, const std::string& networkname, + const CDnaDatum& datum, const std::string& comment) { // write header write_msr_header_data(ptr, networkname, datum.GetName(), datum.GetEpoch_s(), vMeasurements->size(), comment); } -void dna_io_dna::write_msr_header(std::ofstream* ptr, pvmsr_t vbinary_msrn, const string& networkname, - const CDnaDatum& datum, const string& comment) +void dna_io_dna::write_msr_header(std::ofstream* ptr, pvmsr_t vbinary_msrn, const std::string& networkname, + const CDnaDatum& datum, const std::string& comment) { // write header write_msr_header_data(ptr, networkname, datum.GetName(), datum.GetEpoch_s(), vbinary_msrn->size(), comment); } -void dna_io_dna::write_msr_file(const vstn_t& vbinary_stn, pvmsr_t vbinary_msr, const string& msrfilename, const string& networkname, - const CDnaDatum& datum, const string& comment) +void dna_io_dna::write_msr_file(const vstn_t& vbinary_stn, pvmsr_t vbinary_msr, const std::string& msrfilename, const std::string& networkname, + const CDnaDatum& datum, const std::string& comment) { // Print DNA measurements @@ -597,12 +597,12 @@ void dna_io_dna::write_msr_file(const vstn_t& vbinary_stn, pvmsr_t vbinary_msr, } catch (const std::ifstream::failure& f) { - throw boost::enable_current_exception(runtime_error(f.what())); + throw boost::enable_current_exception(std::runtime_error(f.what())); } } -void dna_io_dna::write_msr_file(vdnaMsrPtr* vMeasurements, const string& msrfilename, const string& networkname, - const CDnaDatum& datum, const string& comment) +void dna_io_dna::write_msr_file(vdnaMsrPtr* vMeasurements, const std::string& msrfilename, const std::string& networkname, + const CDnaDatum& datum, const std::string& comment) { // Print DNA measurements @@ -635,7 +635,7 @@ void dna_io_dna::write_msr_file(vdnaMsrPtr* vMeasurements, const string& msrfile } catch (const std::ifstream::failure& f) { - throw boost::enable_current_exception(runtime_error(f.what())); + throw boost::enable_current_exception(std::runtime_error(f.what())); } diff --git a/dynadjust/include/io/dnaiodna.hpp b/dynadjust/include/io/dnaiodna.hpp index 3b11301e..d5f694d6 100644 --- a/dynadjust/include/io/dnaiodna.hpp +++ b/dynadjust/include/io/dnaiodna.hpp @@ -61,38 +61,38 @@ class dna_io_dna : public dna_io_base dna_io_dna& operator=(const dna_io_dna& rhs); - void read_ren_file(const string& filename, pv_string_vstring_pair stnRenaming); + void read_ren_file(const std::string& filename, pv_string_vstring_pair stnRenaming); void write_dna_files(vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, - const string& stnfilename, const string& msrfilename, const string& networkname, + const std::string& stnfilename, const std::string& msrfilename, const std::string& networkname, const CDnaDatum& datum, const CDnaProjection& projection, bool flagUnused, - const string& stn_comment, const string& msr_comment); + const std::string& stn_comment, const std::string& msr_comment); void write_dna_files(pvstn_t vbinary_stn, pvmsr_t vbinary_msr, - const string& stnfilename, const string& msrfilename, const string& networkname, + const std::string& stnfilename, const std::string& msrfilename, const std::string& networkname, const CDnaDatum& datum, const CDnaProjection& projection, bool flagUnused, - const string& stn_comment, const string& msr_comment); + const std::string& stn_comment, const std::string& msr_comment); // CDnaStation - void write_stn_file(vdnaStnPtr* vStations, const string& stnfilename, const string& networkname, + void write_stn_file(vdnaStnPtr* vStations, const std::string& stnfilename, const std::string& networkname, const CDnaDatum& datum, const CDnaProjection& projection, bool flagUnused, - const string& comment); + const std::string& comment); // station_t - void write_stn_file(pvstn_t vbinary_stn, const string& stnfilename, const string& networkname, + void write_stn_file(pvstn_t vbinary_stn, const std::string& stnfilename, const std::string& networkname, const CDnaDatum& datum, const CDnaProjection& projection, bool flagUnused, - const string& comment); + const std::string& comment); // CDnaMeasurement - void write_msr_file(vdnaMsrPtr* vMeasurements, const string& msrfilename, const string& networkname, - const CDnaDatum& datum, const string& comment); + void write_msr_file(vdnaMsrPtr* vMeasurements, const std::string& msrfilename, const std::string& networkname, + const CDnaDatum& datum, const std::string& comment); // measurement_t - void write_msr_file(const vstn_t& binaryStn, pvmsr_t vbinary_msr, const string& msrfilename, const string& networkname, - const CDnaDatum& datum, const string& comment); + void write_msr_file(const vstn_t& binaryStn, pvmsr_t vbinary_msr, const std::string& msrfilename, const std::string& networkname, + const CDnaDatum& datum, const std::string& comment); - void read_dna_header(std::ifstream* ptr, string& version, INPUT_DATA_TYPE& idt, + void read_dna_header(std::ifstream* ptr, std::string& version, INPUT_DATA_TYPE& idt, CDnaDatum& referenceframe, bool user_supplied_frame, - string& fileEpsg, string& fileEpoch, string& geoidversion, UINT32& count); + std::string& fileEpsg, std::string& fileEpoch, std::string& geoidversion, UINT32& count); inline const dna_stn_fields dna_stn_positions() { return dsl_; } inline const dna_stn_fields dna_stn_widths() { return dsw_; } @@ -107,24 +107,24 @@ class dna_io_dna : public dna_io_base private: - void create_file_stn(std::ofstream* ptr, const string& filename); - void create_file_msr(std::ofstream* ptr, const string& filename); - void create_file_pointer(std::ofstream* ptr, const string& filename); - void open_file_pointer(std::ifstream* ptr, const string& filename); - - void write_stn_header_data(std::ofstream* ptr, const string& networkname, const string& datum, - const string& epoch, const size_t& count, const string& comment); - void write_stn_header(std::ofstream* ptr, vdnaStnPtr* vStations, const string& networkname, - const CDnaDatum& datum, bool flagUnused, const string& comment); - void write_stn_header(std::ofstream* ptr, pvstn_t vbinary_stn, const string& networkname, - const CDnaDatum& datum, bool flagUnused, const string& comment); - - void write_msr_header_data(std::ofstream* ptr, const string& networkname, const string& datum, - const string& epoch, const size_t& count, const string& comment); - void write_msr_header(std::ofstream* ptr, vdnaMsrPtr* vMeasurements, const string& networkname, - const CDnaDatum& datum, const string& comment); - void write_msr_header(std::ofstream* ptr, pvmsr_t vbinary_msrn, const string& networkname, - const CDnaDatum& datum, const string& comment); + void create_file_stn(std::ofstream* ptr, const std::string& filename); + void create_file_msr(std::ofstream* ptr, const std::string& filename); + void create_file_pointer(std::ofstream* ptr, const std::string& filename); + void open_file_pointer(std::ifstream* ptr, const std::string& filename); + + void write_stn_header_data(std::ofstream* ptr, const std::string& networkname, const std::string& datum, + const std::string& epoch, const size_t& count, const std::string& comment); + void write_stn_header(std::ofstream* ptr, vdnaStnPtr* vStations, const std::string& networkname, + const CDnaDatum& datum, bool flagUnused, const std::string& comment); + void write_stn_header(std::ofstream* ptr, pvstn_t vbinary_stn, const std::string& networkname, + const CDnaDatum& datum, bool flagUnused, const std::string& comment); + + void write_msr_header_data(std::ofstream* ptr, const std::string& networkname, const std::string& datum, + const std::string& epoch, const size_t& count, const std::string& comment); + void write_msr_header(std::ofstream* ptr, vdnaMsrPtr* vMeasurements, const std::string& networkname, + const CDnaDatum& datum, const std::string& comment); + void write_msr_header(std::ofstream* ptr, pvmsr_t vbinary_msrn, const std::string& networkname, + const CDnaDatum& datum, const std::string& comment); void read_ren_data(std::ifstream* ptr, pv_string_vstring_pair stnRenaming); diff --git a/dynadjust/include/io/dnaiodnatypes.hpp b/dynadjust/include/io/dnaiodnatypes.hpp index a4dd4e65..cbac7c9c 100644 --- a/dynadjust/include/io/dnaiodnatypes.hpp +++ b/dynadjust/include/io/dnaiodnatypes.hpp @@ -32,9 +32,6 @@ #include #include -using namespace std; -using namespace boost; - #include using namespace dynadjust::exception; @@ -56,7 +53,7 @@ typedef struct msr_database_t { } msr_database_id_map; -typedef vector v_msr_database_id_map, *pv_msr_database_id_map; +typedef std::vector v_msr_database_id_map, *pv_msr_database_id_map; typedef v_msr_database_id_map::iterator it_vdbid_t; typedef struct { @@ -467,10 +464,10 @@ void assignDNASTNFieldParameters(const UINT16* locs, const UINT16* widths, template -void determineDNASTNFieldParameters(const string& version, +void determineDNASTNFieldParameters(const std::string& version, dna_stn_fields& dflocs, dna_stn_fields& dfwidths) { - if (iequals(version, "3.01")) + if (boost::iequals(version, "3.01")) { assignDNASTNFieldParameters(dna_stn_fields_301::_locations_, dna_stn_fields_301::_widths_, @@ -478,7 +475,7 @@ void determineDNASTNFieldParameters(const string& version, return; } - if (iequals(version, "3.00")) + if (boost::iequals(version, "3.00")) { assignDNASTNFieldParameters(dna_stn_fields_300::_locations_, dna_stn_fields_300::_widths_, @@ -486,7 +483,7 @@ void determineDNASTNFieldParameters(const string& version, return; } - if (iequals(version, "1.00")) + if (boost::iequals(version, "1.00")) { assignDNASTNFieldParameters(dna_stn_fields_100::_locations_, dna_stn_fields_100::_widths_, @@ -554,10 +551,10 @@ void assignDNAMSRFieldParameters(const UINT16* locs, const UINT16* widths, template -void determineDNAMSRFieldParameters(const string& version, +void determineDNAMSRFieldParameters(const std::string& version, dna_msr_fields& dflocs, dna_msr_fields& dfwidths, const U u=0) { - if (iequals(version, "3.01")) + if (boost::iequals(version, "3.01")) { assignDNAMSRFieldParameters(dna_msr_fields_301::_locations_, dna_msr_fields_301::_widths_, @@ -565,7 +562,7 @@ void determineDNAMSRFieldParameters(const string& version, return; } - if (iequals(version, "3.00")) + if (boost::iequals(version, "3.00")) { assignDNAMSRFieldParameters(dna_msr_fields_300::_locations_, dna_msr_fields_300::_widths_, @@ -573,7 +570,7 @@ void determineDNAMSRFieldParameters(const string& version, return; } - if (iequals(version, "1.00")) + if (boost::iequals(version, "1.00")) { assignDNAMSRFieldParameters(dna_msr_fields_100::_locations_, dna_msr_fields_100::_widths_, @@ -581,8 +578,8 @@ void determineDNAMSRFieldParameters(const string& version, return; } - stringstream ss; - ss << " Unknown file version: " << version << endl; + std::stringstream ss; + ss << " Unknown file version: " << version << std::endl; throw XMLInteropException(ss.str(), u); } diff --git a/dynadjust/include/io/dnaiomap.cpp b/dynadjust/include/io/dnaiomap.cpp index 781df3f3..f79ce1c8 100644 --- a/dynadjust/include/io/dnaiomap.cpp +++ b/dynadjust/include/io/dnaiomap.cpp @@ -29,26 +29,26 @@ namespace dynadjust { namespace iostreams { -void dna_io_map::load_map_file(const string& map_filename, pv_string_uint32_pair stnsMap) +void dna_io_map::load_map_file(const std::string& map_filename, pv_string_uint32_pair stnsMap) { std::ifstream map_file; - stringstream ss; - ss << "load_map_file(): An error was encountered when opening " << map_filename << "." << endl; + std::stringstream ss; + ss << "load_map_file(): An error was encountered when opening " << map_filename << "." << std::endl; try { // open stations map file. Throws runtime_error on failure. - file_opener(map_file, map_filename, ios::in | ios::binary, binary, true); + file_opener(map_file, map_filename, std::ios::in | std::ios::binary, binary, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "load_map_file(): An error was encountered when reading from " << map_filename << "." << endl; + ss << "load_map_file(): An error was encountered when reading from " << map_filename << "." << std::endl; stnsMap->clear(); UINT32 mapsize; @@ -72,46 +72,46 @@ void dna_io_map::load_map_file(const string& map_filename, pv_string_uint32_pair stnsMap->push_back(stnID); } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } map_file.close(); if (stnsMap->size() < mapsize) throw boost::enable_current_exception( - runtime_error("load_map_file(): Could not allocate sufficient memory for the Station map.")); + std::runtime_error("load_map_file(): Could not allocate sufficient memory for the Station map.")); } -void dna_io_map::write_map_file(const string& map_filename, pv_string_uint32_pair stnsMap) +void dna_io_map::write_map_file(const std::string& map_filename, pv_string_uint32_pair stnsMap) { std::ofstream map_file; - stringstream ss; - ss << "write_map_file(): An error was encountered when opening " << map_filename << "." << endl; + std::stringstream ss; + ss << "write_map_file(): An error was encountered when opening " << map_filename << "." << std::endl; try { // Open station map file. Throws runtime_error on failure. file_opener(map_file, map_filename, - ios::out | ios::binary, binary); + std::ios::out | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "write_map_file(): An error was encountered when writing to " << map_filename << "." << endl; + ss << "write_map_file(): An error was encountered when writing to " << map_filename << "." << std::endl; v_string_uint32_pair::const_iterator _it_stnmap(stnsMap->begin()); UINT32 mapval(static_cast(stnsMap->size())); @@ -131,77 +131,77 @@ void dna_io_map::write_map_file(const string& map_filename, pv_string_uint32_pai map_file.write(reinterpret_cast(&mapval), sizeof(UINT32)); } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } map_file.close(); } -void dna_io_map::write_map_file_txt(const string& map_filename, pv_string_uint32_pair stnsMap) +void dna_io_map::write_map_file_txt(const std::string& map_filename, pv_string_uint32_pair stnsMap) { std::ofstream map_file; - stringstream ss; - ss << "write_map_file_txt(): An error was encountered when opening " << map_filename << "." << endl; + std::stringstream ss; + ss << "write_map_file_txt(): An error was encountered when opening " << map_filename << "." << std::endl; try { // Create station map text file. Throws runtime_error on failure. file_opener(map_file, map_filename); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "write_map_file_txt(): An error was encountered when writing to " << map_filename << "." << endl; + ss << "write_map_file_txt(): An error was encountered when writing to " << map_filename << "." << std::endl; try { - stringstream ss_map; + std::stringstream ss_map; ss_map << stnsMap->size() << " stations"; - map_file << left << setw(STATION) << ss_map.str(); - map_file << setw(HEADER_20) << right << "Stn. index" << endl; + map_file << std::left << std::setw(STATION) << ss_map.str(); + map_file << std::setw(HEADER_20) << std::right << "Stn. index" << std::endl; v_string_uint32_pair::const_iterator _it_stnmap(stnsMap->begin()); for (_it_stnmap=stnsMap->begin(); _it_stnmap!=stnsMap->end(); ++_it_stnmap) { - map_file << setw(STATION) << left << + map_file << std::setw(STATION) << std::left << _it_stnmap->first.c_str() << - setw(HEADER_20) << right << _it_stnmap->second << endl; + std::setw(HEADER_20) << std::right << _it_stnmap->second << std::endl; } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } map_file.close(); } -//void dna_io_map::load_renaming_file(const string& renaming_filename, pv_string_string_pair stnRenaming) +//void dna_io_map::load_renaming_file(const std::string& renaming_filename, pv_string_string_pair stnRenaming) //{ // std::ifstream renaming_file; // -// stringstream ss; -// ss << "load_renaming_file(): An error was encountered when opening " << renaming_filename << "." << endl; +// std::stringstream ss; +// ss << "load_renaming_file(): An error was encountered when opening " << renaming_filename << "." << std::endl; // // // The contents of the renaming file is as follows: // // @@ -224,23 +224,23 @@ void dna_io_map::write_map_file_txt(const string& map_filename, pv_string_uint32 // try { // // Load renaming file. Throws runtime_error on failure. // file_opener(renaming_file, renaming_filename, -// ios::in, ascii, true); +// std::ios::in, ascii, true); // } -// catch (const runtime_error& e) { +// catch (const std::runtime_error& e) { // ss << e.what(); -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // catch (...) { -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // ss.str(""); -// ss << "load_renaming_file(): An error was encountered when reading from " << renaming_filename << "." << endl; +// ss << "load_renaming_file(): An error was encountered when reading from " << renaming_filename << "." << std::endl; // // stnRenaming->clear(); // // string_string_pair stnNames; -// string sBuf(""); +// std::string sBuf(""); // UINT32 stationWidth(STATION), stationCount(100); // UINT32 line(0); // @@ -252,27 +252,27 @@ void dna_io_map::write_map_file_txt(const string& map_filename, pv_string_uint32 // line++; // getline(renaming_file, sBuf); // -// if (iequals(trimstr(sBuf), "STATION NAMES")) +// if (boost::iequals(trimstr(sBuf), "STATION NAMES")) // break; // // // blank or whitespace? // if (trimstr(sBuf).empty()) // continue; // -// if (iequals(trimstr(sBuf.substr(0, 13)), "Station count")) +// if (boost::iequals(trimstr(sBuf.substr(0, 13)), "Station count")) // { -// stationCount = lexical_cast(trimstr(sBuf.substr(PRINT_VAR_PAD))); +// stationCount = boost::lexical_cast(trimstr(sBuf.substr(PRINT_VAR_PAD))); // continue; // } // -// if (iequals(trimstr(sBuf.substr(0, 18)), "Station name width")) +// if (boost::iequals(trimstr(sBuf.substr(0, 18)), "Station name width")) // { -// stationWidth = lexical_cast(trimstr(sBuf.substr(PRINT_VAR_PAD))); +// stationWidth = boost::lexical_cast(trimstr(sBuf.substr(PRINT_VAR_PAD))); // continue; // } // // } -// while (!iequals(trimstr(sBuf), "STATION NAMES")); +// while (!boost::iequals(trimstr(sBuf), "STATION NAMES")); // // stnRenaming->reserve(stationCount); // @@ -288,10 +288,10 @@ void dna_io_map::write_map_file_txt(const string& map_filename, pv_string_uint32 // if (trimstr(sBuf).length() < stationWidth) // continue; // -// if (iequals(trimstr(sBuf.substr(0, 8)), "OLD NAME")) +// if (boost::iequals(trimstr(sBuf.substr(0, 8)), "OLD NAME")) // continue; // -// if (iequals(trimstr(sBuf.substr(0, 3)), "---")) +// if (boost::iequals(trimstr(sBuf.substr(0, 3)), "---")) // continue; // // // Ignore lines with blank station name @@ -312,23 +312,23 @@ void dna_io_map::write_map_file_txt(const string& map_filename, pv_string_uint32 // stnRenaming->push_back(stnNames); // } // } -// catch (const ios_base::failure& f) { +// catch (const std::ios_base::failure& f) { // if (renaming_file.eof()) // { // renaming_file.close(); // return; // } // ss << f.what(); -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } -// catch (const runtime_error& e) { +// catch (const std::runtime_error& e) { // if (renaming_file.eof()) // { // renaming_file.close(); // return; // } // ss << e.what(); -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // catch (...) { // if (renaming_file.eof()) @@ -336,7 +336,7 @@ void dna_io_map::write_map_file_txt(const string& map_filename, pv_string_uint32 // renaming_file.close(); // return; // } -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // renaming_file.close(); diff --git a/dynadjust/include/io/dnaiomap.hpp b/dynadjust/include/io/dnaiomap.hpp index 1ec0a1ce..26b2ec7b 100644 --- a/dynadjust/include/io/dnaiomap.hpp +++ b/dynadjust/include/io/dnaiomap.hpp @@ -44,11 +44,11 @@ class dna_io_map : public dna_io_base dna_io_map& operator=(const dna_io_map& rhs); - void load_map_file(const string& map_filename, pv_string_uint32_pair stnsMap); - void write_map_file(const string& map_filename, pv_string_uint32_pair stnsMap); - void write_map_file_txt(const string& map_filename, pv_string_uint32_pair stnsMap); + void load_map_file(const std::string& map_filename, pv_string_uint32_pair stnsMap); + void write_map_file(const std::string& map_filename, pv_string_uint32_pair stnsMap); + void write_map_file_txt(const std::string& map_filename, pv_string_uint32_pair stnsMap); - //void load_renaming_file(const string& map_filename, pv_string_string_pair stnRenaming); + //void load_renaming_file(const std::string& map_filename, pv_string_string_pair stnRenaming); protected: diff --git a/dynadjust/include/io/dnaiopdf.cpp b/dynadjust/include/io/dnaiopdf.cpp index 91671965..d40d5603 100644 --- a/dynadjust/include/io/dnaiopdf.cpp +++ b/dynadjust/include/io/dnaiopdf.cpp @@ -23,15 +23,10 @@ #include #include #include - -using namespace std; - -using namespace boost::filesystem; - namespace dynadjust { namespace iostreams { -string dna_io_pdf::form_pdf_action_command_string(const string& pdf_filename, const string& ddename, const string& action) +std::string dna_io_pdf::form_pdf_action_command_string(const std::string& pdf_filename, const std::string& ddename, const std::string& action) { if (pdf_filename.empty()) @@ -41,11 +36,11 @@ string dna_io_pdf::form_pdf_action_command_string(const string& pdf_filename, co char viewer_filepath[256]; FindExecutable(pdf_filename.c_str(), 0, viewer_filepath); - string viewer(path(viewer_filepath).stem()); + std::string viewer(path(viewer_filepath).stem()); - if (iequals(viewer, "AcroRd32") || iequals(viewer, "Acrobat")) + if (boost::iequals(viewer, "AcroRd32") || boost::iequals(viewer, "Acrobat")) { - stringstream ss; + std::stringstream ss; ss << "\"" << viewer_filepath << "\" " << pdf_filename; return ss.str(); } @@ -59,13 +54,13 @@ string dna_io_pdf::form_pdf_action_command_string(const string& pdf_filename, co return ""; } -string dna_io_pdf::form_pdf_close_string(const string& pdf_filename, const string& ddename) +std::string dna_io_pdf::form_pdf_close_string(const std::string& pdf_filename, const std::string& ddename) { //return form_pdf_action_command_string(pdf_filename, ddename, "DocClose"); return ""; } -string dna_io_pdf::form_pdf_open_string(const string& pdf_filename, const string& ddename) +std::string dna_io_pdf::form_pdf_open_string(const std::string& pdf_filename, const std::string& ddename) { // return form_pdf_action_command_string(pdf_filename, ddename, "DocOpen"); return ""; diff --git a/dynadjust/include/io/dnaiopdf.hpp b/dynadjust/include/io/dnaiopdf.hpp index 753ba298..48421a1e 100644 --- a/dynadjust/include/io/dnaiopdf.hpp +++ b/dynadjust/include/io/dnaiopdf.hpp @@ -33,6 +33,11 @@ #include #include #include // for FindExecutable + + #ifndef VC_EXTRALEAN + #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers + #endif + #elif defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) #include #endif @@ -60,9 +65,9 @@ class dna_io_pdf : public dna_io_base dna_io_pdf& operator=(const dna_io_pdf& rhs); - string form_pdf_action_command_string(const string& pdf_filename, const string& ddename, const string& action); - string form_pdf_close_string(const string& pdf_filename, const string& ddename); - string form_pdf_open_string(const string& pdf_filename, const string& ddename); + std::string form_pdf_action_command_string(const std::string& pdf_filename, const std::string& ddename, const std::string& action); + std::string form_pdf_close_string(const std::string& pdf_filename, const std::string& ddename); + std::string form_pdf_open_string(const std::string& pdf_filename, const std::string& ddename); protected: diff --git a/dynadjust/include/io/dnaioscalar.cpp b/dynadjust/include/io/dnaioscalar.cpp index 0da5c10a..2692d521 100644 --- a/dynadjust/include/io/dnaioscalar.cpp +++ b/dynadjust/include/io/dnaioscalar.cpp @@ -27,11 +27,11 @@ namespace dynadjust { namespace iostreams { -void dna_io_scalar::load_scalar_file(const string& scalar_filename, pvscl_t bslScaling) +void dna_io_scalar::load_scalar_file(const std::string& scalar_filename, pvscl_t bslScaling) { std::ifstream scalar_file; - stringstream ss; - ss << "load_scalar_file(): An error was encountered when opening " << scalar_filename << "." << endl; + std::stringstream ss; + ss << "load_scalar_file(): An error was encountered when opening " << scalar_filename << "." << std::endl; // The contents of the scalar file is as follows: // @@ -54,23 +54,23 @@ void dna_io_scalar::load_scalar_file(const string& scalar_filename, pvscl_t bslS try { // Load scalar file. Throws runtime_error on failure. file_opener(scalar_file, scalar_filename, - ios::in, ascii, true); + std::ios::in, ascii, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "load_scalar_file(): An error was encountered when reading from " << scalar_filename << "." << endl; + ss << "load_scalar_file(): An error was encountered when reading from " << scalar_filename << "." << std::endl; bslScaling->clear(); scalar_t bslScalars; - string sBuf(""), tmp; + std::string sBuf(""), tmp; UINT32 stationWidth(STATION), scalarCount(100); UINT32 line(0), position(0); @@ -82,23 +82,23 @@ void dna_io_scalar::load_scalar_file(const string& scalar_filename, pvscl_t bslS line++; getline(scalar_file, sBuf); - if (iequals(trimstr(sBuf), "SCALARS")) + if (boost::iequals(trimstr(sBuf), "SCALARS")) break; - if (iequals(trimstr(sBuf.substr(0, 16)), "Baseline count")) + if (boost::iequals(trimstr(sBuf.substr(0, 16)), "Baseline count")) { - scalarCount = lexical_cast(trimstr(sBuf.substr(PRINT_VAR_PAD))); + scalarCount = boost::lexical_cast(trimstr(sBuf.substr(PRINT_VAR_PAD))); continue; } - if (iequals(trimstr(sBuf.substr(0, 18)), "Station name width")) + if (boost::iequals(trimstr(sBuf.substr(0, 18)), "Station name width")) { - stationWidth = lexical_cast(trimstr(sBuf.substr(PRINT_VAR_PAD))); + stationWidth = boost::lexical_cast(trimstr(sBuf.substr(PRINT_VAR_PAD))); continue; } } - while (!iequals(trimstr(sBuf), "SCALARS")); + while (!boost::iequals(trimstr(sBuf), "SCALARS")); bslScaling->reserve(scalarCount); @@ -114,10 +114,10 @@ void dna_io_scalar::load_scalar_file(const string& scalar_filename, pvscl_t bslS if (trimstr(sBuf).length() < stationWidth+1) continue; - if (iequals(trimstr(sBuf.substr(0, 20)), "Station 1")) + if (boost::iequals(trimstr(sBuf.substr(0, 20)), "Station 1")) continue; - if (iequals(trimstr(sBuf.substr(0, 3)), "---")) + if (boost::iequals(trimstr(sBuf.substr(0, 3)), "---")) continue; // Ignore lines with blank station name @@ -143,7 +143,7 @@ void dna_io_scalar::load_scalar_file(const string& scalar_filename, pvscl_t bslS if (sBuf.length() > position) { if ((tmp = trimstr(sBuf.substr(position, 10))).length() > 0) - bslScalars.v_scale = lexical_cast(tmp); + bslScalars.v_scale = boost::lexical_cast(tmp); } else continue; @@ -154,7 +154,7 @@ void dna_io_scalar::load_scalar_file(const string& scalar_filename, pvscl_t bslS if (sBuf.length() > position) { if ((tmp = trimstr(sBuf.substr(position, 10))).length() > 0) - bslScalars.p_scale = lexical_cast(tmp); + bslScalars.p_scale = boost::lexical_cast(tmp); } else continue; @@ -165,7 +165,7 @@ void dna_io_scalar::load_scalar_file(const string& scalar_filename, pvscl_t bslS if (sBuf.length() > position) { if ((tmp = trimstr(sBuf.substr(position, 10))).length() > 0) - bslScalars.l_scale = lexical_cast(tmp); + bslScalars.l_scale = boost::lexical_cast(tmp); } else continue; @@ -176,7 +176,7 @@ void dna_io_scalar::load_scalar_file(const string& scalar_filename, pvscl_t bslS if (sBuf.length() > position) { if ((tmp = trimstr(sBuf.substr(position, 10))).length() > 0) - bslScalars.h_scale = lexical_cast(tmp); + bslScalars.h_scale = boost::lexical_cast(tmp); } else continue; @@ -184,23 +184,23 @@ void dna_io_scalar::load_scalar_file(const string& scalar_filename, pvscl_t bslS bslScaling->push_back(bslScalars); } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if (scalar_file.eof()) { scalar_file.close(); return; } ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { if (scalar_file.eof()) { scalar_file.close(); return; } ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { if (scalar_file.eof()) @@ -208,7 +208,7 @@ void dna_io_scalar::load_scalar_file(const string& scalar_filename, pvscl_t bslS scalar_file.close(); return; } - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } scalar_file.close(); diff --git a/dynadjust/include/io/dnaioscalar.hpp b/dynadjust/include/io/dnaioscalar.hpp index a578ee27..72a9b83a 100644 --- a/dynadjust/include/io/dnaioscalar.hpp +++ b/dynadjust/include/io/dnaioscalar.hpp @@ -47,7 +47,7 @@ class dna_io_scalar : public dna_io_base dna_io_scalar& operator=(const dna_io_scalar& rhs); - void load_scalar_file(const string& map_filename, pvscl_t bslScaling); + void load_scalar_file(const std::string& map_filename, pvscl_t bslScaling); protected: diff --git a/dynadjust/include/io/dnaioseg.cpp b/dynadjust/include/io/dnaioseg.cpp index 3bf8f48e..3739dafd 100644 --- a/dynadjust/include/io/dnaioseg.cpp +++ b/dynadjust/include/io/dnaioseg.cpp @@ -27,41 +27,41 @@ namespace dynadjust { namespace iostreams { -void dna_io_seg::load_seg_file_header_f(const string& seg_filename, UINT32& blockCount, +void dna_io_seg::load_seg_file_header_f(const std::string& seg_filename, UINT32& blockCount, UINT32& blockThreshold, UINT32& minInnerStns) { std::ifstream seg_file; - stringstream ss_err; + std::stringstream ss_err; try { // open stations seg file. Throws runtime_error on failure. - ss_err << "load_seg_file_f(): An error was encountered when opening " << seg_filename << "." << endl; - file_opener(seg_file, seg_filename, ios::in, ascii, true); + ss_err << "load_seg_file_f(): An error was encountered when opening " << seg_filename << "." << std::endl; + file_opener(seg_file, seg_filename, std::ios::in, ascii, true); ss_err.str(""); - ss_err << "load_seg_file_f(): An error was encountered when reading " << seg_filename << "." << endl; + ss_err << "load_seg_file_f(): An error was encountered when reading " << seg_filename << "." << std::endl; load_seg_file_header(seg_filename, seg_file, blockCount, blockThreshold, minInnerStns); seg_file.close(); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss_err << e.what(); - throw boost::enable_current_exception(runtime_error(ss_err.str())); + throw boost::enable_current_exception(std::runtime_error(ss_err.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss_err.str())); + throw boost::enable_current_exception(std::runtime_error(ss_err.str())); } } -void dna_io_seg::load_seg_file_header(const string& seg_filename, istream& seg_file, UINT32& blockCount, +void dna_io_seg::load_seg_file_header(const std::string& seg_filename, std::istream& seg_file, UINT32& blockCount, UINT32& blockThreshold, UINT32& minInnerStns) { - stringstream ss_err; - ss_err << "load_seg_file_header(): An error was encountered when reading from " << seg_filename << "." << endl; + std::stringstream ss_err; + ss_err << "load_seg_file_header(): An error was encountered when reading from " << seg_filename << "." << std::endl; char line[PRINT_LINE_LENGTH]; memset(line, '\0', PRINT_LINE_LENGTH); @@ -101,20 +101,20 @@ void dna_io_seg::load_seg_file_header(const string& seg_filename, istream& seg_f seg_file.getline(line, PRINT_LINE_LENGTH); // No. blocks produced blockCount = strtoul(line+PRINT_VAR_PAD, NULL, 0); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss_err << f.what(); - throw boost::enable_current_exception(runtime_error(ss_err.str())); + throw boost::enable_current_exception(std::runtime_error(ss_err.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss_err << e.what(); - throw boost::enable_current_exception(runtime_error(ss_err.str())); + throw boost::enable_current_exception(std::runtime_error(ss_err.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss_err.str())); + throw boost::enable_current_exception(std::runtime_error(ss_err.str())); } } -void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, +void dna_io_seg::load_seg_file(const std::string& seg_filename, UINT32& blockCount, UINT32& blockThreshold, UINT32& minInnerStns, vvUINT32& v_ISL, vvUINT32& v_JSL, vvUINT32& v_CML, bool loadMetrics, @@ -123,23 +123,23 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, pvUINT32 v_parameterStationCount) { std::ifstream seg_file; - stringstream ss_err; - ss_err << "load_seg_file(): An error was encountered when opening " << seg_filename << "." << endl; + std::stringstream ss_err; + ss_err << "load_seg_file(): An error was encountered when opening " << seg_filename << "." << std::endl; try { // open stations seg file. Throws runtime_error on failure. - file_opener(seg_file, seg_filename, ios::in, ascii, true); + file_opener(seg_file, seg_filename, std::ios::in, ascii, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss_err << e.what(); - throw boost::enable_current_exception(runtime_error(ss_err.str())); + throw boost::enable_current_exception(std::runtime_error(ss_err.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss_err.str())); + throw boost::enable_current_exception(std::runtime_error(ss_err.str())); } ss_err.str(""); - ss_err << "load_seg_file(): An error was encountered when reading from " << seg_filename << "." << endl; + ss_err << "load_seg_file(): An error was encountered when reading from " << seg_filename << "." << std::endl; UINT32 b, blk, c, i, j, m, blkCount(0), netID(0), jslCount(0), islCount(0), msrCount(0), stnCount(0); @@ -147,7 +147,7 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, char line[PRINT_LINE_LENGTH], format_spec_netid[6], format_spec_junct[6], format_spec_inner[6], format_spec_measr[6]; - string sBuf, tmp; + std::string sBuf, tmp; try { @@ -186,19 +186,19 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, getline(seg_file, sBuf); if (sBuf.compare(0, 20, "--------------------") == 0) - throw boost::enable_current_exception(runtime_error(" Segmentation file is corrupt.")); + throw boost::enable_current_exception(std::runtime_error(" Segmentation file is corrupt.")); // Block number try { tmp = trimstr(sBuf.substr(column, BLOCK)); if (tmp.empty()) - throw boost::enable_current_exception(runtime_error(" Unable to retrieve Block number.")); + throw boost::enable_current_exception(std::runtime_error(" Unable to retrieve Block number.")); blkCount = LongFromString(tmp); } catch (...) { ss_err.str(""); - ss_err << " Segmentation file is corrupt: Could not extract Block number from the record: " << endl << " " << sBuf << endl; - throw boost::enable_current_exception(runtime_error(ss_err.str().c_str())); + ss_err << " Segmentation file is corrupt: Could not extract Block number from the record: " << std::endl << " " << sBuf << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss_err.str().c_str())); } column += BLOCK; @@ -207,13 +207,13 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, try { tmp = trimstr(sBuf.substr(column, NETID)); if (tmp.empty()) - throw boost::enable_current_exception(runtime_error(" Unable to retrieve Network ID.")); + throw boost::enable_current_exception(std::runtime_error(" Unable to retrieve Network ID.")); netID = LongFromString(tmp); } catch (...) { ss_err.str(""); - ss_err << " Segmentation file is corrupt: Could not extract Network ID from the record: " << endl << " " << sBuf << endl; - throw boost::enable_current_exception(runtime_error(ss_err.str().c_str())); + ss_err << " Segmentation file is corrupt: Could not extract Network ID from the record: " << std::endl << " " << sBuf << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss_err.str().c_str())); } column += NETID; @@ -222,13 +222,13 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, try { tmp = trimstr(sBuf.substr(column, JUNCT)); if (tmp.empty()) - throw boost::enable_current_exception(runtime_error(" Unable to retrieve Junction station count.")); + throw boost::enable_current_exception(std::runtime_error(" Unable to retrieve Junction station count.")); jslCount = LongFromString(tmp); } catch (...) { ss_err.str(""); - ss_err << " Segmentation file is corrupt: Could not extract Junction station count from the record: " << endl << " " << sBuf << endl; - throw boost::enable_current_exception(runtime_error(ss_err.str().c_str())); + ss_err << " Segmentation file is corrupt: Could not extract Junction station count from the record: " << std::endl << " " << sBuf << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss_err.str().c_str())); } column += JUNCT; @@ -237,13 +237,13 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, try { tmp = trimstr(sBuf.substr(column, INNER)); if (tmp.empty()) - throw boost::enable_current_exception(runtime_error(" Unable to retrieve Inner station count.")); + throw boost::enable_current_exception(std::runtime_error(" Unable to retrieve Inner station count.")); islCount = LongFromString(tmp); } catch (...) { ss_err.str(""); - ss_err << " Segmentation file is corrupt: Could not extract Inner station count from the record: " << endl << " " << sBuf << endl; - throw boost::enable_current_exception(runtime_error(ss_err.str().c_str())); + ss_err << " Segmentation file is corrupt: Could not extract Inner station count from the record: " << std::endl << " " << sBuf << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss_err.str().c_str())); } column += INNER; @@ -252,13 +252,13 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, try { tmp = trimstr(sBuf.substr(column, MEASR)); if (tmp.empty()) - throw boost::enable_current_exception(runtime_error(" Unable to retrieve Measurement count.")); + throw boost::enable_current_exception(std::runtime_error(" Unable to retrieve Measurement count.")); msrCount = LongFromString(tmp); } catch (...) { ss_err.str(""); - ss_err << " Segmentation file is corrupt: Could not extract Measurement count from the record: " << endl << " " << sBuf << endl; - throw boost::enable_current_exception(runtime_error(ss_err.str().c_str())); + ss_err << " Segmentation file is corrupt: Could not extract Measurement count from the record: " << std::endl << " " << sBuf << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss_err.str().c_str())); } column += MEASR; @@ -267,17 +267,17 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, try { tmp = trimstr(sBuf.substr(column)); if (tmp.empty()) - throw boost::enable_current_exception(runtime_error(" Unable to retrieve Total station count.")); + throw boost::enable_current_exception(std::runtime_error(" Unable to retrieve Total station count.")); stnCount = LongFromString(tmp); } catch (...) { ss_err.str(""); - ss_err << " Segmentation file is corrupt: Could not extract Total station count from the record: " << endl << " " << sBuf << endl; - throw boost::enable_current_exception(runtime_error(ss_err.str().c_str())); + ss_err << " Segmentation file is corrupt: Could not extract Total station count from the record: " << std::endl << " " << sBuf << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss_err.str().c_str())); } if (stnCount != islCount + jslCount) - throw boost::enable_current_exception(runtime_error(" Segmentation file is corrupt.")); + throw boost::enable_current_exception(std::runtime_error(" Segmentation file is corrupt.")); v_JSL.at(t) = vUINT32(jslCount); v_ISL.at(t) = vUINT32(islCount); @@ -292,7 +292,7 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, } if (blkCount != blockCount) - throw boost::enable_current_exception(runtime_error("load_seg_file(): Segmentation file is corrupt.")); + throw boost::enable_current_exception(std::runtime_error("load_seg_file(): Segmentation file is corrupt.")); // skip header info seg_file.ignore(PRINT_LINE_LENGTH, '\n'); // ------------------------ @@ -310,7 +310,7 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, seg_file.getline(line, PRINT_LINE_LENGTH); // Block # sscanf(line+5, "%ud", &blk); if (b+1 != blk) - throw boost::enable_current_exception(runtime_error("load_seg_file(): segmentation file is corrupt.")); + throw boost::enable_current_exception(std::runtime_error("load_seg_file(): segmentation file is corrupt.")); seg_file.ignore(PRINT_LINE_LENGTH, '\n'); // ------------------------ seg_file.ignore(PRINT_LINE_LENGTH, '\n'); // Junction stns: @@ -393,16 +393,16 @@ void dna_io_seg::load_seg_file(const string& seg_filename, UINT32& blockCount, } } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { ss_err << f.what(); - throw boost::enable_current_exception(runtime_error(ss_err.str())); + throw boost::enable_current_exception(std::runtime_error(ss_err.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss_err << e.what(); - throw boost::enable_current_exception(runtime_error(ss_err.str())); + throw boost::enable_current_exception(std::runtime_error(ss_err.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss_err.str())); + throw boost::enable_current_exception(std::runtime_error(ss_err.str())); } seg_file.close(); @@ -488,7 +488,7 @@ void dna_io_seg::create_stn_appearance_list(vv_stn_appear& stnAppearance, } } -void dna_io_seg::write_seg_block(ostream &os, +void dna_io_seg::write_seg_block(std::ostream &os, const vUINT32& vISL, const vUINT32& vJSL, const vUINT32& vCML, const UINT32& currentBlock, const vstn_t* bstBinaryRecords, const vmsr_t* bmsBinaryRecords, @@ -496,28 +496,28 @@ void dna_io_seg::write_seg_block(ostream &os, { char dash; - os << endl << "Block " << currentBlock << endl; + os << std::endl << "Block " << currentBlock << std::endl; for (dash=INNER+JUNCT+MEASR+PAD; dash>0; dash--) os << "-"; - os << endl; + os << std::endl; - //os << setw(JUNCT) << left << "Block:" << setw(BLOCK) << right << currentBlock_ << endl; - os << setw(JUNCT) << left << "Junction stns:" << setw(BLOCK) << vJSL.size() << endl; - os << setw(JUNCT) << left << "Inner stns:" << setw(BLOCK) << vISL.size() << endl; - os << setw(JUNCT) << left << "Measurements:" << setw(BLOCK) << vCML.size() << endl; - os << setw(JUNCT) << left << "Total stns:" << setw(BLOCK) << (vJSL.size() + vISL.size()) << endl << endl; + //os << std::setw(JUNCT) << std::left << "Block:" << std::setw(BLOCK) << std::right << currentBlock_ << std::endl; + os << std::setw(JUNCT) << std::left << "Junction stns:" << std::setw(BLOCK) << vJSL.size() << std::endl; + os << std::setw(JUNCT) << std::left << "Inner stns:" << std::setw(BLOCK) << vISL.size() << std::endl; + os << std::setw(JUNCT) << std::left << "Measurements:" << std::setw(BLOCK) << vCML.size() << std::endl; + os << std::setw(JUNCT) << std::left << "Total stns:" << std::setw(BLOCK) << (vJSL.size() + vISL.size()) << std::endl << std::endl; it_vUINT32_const _it_isl(vISL.begin()); it_vUINT32_const _it_jsl(vJSL.begin()); it_vUINT32_const _it_msr(vCML.begin()); - os << setw(INNER) << left << "Inner stns" << setw(JUNCT) << left << "Junction stns" << - setw(MEASR) << "Measurements" << setw(PAD) << "Type" << endl; + os << std::setw(INNER) << std::left << "Inner stns" << std::setw(JUNCT) << std::left << "Junction stns" << + std::setw(MEASR) << "Measurements" << std::setw(PAD) << "Type" << std::endl; for (dash=INNER+JUNCT+MEASR+PAD; dash>0; dash--) os << "-"; - os << endl; - ostringstream tmp; + os << std::endl; + std::ostringstream tmp; vUINT32 msrStations; @@ -527,27 +527,27 @@ void dna_io_seg::write_seg_block(ostream &os, if (_it_isl != vISL.end()) { if (PRINT_NAMES) { - os << setw(INNER) << left << ((ostringstream&)(tmp << bstBinaryRecords->at(*_it_isl).stationName)).str(); + os << std::setw(INNER) << std::left << ((ostringstream&)(tmp << bstBinaryRecords->at(*_it_isl).stationName)).str(); tmp.str(""); } else - os << setw(INNER) << left << *_it_isl; + os << std::setw(INNER) << std::left << *_it_isl; _it_isl++; } else - os << setw(INNER) << left << " "; + os << std::setw(INNER) << std::left << " "; if (_it_jsl != vJSL.end()) { if (PRINT_NAMES) { - os << setw(JUNCT) << left << ((ostringstream&)(tmp << bstBinaryRecords->at(*_it_jsl).stationName)).str(); + os << std::setw(JUNCT) << std::left << ((ostringstream&)(tmp << bstBinaryRecords->at(*_it_jsl).stationName)).str(); tmp.str(""); } else - os << setw(JUNCT) << left << *_it_jsl; + os << std::setw(JUNCT) << std::left << *_it_jsl; _it_jsl++; } else - os << setw(JUNCT) << left << " "; + os << std::setw(JUNCT) << std::left << " "; if (_it_msr != vCML.end()) { if (PRINT_NAMES) { @@ -555,7 +555,7 @@ void dna_io_seg::write_seg_block(ostream &os, // Get all the stations associated with this measurement GetMsrStations(*bmsBinaryRecords, *_it_msr, msrStations); - os << left << bmsBinaryRecords->at(*_it_msr).measType << " ("; + os << std::left << bmsBinaryRecords->at(*_it_msr).measType << " ("; for_each(msrStations.begin(), msrStations.end(), [&os, &bstBinaryRecords](UINT32 stn){ @@ -567,14 +567,14 @@ void dna_io_seg::write_seg_block(ostream &os, if (bmsBinaryRecords->at(*_it_msr).clusterID > 0) os << "cluster " << bmsBinaryRecords->at(*_it_msr).clusterID; - os << endl; + os << std::endl; } else - os << setw(MEASR) << left << *_it_msr << setw(PAD) << left << bmsBinaryRecords->at(*_it_msr).measType << endl; + os << std::setw(MEASR) << std::left << *_it_msr << std::setw(PAD) << std::left << bmsBinaryRecords->at(*_it_msr).measType << std::endl; _it_msr++; } else - os << endl; + os << std::endl; // continue until all lists are exhausted if (_it_msr==vCML.end() && @@ -585,76 +585,76 @@ void dna_io_seg::write_seg_block(ostream &os, for (dash=INNER+JUNCT+MEASR+PAD; dash>0; dash--) os << "-"; - os << endl; + os << std::endl; } -void dna_io_seg::write_seg_file(const string& seg_filename, const string& bst_filename, const string& bms_filename, +void dna_io_seg::write_seg_file(const std::string& seg_filename, const std::string& bst_filename, const std::string& bms_filename, const UINT32& min_inner_stns, const UINT32& max_block_stns, - const string& seg_starting_stns, const vstring& vinitialStns, - const string& command_line_arguments, + const std::string& seg_starting_stns, const vstring& vinitialStns, + const std::string& command_line_arguments, vvUINT32& v_ISL, vvUINT32& v_JSL, vvUINT32& v_CML, vUINT32& v_ContiguousNetList, const pvstn_t bstBinaryRecords, const pvmsr_t bmsBinaryRecords) { std::ofstream seg_file; - stringstream ss; - ss << "write_seg_file(): An error was encountered when opening " << seg_filename << "." << endl; + std::stringstream ss; + ss << "write_seg_file(): An error was encountered when opening " << seg_filename << "." << std::endl; try { // Create segmentation file. Throws runtime_error on failure. file_opener(seg_file, seg_filename); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } // Print formatted header print_file_header(seg_file, "DYNADJUST SEGMENTATION OUTPUT FILE"); - seg_file << setw(PRINT_VAR_PAD) << left << "File name:" << system_complete(seg_filename).string() << endl << endl; + seg_file << std::setw(PRINT_VAR_PAD) << std::left << "File name:" << boost::filesystem::system_complete(seg_filename).string() << std::endl << std::endl; - seg_file << setw(PRINT_VAR_PAD) << left << "Command line arguments: "; - seg_file << command_line_arguments << endl << endl; + seg_file << std::setw(PRINT_VAR_PAD) << std::left << "Command line arguments: "; + seg_file << command_line_arguments << std::endl << std::endl; - seg_file << setw(PRINT_VAR_PAD) << left << "Stations file:" << system_complete(bst_filename).string() << endl; - seg_file << setw(PRINT_VAR_PAD) << left << "Measurements file:" << system_complete(bms_filename).string() << endl; + seg_file << std::setw(PRINT_VAR_PAD) << std::left << "Stations file:" << boost::filesystem::system_complete(bst_filename).string() << std::endl; + seg_file << std::setw(PRINT_VAR_PAD) << std::left << "Measurements file:" << boost::filesystem::system_complete(bms_filename).string() << std::endl; UINT32 b = 1; - seg_file << endl << setw(PRINT_VAR_PAD) << left << "Minimum inner stations" << min_inner_stns << endl; - seg_file << setw(PRINT_VAR_PAD) << left << "Block size threshold" << max_block_stns << endl; + seg_file << std::endl << std::setw(PRINT_VAR_PAD) << std::left << "Minimum inner stations" << min_inner_stns << std::endl; + seg_file << std::setw(PRINT_VAR_PAD) << std::left << "Block size threshold" << max_block_stns << std::endl; if (seg_starting_stns.size() == 1) - seg_file << setw(PRINT_VAR_PAD) << left << "Starting station" << seg_starting_stns.at(0) << endl; + seg_file << std::setw(PRINT_VAR_PAD) << std::left << "Starting station" << seg_starting_stns.at(0) << std::endl; else { - string s("Starting station(s)"); + std::string s("Starting station(s)"); for (b=0; b 0) - seg_file << endl; - seg_file << setw(PRINT_VAR_PAD) << left << s << + seg_file << std::endl; + seg_file << std::setw(PRINT_VAR_PAD) << std::left << s << vinitialStns.at(b); s = " "; } - seg_file << endl; + seg_file << std::endl; } - seg_file << OUTPUTLINE << endl << endl; - seg_file << setw(PRINT_VAR_PAD) << left << "SEGMENTATION SUMMARY" << endl << endl; - seg_file << setw(PRINT_VAR_PAD) << left << "No. blocks produced" << v_ISL.size() << endl; + seg_file << OUTPUTLINE << std::endl << std::endl; + seg_file << std::setw(PRINT_VAR_PAD) << std::left << "SEGMENTATION SUMMARY" << std::endl << std::endl; + seg_file << std::setw(PRINT_VAR_PAD) << std::left << "No. blocks produced" << v_ISL.size() << std::endl; char dash; for (dash=BLOCK+NETID+INNER+JUNCT+TOTAL+MEASR; dash>2; dash--) seg_file << "-"; - seg_file << endl; - seg_file << setw(BLOCK) << left << " Block" << setw(NETID) << left << "Network ID" - << setw(JUNCT) << left << "Junction stns" << setw(INNER) << left << "Inner stns" - << setw(MEASR) << left << "Measurements" << setw(TOTAL) << left << "Total stns" << endl; + seg_file << std::endl; + seg_file << std::setw(BLOCK) << std::left << " Block" << std::setw(NETID) << std::left << "Network ID" + << std::setw(JUNCT) << std::left << "Junction stns" << std::setw(INNER) << std::left << "Inner stns" + << std::setw(MEASR) << std::left << "Measurements" << std::setw(TOTAL) << std::left << "Total stns" << std::endl; it_vUINT32 _it_net(v_ContiguousNetList.begin()); it_vvUINT32 _it_isl(v_ISL.begin()), _it_jsl(v_JSL.begin()), _it_cml(v_CML.begin()); @@ -664,33 +664,33 @@ void dna_io_seg::write_seg_file(const string& seg_filename, const string& bst_fi for (; _it_isl!=v_ISL.end(); _it_isl++) { // block - seg_file << " " << setw(BLOCK-2) << left << b; + seg_file << " " << std::setw(BLOCK-2) << std::left << b; // network id - seg_file << setw(NETID) << left << *_it_net; + seg_file << std::setw(NETID) << std::left << *_it_net; // junction stns if (_it_jsl!=v_JSL.end()) - seg_file << setw(JUNCT) << left << _it_jsl->size(); + seg_file << std::setw(JUNCT) << std::left << _it_jsl->size(); else - seg_file << setw(JUNCT) << " "; + seg_file << std::setw(JUNCT) << " "; // inner stns - seg_file << setw(INNER) << left << _it_isl->size(); + seg_file << std::setw(INNER) << std::left << _it_isl->size(); // total measurements if (_it_cml!=v_CML.end()) - seg_file << setw(MEASR) << left << _it_cml->size(); + seg_file << std::setw(MEASR) << std::left << _it_cml->size(); else - seg_file << setw(MEASR) << " "; + seg_file << std::setw(MEASR) << " "; // total stns if (_it_jsl!=v_JSL.end()) - seg_file << setw(TOTAL) << left << (_it_isl->size() + _it_jsl->size()); + seg_file << std::setw(TOTAL) << std::left << (_it_isl->size() + _it_jsl->size()); else - seg_file << setw(TOTAL) << left << _it_isl->size(); + seg_file << std::setw(TOTAL) << std::left << _it_isl->size(); - seg_file << endl; + seg_file << std::endl; _it_jsl++; _it_cml++; @@ -700,10 +700,10 @@ void dna_io_seg::write_seg_file(const string& seg_filename, const string& bst_fi for (dash=BLOCK+NETID+INNER+JUNCT+TOTAL+MEASR; dash>2; dash--) seg_file << "-"; - seg_file << endl << endl << "INDIVIDUAL BLOCK DATA" << endl; + seg_file << std::endl << std::endl << "INDIVIDUAL BLOCK DATA" << std::endl; for (dash=BLOCK+NETID+INNER+JUNCT+TOTAL+MEASR; dash>2; dash--) seg_file << "-"; - seg_file << endl; + seg_file << std::endl; _it_isl = v_ISL.begin(); _it_jsl = v_JSL.begin(); @@ -717,27 +717,27 @@ void dna_io_seg::write_seg_file(const string& seg_filename, const string& bst_fi _it_cml++; } - seg_file << endl; + seg_file << std::endl; seg_file.close(); } -void dna_io_seg::write_stn_appearance(const string& sap_filename, const v_stn_block_map& stnAppearance) +void dna_io_seg::write_stn_appearance(const std::string& sap_filename, const v_stn_block_map& stnAppearance) { std::ofstream sap_file; - stringstream ss; - ss << "write_sap_file(): An error was encountered when opening " << sap_filename << "." << endl; + std::stringstream ss; + ss << "write_sap_file(): An error was encountered when opening " << sap_filename << "." << std::endl; try { // Create segmentation file. Throws runtime_error on failure. - file_opener(sap_file, sap_filename, ios::out | ios::binary, binary); + file_opener(sap_file, sap_filename, std::ios::out | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } // write the list @@ -755,22 +755,22 @@ void dna_io_seg::write_stn_appearance(const string& sap_filename, const v_stn_bl sap_file.close(); } -void dna_io_seg::load_stn_appearance(const string& sap_filename, v_stn_block_map& stnAppearance) +void dna_io_seg::load_stn_appearance(const std::string& sap_filename, v_stn_block_map& stnAppearance) { std::ifstream sap_file; - stringstream ss; - ss << "load_sap_file(): An error was encountered when opening " << sap_filename << "." << endl; + std::stringstream ss; + ss << "load_sap_file(): An error was encountered when opening " << sap_filename << "." << std::endl; try { // Create segmentation file. Throws runtime_error on failure. - file_opener(sap_file, sap_filename, ios::in | ios::binary, binary); + file_opener(sap_file, sap_filename, std::ios::in | std::ios::binary, binary); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } // write the list diff --git a/dynadjust/include/io/dnaioseg.hpp b/dynadjust/include/io/dnaioseg.hpp index d82e9452..9e00a052 100644 --- a/dynadjust/include/io/dnaioseg.hpp +++ b/dynadjust/include/io/dnaioseg.hpp @@ -47,13 +47,13 @@ class dna_io_seg : public dna_io_base dna_io_seg& operator=(const dna_io_seg& rhs); - void load_seg_file_header(const string& seg_filename, istream& seg_file, UINT32& blockCount, + void load_seg_file_header(const std::string& seg_filename, std::istream& seg_file, UINT32& blockCount, UINT32& blockThreshold, UINT32& minInnerStns); - void load_seg_file_header_f(const string& seg_filename, UINT32& blockCount, + void load_seg_file_header_f(const std::string& seg_filename, UINT32& blockCount, UINT32& blockThreshold, UINT32& minInnerStns); - void load_seg_file(const string& seg_filename, UINT32& blockCount, + void load_seg_file(const std::string& seg_filename, UINT32& blockCount, UINT32& blockThreshold, UINT32& minInnerStns, vvUINT32& v_ISL, vvUINT32& v_JSL, vvUINT32& v_CML, bool loadMetrics, @@ -65,23 +65,23 @@ class dna_io_seg : public dna_io_base const vvUINT32& paramStationList, vASL& assocStnList); - void write_seg_block(ostream &os, + void write_seg_block(std::ostream &os, const vUINT32& vISL, const vUINT32& vJSL, const vUINT32& vCML, const UINT32& currentBlock, const vstn_t* bstBinaryRecords, const vmsr_t* bmsBinaryRecords, bool PRINT_NAMES=false); - void write_seg_file(const string& seg_filename, const string& bst_filename, const string& bms_filename, + void write_seg_file(const std::string& seg_filename, const std::string& bst_filename, const std::string& bms_filename, const UINT32& min_inner_stns, const UINT32& max_block_stns, - const string& seg_starting_stns, const vstring& vinitialStns, - const string& command_line_arguments, + const std::string& seg_starting_stns, const vstring& vinitialStns, + const std::string& command_line_arguments, vvUINT32& v_ISL, vvUINT32& v_JSL, vvUINT32& v_CML, vUINT32& v_ContiguousNetList, const pvstn_t bstBinaryRecords, const pvmsr_t bmsBinaryRecords); void build_free_stn_availability(vASL& assocStnList, v_freestn_pair& freeStnList); - void write_stn_appearance(const string& sap_filename, const v_stn_block_map& stnAppearance); - void load_stn_appearance(const string& sap_filename, v_stn_block_map& stnAppearance); + void write_stn_appearance(const std::string& sap_filename, const v_stn_block_map& stnAppearance); + void load_stn_appearance(const std::string& sap_filename, v_stn_block_map& stnAppearance); protected: diff --git a/dynadjust/include/io/dnaiosnx.hpp b/dynadjust/include/io/dnaiosnx.hpp index a016669f..cee40ebe 100644 --- a/dynadjust/include/io/dnaiosnx.hpp +++ b/dynadjust/include/io/dnaiosnx.hpp @@ -41,8 +41,6 @@ using namespace dynadjust::math; using namespace dynadjust::datum_parameters; using namespace dynadjust::measurements; -using namespace boost::local_time; - namespace dynadjust { namespace iostreams { @@ -60,7 +58,7 @@ typedef enum _SINEX_WARN_TYPE_ //T2 formatted_name; //T2 formatted_date; //T3 last_occurrence; -template +template struct site_id_tuple_t { T1 file_index; @@ -89,8 +87,8 @@ struct site_id_tuple_t }; // Now create types for the site_id variable, container and iterator -typedef site_id_tuple_t site_id; -typedef vector v_site_id_tuple, *pv_v_site_id_tuple; +typedef site_id_tuple_t site_id; +typedef std::vector v_site_id_tuple, *pv_v_site_id_tuple; typedef v_site_id_tuple::iterator _it_vsite_id_tuple; // Used to sort site tuples by file order @@ -111,7 +109,7 @@ class CompareSiteTuplesByName { public: bool operator()(const T& left, const T& right) { // if the station names are equal - if (equals(left.site_name, right.site_name)) + if (boost::equals(left.site_name, right.site_name)) // sort on file order return left.file_index < right.file_index; // sort on station name @@ -121,7 +119,7 @@ class CompareSiteTuplesByName { ///////////////////////////////////////////////////////////// // Custom struct to manage site discontinuities -template +template struct discontinuity_tuple_t { T1 file_index; @@ -133,7 +131,7 @@ struct discontinuity_tuple_t discontinuity_tuple_t() : file_index(0), solution_id(0), site_name("") - , date_start(date(TIME_IMMEMORIAL, 1, 1)), date_end(date(TIME_IMMEMORIAL, 1, 1)), discontinuity_exists(false) {} + , date_start(boost::gregorian::date(TIME_IMMEMORIAL, 1, 1)), date_end(boost::gregorian::date(TIME_IMMEMORIAL, 1, 1)), discontinuity_exists(false) {} discontinuity_tuple_t(const T1& index, const T1& solution, const T2& name, const T3& from, const T3& to, const T4& discontinuity) : file_index(index), solution_id(solution), site_name(name) @@ -150,8 +148,8 @@ struct discontinuity_tuple_t }; // Now create types for the site_id variable, container and iterator -typedef discontinuity_tuple_t discontinuity_tuple; -typedef vector v_discontinuity_tuple, *pv_v_discontinuity_tuple; +typedef discontinuity_tuple_t discontinuity_tuple; +typedef std::vector v_discontinuity_tuple, *pv_v_discontinuity_tuple; typedef v_discontinuity_tuple::iterator _it_vdiscontinuity_tuple; template @@ -160,7 +158,7 @@ bool rename_discont_station(T& begin, S& site_name, D& site_date, S& site_rename UINT32 doy, year; // find the next occurrence of this site - while (equals(site_name, begin->site_name)) + while (boost::equals(site_name, begin->site_name)) { // Check if discontinuities exist at this site, if not, skip if (!begin->discontinuity_exists) @@ -173,7 +171,7 @@ bool rename_discont_station(T& begin, S& site_name, D& site_date, S& site_rename if (site_date >= begin->date_start && site_date < begin->date_end) { - stringstream ss; + std::stringstream ss; doy = begin->date_start.day_of_year(); year = begin->date_start.year(); ss << site_name << "_"; @@ -217,7 +215,7 @@ struct CompareDiscontinuityOnSite template T binary_search_discontinuity_site(T begin, T end, S value) { - T i = lower_bound(begin, end, value, CompareDiscontinuityOnSite()); + T i = lower_bound(begin, end, value, CompareDiscontinuityOnSite()); if (i != end && i->site_name == value) return i; else @@ -254,17 +252,17 @@ class dna_io_snx : public dna_io_base dna_io_snx& operator=(const dna_io_snx& rhs); - stringstream parse_date_from_string(const string& date_str, DATE_FORMAT_TYPE date_type, DATE_TERMINAL_TYPE terminal_type, const string& separator); - stringstream parse_date_from_yy_doy(const UINT32& yy, const UINT32& doy, DATE_FORMAT_TYPE date_type, const string& separator); + std::stringstream parse_date_from_string(const std::string& date_str, DATE_FORMAT_TYPE date_type, DATE_TERMINAL_TYPE terminal_type, const std::string& separator); + std::stringstream parse_date_from_yy_doy(const UINT32& yy, const UINT32& doy, DATE_FORMAT_TYPE date_type, const std::string& separator); - void parse_sinex(std::ifstream** snx_file, const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, + void parse_sinex(std::ifstream** snx_file, const std::string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, StnTally& parsestn_tally, MsrTally& parsemsr_tally, UINT32& fileOrder, CDnaDatum& datum, bool applyDiscontinuities, v_discontinuity_tuple* stn_discontinuities_, bool& m_discontsSortedbyName, UINT32& lineNo, UINT32& columnNo, _PARSE_STATUS_& parseStatus); - void parse_discontinuity_file(std::ifstream* snx_file, const string& fileName, + void parse_discontinuity_file(std::ifstream* snx_file, const std::string& fileName, v_discontinuity_tuple* stn_discontinuities_, bool& m_discontsSortedbyName, UINT32& lineNo, UINT32& columnNo, _PARSE_STATUS_& parseStatus); @@ -278,7 +276,7 @@ class dna_io_snx : public dna_io_base inline bool warnings_exist() { return !warningMessages_.empty(); } - void print_warnings(std::ofstream* warning_file, const string& fileName); + void print_warnings(std::ofstream* warning_file, const std::string& fileName); protected: @@ -325,9 +323,9 @@ class dna_io_snx : public dna_io_base void serialise_solution_variances(std::ofstream* snx_file, matrix_2d* variances); void print_line(std::ofstream* snx_file); - //string format_exponent(string value); + //string format_exponent(std::string value); void print_matrix_index(std::ofstream* snx_file, const UINT32& row, const UINT32& col); - void add_warning(const string& message, SINEX_WARN_TYPE warning); + void add_warning(const std::string& message, SINEX_WARN_TYPE warning); UINT32 blockCount_; UINT32 block_; @@ -338,9 +336,9 @@ class dna_io_snx : public dna_io_base uint32_uint32_map* blockStationsMap_; vUINT32* blockStations_; - vector warningMessages_; + std::vector warningMessages_; - date averageEpoch_; + boost::gregorian::date averageEpoch_; UINT32 uniqueStationCount_; bool containsVelocities_; diff --git a/dynadjust/include/io/dnaiosnxread.cpp b/dynadjust/include/io/dnaiosnxread.cpp index 112fab1b..294d5c38 100644 --- a/dynadjust/include/io/dnaiosnxread.cpp +++ b/dynadjust/include/io/dnaiosnxread.cpp @@ -28,7 +28,7 @@ namespace dynadjust { namespace iostreams { -void dna_io_snx::parse_sinex(std::ifstream** snx_file, const string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, +void dna_io_snx::parse_sinex(std::ifstream** snx_file, const std::string& fileName, vdnaStnPtr* vStations, PUINT32 stnCount, vdnaMsrPtr* vMeasurements, PUINT32 msrCount, PUINT32 clusterID, StnTally& parsestn_tally, MsrTally& parsemsr_tally, UINT32& fileOrder, CDnaDatum& datum, bool applyDiscontinuities, @@ -52,9 +52,9 @@ void dna_io_snx::parse_sinex(std::ifstream** snx_file, const string& fileName, v // read header line and extract epoch if (!parse_sinex_header(snx_file, datum, lineNo)) { - stringstream ss; - ss << "parse_sinex(): The SINEX file " << fileName << " did not contain a header record." << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "parse_sinex(): The SINEX file " << fileName << " did not contain a header record." << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } try { @@ -65,24 +65,24 @@ void dna_io_snx::parse_sinex(std::ifstream** snx_file, const string& fileName, v stn_discontinuities, m_discontsSortedbyName, fileOrder, lineNo, columnNo); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if ((*snx_file)->eof()) return; - stringstream ss; - ss << "parse_sinex(): An error was encountered when attempting to read SINEX file " << fileName << "." << endl << " " << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "parse_sinex(): An error was encountered when attempting to read SINEX file " << fileName << "." << std::endl << " " << f.what(); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& f) { - stringstream ss; + catch (const std::runtime_error& f) { + std::stringstream ss; ss << " - line " << lineNo; - ss << ", column " << columnNo << endl; + ss << ", column " << columnNo << std::endl; ss << " - " << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } -void dna_io_snx::parse_discontinuity_file(std::ifstream* snx_file, const string& fileName, +void dna_io_snx::parse_discontinuity_file(std::ifstream* snx_file, const std::string& fileName, v_discontinuity_tuple* stn_discontinuities, bool& m_discontsSortedbyName, UINT32& lineNo, UINT32& columnNo, _PARSE_STATUS_& parseStatus) { @@ -96,7 +96,7 @@ void dna_io_snx::parse_discontinuity_file(std::ifstream* snx_file, const string& containsVelocities_ = false; containsDiscontinuities_ = false; - string sBuf, tmp; + std::string sBuf, tmp; try { // As the purpose of the discontinuity file is to provide dates on when discontinuities occur, @@ -110,7 +110,7 @@ void dna_io_snx::parse_discontinuity_file(std::ifstream* snx_file, const string& getline((*snx_file), sBuf); // End of data? - if (iequals(sBuf.substr(0, 7), ENDSNX)) + if (boost::iequals(sBuf.substr(0, 7), ENDSNX)) break; try { @@ -121,34 +121,34 @@ void dna_io_snx::parse_discontinuity_file(std::ifstream* snx_file, const string& lineNo, columnNo); } catch (...) { - stringstream ss; - ss << "parse_sinex_data(): Could not extract data from the record: " << endl << " " << sBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "parse_sinex_data(): Could not extract data from the record: " << std::endl << " " << sBuf << "."; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if (snx_file->eof()) return; - stringstream ss; - ss << "parse_discontinuity_file(): An error was encountered when attempting to read SINEX file " << fileName << "." << endl << " " << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "parse_discontinuity_file(): An error was encountered when attempting to read SINEX file " << fileName << "." << std::endl << " " << f.what(); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& f) { - stringstream ss; + catch (const std::runtime_error& f) { + std::stringstream ss; ss << " - line " << lineNo; - ss << ", column " << columnNo << endl; + ss << ", column " << columnNo << std::endl; ss << " - " << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } // Expects yy as two digit year, and doy as three digit day of year -stringstream dna_io_snx::parse_date_from_yy_doy(const UINT32& yy, const UINT32& doy, DATE_FORMAT_TYPE date_type, const string& separator) +std::stringstream dna_io_snx::parse_date_from_yy_doy(const UINT32& yy, const UINT32& doy, DATE_FORMAT_TYPE date_type, const std::string& separator) { - stringstream ss_doy, ss_year, ss_date; + std::stringstream ss_doy, ss_year, ss_date; // format the day of year so that boost date_input_facet is happy if (doy < 100) @@ -201,7 +201,7 @@ stringstream dna_io_snx::parse_date_from_yy_doy(const UINT32& yy, const UINT32& } // date is a string "YY:DDD:SSSSS" -stringstream dna_io_snx::parse_date_from_string(const string& date_str, DATE_FORMAT_TYPE date_type, DATE_TERMINAL_TYPE terminal_type, const string& separator) +std::stringstream dna_io_snx::parse_date_from_string(const std::string& date_str, DATE_FORMAT_TYPE date_type, DATE_TERMINAL_TYPE terminal_type, const std::string& separator) { // Year UINT32 yy = LongFromString(date_str.substr(0, 2)); @@ -211,8 +211,8 @@ stringstream dna_io_snx::parse_date_from_string(const string& date_str, DATE_FOR if (yy == 0 && doy == 0) { - date today(day_clock::local_day()); - stringstream date_ss; + boost::gregorian::date today(boost::gregorian::day_clock::local_day()); + std::stringstream date_ss; switch (terminal_type) { @@ -242,18 +242,18 @@ bool dna_io_snx::parse_sinex_header(std::ifstream** snx_file, CDnaDatum& datum, return false; } - string sBuf, sinex_code; + std::string sBuf, sinex_code; UINT32 average_year, average_doy; - stringstream ss; + std::stringstream ss; lineNo++; try { getline((**snx_file), sBuf); } catch (...) { - ss << "parse_sinex_header(): Could not read from the SINEX file. " << endl << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << "parse_sinex_header(): Could not read from the SINEX file. " << std::endl << "."; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } try { @@ -266,13 +266,13 @@ bool dna_io_snx::parse_sinex_header(std::ifstream** snx_file, CDnaDatum& datum, average_year, average_doy); - ss = parse_date_from_yy_doy(average_year, average_doy, doy_yyyy, string(" ")); - datum.SetEpoch(dateFromStringstream_doy_year(ss)); + ss = parse_date_from_yy_doy(average_year, average_doy, doy_yyyy, std::string(" ")); + datum.SetEpoch(dateFromStringstream_doy_year(ss)); } catch (...) { - ss << "parse_sinex_header(): Could not extract date and time information from the header record: " << endl << " " << sBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << "parse_sinex_header(): Could not extract date and time information from the header record: " << std::endl << " " << sBuf << "."; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } return true; @@ -285,7 +285,7 @@ void dna_io_snx::parse_sinex_data(std::ifstream** snx_file, vdnaStnPtr* vStation v_discontinuity_tuple* stn_discontinuities, bool& m_discontsSortedbyName, UINT32& fileOrder, UINT32& lineNo, UINT32& columnNo) { - string sBuf, tmp; + std::string sBuf, tmp; vStations->clear(); vMeasurements->clear(); @@ -299,7 +299,7 @@ void dna_io_snx::parse_sinex_data(std::ifstream** snx_file, vdnaStnPtr* vStation getline((**snx_file), sBuf); // End of data? - if (iequals(sBuf.substr(0, 7), ENDSNX)) + if (boost::iequals(sBuf.substr(0, 7), ENDSNX)) break; try { @@ -308,16 +308,16 @@ void dna_io_snx::parse_sinex_data(std::ifstream** snx_file, vdnaStnPtr* vStation parse_sinex_block(snx_file, sBuf.c_str(), vStations, stnCount, vMeasurements, msrCount, clusterID, parsestn_tally, parsemsr_tally, datum, fileOrder, lineNo, columnNo); } - catch (runtime_error& e) { - stringstream ss; - ss << "parse_sinex_data(): Error parsing SINEX file: " << endl << + catch (std::runtime_error& e) { + std::stringstream ss; + ss << "parse_sinex_data(): Error parsing SINEX file: " << std::endl << " " << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - stringstream ss; - ss << "parse_sinex_data(): Could not extract data from the record: " << endl << " " << sBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "parse_sinex_data(): Could not extract data from the record: " << std::endl << " " << sBuf << "."; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } @@ -333,23 +333,23 @@ void dna_io_snx::format_station_names(v_discontinuity_tuple* stn_discontinuities vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements) { UINT32 site, doy, year; - string site_name; + std::string site_name; #ifdef _MSDEBUG - string date_str; + std::string date_str; #endif _it_vdiscontinuity_tuple _it_discont(stn_discontinuities->end()), _it_discont_site; - date site_date; + boost::gregorian::date site_date; if (!m_discontsSortedbyName) { - sort(stn_discontinuities->begin(), stn_discontinuities->end(), + std::sort(stn_discontinuities->begin(), stn_discontinuities->end(), CompareSiteTuplesByName()); m_discontsSortedbyName = true; } - sort(siteOccurrence_.begin(), siteOccurrence_.end(), + std::sort(siteOccurrence_.begin(), siteOccurrence_.end(), CompareSiteTuplesByName()); _it_discont = stn_discontinuities->begin(); @@ -363,7 +363,7 @@ void dna_io_snx::format_station_names(v_discontinuity_tuple* stn_discontinuities // 2. the first occurrence of discontinuity for site_name // To prevent searching through the entire array again on 2. , check if // _it_discont->site_name = site_name - if (!equals(site_name, _it_discont->site_name)) + if (!boost::equals(site_name, _it_discont->site_name)) { // Save the iterator _it_discont_site = _it_discont; @@ -384,7 +384,7 @@ void dna_io_snx::format_station_names(v_discontinuity_tuple* stn_discontinuities continue; // Capture the (start date of the site) - site_date = dateFromString_doy_year(siteOccurrence_.at(site).formatted_date); + site_date = dateFromString_doy_year(siteOccurrence_.at(site).formatted_date); #ifdef _MSDEBUG //date_str = stringFromDate(_it_discont->date_start, "%y:%j:00000"); @@ -392,14 +392,14 @@ void dna_io_snx::format_station_names(v_discontinuity_tuple* stn_discontinuities _it_discont_site = _it_discont; // find the next occurrence of this site - while (equals(site_name, _it_discont_site->site_name)) + while (boost::equals(site_name, _it_discont_site->site_name)) { // Test if the start epoch of this site is within this discontinuity window if (site_date >= _it_discont_site->date_start && site_date < _it_discont_site->date_end) // if (siteOccurrence_.at(site).solution_id == _it_discont_site->solution_id) { - stringstream ss; + std::stringstream ss; doy = _it_discont_site->date_start.day_of_year(); year = _it_discont_site->date_start.year(); ss << siteOccurrence_.at(site).site_name << "_"; @@ -424,21 +424,21 @@ void dna_io_snx::format_station_names(v_discontinuity_tuple* stn_discontinuities if (siteOccurrence_.size() != vStations->size() || siteOccurrence_.size() != vMeasurements->at(0)->GetTotal()) { - stringstream ss; + std::stringstream ss; ss << "format_station_names(): Inconsistent number of stations in SINEX file."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } _it_vsite_id_tuple _it_site(siteOccurrence_.begin()); // sort on file index (default sort) - sort(siteOccurrence_.begin(), siteOccurrence_.end(), + std::sort(siteOccurrence_.begin(), siteOccurrence_.end(), CompareSiteTuples()); // Now update station vector for_each(vStations->begin(), vStations->end(), [&_it_site](const dnaStnPtr& stn) { - if (!equals(_it_site->site_name, _it_site->formatted_name)) + if (!boost::equals(_it_site->site_name, _it_site->formatted_name)) { stn->SetOriginalName(); stn->SetName(_it_site->formatted_name); @@ -450,12 +450,12 @@ void dna_io_snx::format_station_names(v_discontinuity_tuple* stn_discontinuities _it_site = siteOccurrence_.begin(); _it_vdnamsrptr _it_msr(vMeasurements->begin()); - vector* vgpsPnts(_it_msr->get()->GetPoints_ptr()); + std::vector* vgpsPnts(_it_msr->get()->GetPoints_ptr()); // Now update measurement vector for_each(vgpsPnts->begin(), vgpsPnts->end(), [&_it_site](CDnaGpsPoint& pnt) { - if (!equals(_it_site->site_name, _it_site->formatted_name)) + if (!boost::equals(_it_site->site_name, _it_site->formatted_name)) pnt.SetFirst(_it_site->formatted_name); _it_site++; }); @@ -527,11 +527,11 @@ void dna_io_snx::parse_sinex_discontinuities(std::ifstream* snx_file, v_discontinuity_tuple* stn_discontinuities, bool& m_discontsSortedbyName, UINT32& lineNo, UINT32& columnNo) { - string sBuf("+"), stn, stn_prev(""), model; + std::string sBuf("+"), stn, stn_prev(""), model; UINT32 file_rec(0), solution_id; - date discont_start_date, discont_end_date; + boost::gregorian::date discont_start_date, discont_end_date; - stringstream ss, discont_from, discont_to; + std::stringstream ss, discont_from, discont_to; stn_discontinuities->clear(); m_discontsSortedbyName = false; @@ -553,7 +553,7 @@ void dna_io_snx::parse_sinex_discontinuities(std::ifstream* snx_file, stn = trimstr(sBuf.substr(1, 4)); // station name // solution ID - solution_id = val_uint( + solution_id = val_uint( trimstr(sBuf.substr(9, 4))); // solution id // model @@ -568,7 +568,7 @@ void dna_io_snx::parse_sinex_discontinuities(std::ifstream* snx_file, model = trimstr(sBuf.substr(42, 1)); // model // Is this a discontinuity in position? If not, continue to next - if (!iequals(model, "P")) + if (!boost::iequals(model, "P")) continue; // If there are multiple solutions, then there must be a discontinuity, but only if @@ -588,17 +588,17 @@ void dna_io_snx::parse_sinex_discontinuities(std::ifstream* snx_file, // the sequence of time series. // start epoch (yy:doy:sssss) - discont_from = parse_date_from_string(trimstr(sBuf.substr(16, 6)), doy_yyyy, date_from, string(" ")); - discont_start_date = dateFromStringstream_doy_year(discont_from); + discont_from = parse_date_from_string(trimstr(sBuf.substr(16, 6)), doy_yyyy, date_from, std::string(" ")); + discont_start_date = dateFromStringstream_doy_year(discont_from); // end epoch (yy:doy:sssss) - discont_to = parse_date_from_string(trimstr(sBuf.substr(29, 6)), doy_yyyy, date_to, string(" ")); - discont_end_date = dateFromStringstream_doy_year(discont_to); + discont_to = parse_date_from_string(trimstr(sBuf.substr(29, 6)), doy_yyyy, date_to, std::string(" ")); + discont_end_date = dateFromStringstream_doy_year(discont_to); //////////////////////////////////////////////////////////////////////////////////////////// stn_discontinuities->push_back( - discontinuity_tuple_t( + discontinuity_tuple_t( file_rec, // file_index solution_id, // solution_id stn, // site_name @@ -612,8 +612,8 @@ void dna_io_snx::parse_sinex_discontinuities(std::ifstream* snx_file, catch (...) { ss.str(""); columnNo = 1; - ss << "parse_sinex_discontinuities(): Could not extract station name from the record: " << endl << " " << sBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << "parse_sinex_discontinuities(): Could not extract station name from the record: " << std::endl << " " << sBuf << "."; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } @@ -622,7 +622,7 @@ void dna_io_snx::parse_sinex_discontinuities(std::ifstream* snx_file, return; // sort the station discontinuities on station name - sort(stn_discontinuities->begin(), stn_discontinuities->end(), + std::sort(stn_discontinuities->begin(), stn_discontinuities->end(), CompareSiteTuplesByName()); // Identify if discontinuity exists (by equal station names) and @@ -637,7 +637,7 @@ void dna_io_snx::parse_sinex_discontinuities(std::ifstream* snx_file, break; // Are station names equal? - if (equals(it_discont->site_name, it_discont_next->site_name)) + if (boost::equals(it_discont->site_name, it_discont_next->site_name)) { // Then this is a discontinuity site! it_discont->discontinuity_exists = true; @@ -646,7 +646,7 @@ void dna_io_snx::parse_sinex_discontinuities(std::ifstream* snx_file, } // re-sort the station discontinuities back to the original file order - sort(stn_discontinuities->begin(), stn_discontinuities->end(), + std::sort(stn_discontinuities->begin(), stn_discontinuities->end(), CompareSiteTuples()); m_discontsSortedbyName = false; } @@ -655,7 +655,7 @@ void dna_io_snx::parse_sinex_discontinuities(std::ifstream* snx_file, // Read sites void dna_io_snx::parse_sinex_sites(std::ifstream** snx_file, UINT32& lineNo, UINT32& columnNo) { - string sBuf("+"), stn, domes; + std::string sBuf("+"), stn, domes; // Has the SOLUTION/EPOCHS block already been read? If so, no need // to continue with this block - just skip to the end. @@ -674,7 +674,7 @@ void dna_io_snx::parse_sinex_sites(std::ifstream** snx_file, UINT32& lineNo, UIN siteOccurrence_.clear(); UINT32 file_rec(0); - stringstream ss; + std::stringstream ss; while (sBuf.at(0) != '-') { @@ -697,7 +697,7 @@ void dna_io_snx::parse_sinex_sites(std::ifstream** snx_file, UINT32& lineNo, UIN // set default values (amended later) siteOccurrence_.push_back( - site_id_tuple_t( + site_id_tuple_t( file_rec, // file_index, 1, // solution_id (set to 1 since SITE/ID doesn't hold solution_id) stn, // station name @@ -711,8 +711,8 @@ void dna_io_snx::parse_sinex_sites(std::ifstream** snx_file, UINT32& lineNo, UIN catch (...) { ss.str(""); columnNo = 1; - ss << "parse_sinex_discontinuities(): Could not extract station name from the record: " << endl << " " << sBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << "parse_sinex_discontinuities(): Could not extract station name from the record: " << std::endl << " " << sBuf << "."; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } @@ -725,10 +725,10 @@ void dna_io_snx::parse_sinex_sites(std::ifstream** snx_file, UINT32& lineNo, UIN // Read station epochs void dna_io_snx::parse_sinex_epochs(std::ifstream** snx_file, UINT32& lineNo, UINT32& columnNo) { - string sBuf("+"), stn, site, date_start; + std::string sBuf("+"), stn, site, date_start; UINT32 file_rec(0), solution_id; - stringstream ss; + std::stringstream ss; if (!siteIDsRead_) siteOccurrence_.clear(); @@ -750,15 +750,15 @@ void dna_io_snx::parse_sinex_epochs(std::ifstream** snx_file, UINT32& lineNo, UI // station stn = trimstr(sBuf.substr(1, 4)); // solution ID - solution_id = val_uint(trimstr(sBuf.substr(9, 4))); + solution_id = val_uint(trimstr(sBuf.substr(9, 4))); // Get start epoch (yy:doy:sssss) of data window used to process this site - date_start = parse_date_from_string(trimstr(sBuf.substr(16, 6)), doy_yyyy, date_from, string(" ")).str(); + date_start = parse_date_from_string(trimstr(sBuf.substr(16, 6)), doy_yyyy, date_from, std::string(" ")).str(); } catch (...) { ss.str(""); columnNo = 1; - ss << "parse_sinex_epochs(): Could not extract station name from the record: " << endl << " " << sBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << "parse_sinex_epochs(): Could not extract station name from the record: " << std::endl << " " << sBuf << "."; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } // Perform some file consistency checks @@ -772,23 +772,23 @@ void dna_io_snx::parse_sinex_epochs(std::ifstream** snx_file, UINT32& lineNo, UI catch (...) { ss.str(""); columnNo = 1; - ss << "parse_sinex_epochs(): The number of sites in SITE/ID and SOLUTION/EPOCHS" << endl << - " is inconsistent: " << endl << - " " << "SITE/ID block has " << siteOccurrence_.size() << " sites" << endl << - " " << "SOLUTION/EPOCHS block contains additional sites not listed in SITE/ID. Next record is:" << endl << + ss << "parse_sinex_epochs(): The number of sites in SITE/ID and SOLUTION/EPOCHS" << std::endl << + " is inconsistent: " << std::endl << + " " << "SITE/ID block has " << siteOccurrence_.size() << " sites" << std::endl << + " " << "SOLUTION/EPOCHS block contains additional sites not listed in SITE/ID. Next record is:" << std::endl << " " << sBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - if (!equals(site, stn)) + if (!boost::equals(site, stn)) { ss.str(""); columnNo = 1; - ss << "parse_sinex_epochs(): The order of sites in SITE/ID and SOLUTION/EPOCHS" << endl << - " is inconsistent: " << endl << - " " << "Index " << file_rec << " in SITE/ID block is " << siteOccurrence_.at(file_rec).site_name << endl << + ss << "parse_sinex_epochs(): The order of sites in SITE/ID and SOLUTION/EPOCHS" << std::endl << + " is inconsistent: " << std::endl << + " " << "Index " << file_rec << " in SITE/ID block is " << siteOccurrence_.at(file_rec).site_name << std::endl << " " << "Index " << file_rec << " in SOLUTION/EPOCHS block is " << stn << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } @@ -805,7 +805,7 @@ void dna_io_snx::parse_sinex_epochs(std::ifstream** snx_file, UINT32& lineNo, UI { // Create new elements and add to the vector siteOccurrence_.push_back( - site_id_tuple_t( + site_id_tuple_t( file_rec, // file_index, solution_id, // solution_id stn, // station name @@ -820,9 +820,9 @@ void dna_io_snx::parse_sinex_epochs(std::ifstream** snx_file, UINT32& lineNo, UI catch (...) { ss.str(""); columnNo = 1; - ss << "parse_sinex_epochs(): Failed to add a new record to the site occurrence list." << endl << + ss << "parse_sinex_epochs(): Failed to add a new record to the site occurrence list." << std::endl << " " << sBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } @@ -835,7 +835,7 @@ void dna_io_snx::parse_sinex_epochs(std::ifstream** snx_file, UINT32& lineNo, UI void dna_io_snx::reduce_sinex_sites() { // sort the sites on station name - sort(siteOccurrence_.begin(), siteOccurrence_.end(), + std::sort(siteOccurrence_.begin(), siteOccurrence_.end(), CompareSiteTuplesByName()); // Identify if discontinuity exists from internal evidence (i.e. equal station names). If so, @@ -857,7 +857,7 @@ void dna_io_snx::reduce_sinex_sites() // if this station occurs again: // - increment the next occurrence of it // - set the index of the first occurrence - if (equals(it_site->site_name, it_site_next->site_name)) + if (boost::equals(it_site->site_name, it_site_next->site_name)) { // increment next occurrence. Note, if SOLUTION/EPOCHS block has been read, // this will have already been set @@ -874,7 +874,7 @@ void dna_io_snx::reduce_sinex_sites() } // sort on file index (default sort) - sort(siteOccurrence_.begin(), siteOccurrence_.end(), + std::sort(siteOccurrence_.begin(), siteOccurrence_.end(), CompareSiteTuples()); } @@ -882,18 +882,18 @@ void dna_io_snx::parse_sinex_stn(std::ifstream** snx_file, const char* sinexRec, StnTally& parsestn_tally, CDnaDatum& datum, UINT32& fileOrder, UINT32& lineNo, UINT32& columnNo) { - stringstream ss; + std::stringstream ss; if (applyDiscontinuities_ && !solutionEpochsRead_) { ss.str(""); - ss << "parse_sinex_stn(): Cannot apply discontinuities to the stations" << endl << - " if the station epochs have not been loaded beforehand. To rectify this problem," << endl << + ss << "parse_sinex_stn(): Cannot apply discontinuities to the stations" << std::endl << + " if the station epochs have not been loaded beforehand. To rectify this problem," << std::endl << " reformat the SINEX file so that the +SOLUTION/EPOCHS block appears before the +SOLUTION/ESTIMATE block."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - string sBuf(sinexRec), site, tmp, stn; + std::string sBuf(sinexRec), site, tmp, stn; dnaStnPtr stn_ptr; UINT32 yy, doy, file_rec(0); @@ -940,25 +940,25 @@ void dna_io_snx::parse_sinex_stn(std::ifstream** snx_file, const char* sinexRec, yy = LongFromString(sBuf.substr(27, 2)), doy = LongFromString(sBuf.substr(30, 3)), - ss = parse_date_from_yy_doy(yy, doy, doy_yyyy, string(" ")); - stn_ptr->SetEpoch(stringFromDate(dateFromStringstream_doy_year(ss))); + ss = parse_date_from_yy_doy(yy, doy, doy_yyyy, std::string(" ")); + stn_ptr->SetEpoch(stringFromDate(dateFromStringstream_doy_year(ss))); stn_ptr->SetfileOrder(fileOrder++); stn_ptr->SetXAxis_d(DoubleFromString(trimstr(sBuf.substr(47, 21)))); stn_ptr->SetXAxisStdDev_d(DoubleFromString(trimstr(sBuf.substr(68, 12)))); } - catch (const runtime_error& f) { + catch (const std::runtime_error& f) { ss.str(""); ss << " - line " << lineNo; - ss << ", column " << columnNo << endl; + ss << ", column " << columnNo << std::endl; ss << " - " << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { ss.str(""); columnNo = 47; - ss << "parse_sinex_stn(): Could not extract X coordinate estimate from the record: " << endl << " " << sBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << "parse_sinex_stn(): Could not extract X coordinate estimate from the record: " << std::endl << " " << sBuf << "."; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } continue; } @@ -972,23 +972,23 @@ void dna_io_snx::parse_sinex_stn(std::ifstream** snx_file, const char* sinexRec, catch (...) { ss.str(""); columnNo = 1; - ss << "parse_sinex_stn(): The number of sites in SOLUTION/EPOCHS and SOLUTION/ESTIMATE" << endl << - " is inconsistent: " << endl << - " " << "SOLUTION/EPOCHS block has " << siteOccurrence_.size() << " sites" << endl << - " " << "SOLUTION/ESTIMATE block contains additional sites not listed in SOLUTION/EPOCHS. Next record is:" << endl << + ss << "parse_sinex_stn(): The number of sites in SOLUTION/EPOCHS and SOLUTION/ESTIMATE" << std::endl << + " is inconsistent: " << std::endl << + " " << "SOLUTION/EPOCHS block has " << siteOccurrence_.size() << " sites" << std::endl << + " " << "SOLUTION/ESTIMATE block contains additional sites not listed in SOLUTION/EPOCHS. Next record is:" << std::endl << " " << sBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - if (!equals(site, stn)) + if (!boost::equals(site, stn)) { ss.str(""); columnNo = 1; - ss << "parse_sinex_stn(): The order of sites in SOLUTION/EPOCHS and SOLUTION/ESTIMATE" << endl << - " is inconsistent: " << endl << - " " << "Index " << file_rec << " in SOLUTION/EPOCHS block is " << siteOccurrence_.at(file_rec).site_name << endl << + ss << "parse_sinex_stn(): The order of sites in SOLUTION/EPOCHS and SOLUTION/ESTIMATE" << std::endl << + " is inconsistent: " << std::endl << + " " << "Index " << file_rec << " in SOLUTION/EPOCHS block is " << siteOccurrence_.at(file_rec).site_name << std::endl << " " << "Index " << file_rec << " in SOLUTION/ESTIMATE block is " << stn << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } // Capture the Y coordinate @@ -1001,8 +1001,8 @@ void dna_io_snx::parse_sinex_stn(std::ifstream** snx_file, const char* sinexRec, catch (...) { ss.str(""); columnNo = 47; - ss << "parse_sinex_stn(): Could not extract Y coordinate estimate from the record: " << endl << " " << sBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << "parse_sinex_stn(): Could not extract Y coordinate estimate from the record: " << std::endl << " " << sBuf << "."; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } continue; } @@ -1017,8 +1017,8 @@ void dna_io_snx::parse_sinex_stn(std::ifstream** snx_file, const char* sinexRec, catch (...) { ss.str(""); columnNo = 47; - ss << "parse_sinex_stn(): Could not extract Z coordinate estimate from the record: " << endl << " " << sBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << "parse_sinex_stn(): Could not extract Z coordinate estimate from the record: " << std::endl << " " << sBuf << "."; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } // Add this station to the vStations vector @@ -1054,18 +1054,18 @@ void dna_io_snx::parse_sinex_stn(std::ifstream** snx_file, const char* sinexRec, void dna_io_snx::parse_sinex_msr(std::ifstream** snx_file, const char* sinexRec, vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, PUINT32 clusterID, PUINT32 msrCount, MsrTally& parsemsr_tally, CDnaDatum& datum, UINT32& lineNo) { - stringstream ss; + std::stringstream ss; if (applyDiscontinuities_ && !solutionEpochsRead_) { ss.str(""); - ss << "parse_sinex_msr(): Cannot apply discontinuities to the measurements" << endl << - " if the station epochs have not been loaded beforehand. To rectify this problem," << endl << + ss << "parse_sinex_msr(): Cannot apply discontinuities to the measurements" << std::endl << + " if the station epochs have not been loaded beforehand. To rectify this problem," << std::endl << " reformat the SINEX file so that the +SOLUTION/EPOCHS block appears before the +SOLUTION/ESTIMATE block."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - string sBuf(sinexRec), tmp; + std::string sBuf(sinexRec), tmp; parsemsr_tally.Y = static_cast(vStations->size() * 3); (*msrCount) = static_cast(vStations->size() * 3); @@ -1113,7 +1113,7 @@ void dna_io_snx::parse_sinex_msr(std::ifstream** snx_file, const char* sinexRec, { ss.str(""); ss << "parse_sinex_msr: Failed to read covariance elements from the record " << cBuf << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } // if the number of covariance elements has reached the number of stations, break out. diff --git a/dynadjust/include/io/dnaiosnxwrite.cpp b/dynadjust/include/io/dnaiosnxwrite.cpp index 7d200e8b..9100473c 100644 --- a/dynadjust/include/io/dnaiosnxwrite.cpp +++ b/dynadjust/include/io/dnaiosnxwrite.cpp @@ -53,14 +53,14 @@ void dna_io_snx::serialise_sinex(std::ofstream* snx_file, pvstn_t bstRecords, serialise_solution_estimates(snx_file, bstRecords, estimates, variances, datum); serialise_solution_variances(snx_file, variances); - *snx_file << "%ENDSNX" << endl; + *snx_file << "%ENDSNX" << std::endl; } void dna_io_snx::print_line(std::ofstream* snx_file) { *snx_file << "*-------------------------------------------------------------------------------" << - endl; + std::endl; } @@ -74,7 +74,7 @@ void dna_io_snx::serialise_meta(std::ofstream* snx_file, "DNA "; // Agency creating this file // Creation time of this SINEX file - dateSINEXFormat(snx_file, gregorian::day_clock::local_day(), true); + dateSINEXFormat(snx_file, boost::gregorian::day_clock::local_day(), true); // the agency providing the data in the SINEX file *snx_file << " DNA "; @@ -85,14 +85,14 @@ void dna_io_snx::serialise_meta(std::ofstream* snx_file, dateSINEXFormat(snx_file, datum->GetEpoch()); // end = start *snx_file << " "; - stringstream numberofparams; - numberofparams << right << setw(5) << unknownParams_; - string numberofparamsstr(numberofparams.str()); - numberofparamsstr = findandreplace(numberofparamsstr, " ", "0"); + std::stringstream numberofparams; + numberofparams << std::right << std::setw(5) << unknownParams_; + std::string numberofparamsstr(numberofparams.str()); + numberofparamsstr = findandreplace(numberofparamsstr, " ", "0"); *snx_file << "P " << // Technique(s) used to generate the SINEX solution - left << setw(6) << + std::left << std::setw(6) << numberofparamsstr << // Number of parameters estimated in the SINEX file "0 " << // Single character indicating the constraint in the SINEX solution "S " << // Solution types contained in this SINEX file. @@ -103,16 +103,16 @@ void dna_io_snx::serialise_meta(std::ofstream* snx_file, // C � Celestial Reference Frame // A � Antenna parameters // BLANK - endl; + std::endl; // FILE/REFERENCE print_line(snx_file); - stringstream ss; + std::stringstream ss; // description: Organization(s) gathering/altering the file contents. - *snx_file << "+FILE/REFERENCE" << endl << - "*INFO_TYPE_________ INFO________________________________________________________" << endl << - " DESCRIPTION " << left << "Network " << p.g.network_name << endl; + *snx_file << "+FILE/REFERENCE" << std::endl << + "*INFO_TYPE_________ INFO________________________________________________________" << std::endl << + " DESCRIPTION " << std::left << "Network " << p.g.network_name << std::endl; // output: Description of the file contents. ss.str(""); @@ -120,16 +120,16 @@ void dna_io_snx::serialise_meta(std::ofstream* snx_file, ss << "Phased adjustment results. Block " << block_ + 1 << " of " << blockCount_; else ss << "Simultaneous adjustment results."; - *snx_file << " OUTPUT " << left << setw(60) << ss.str() << endl; + *snx_file << " OUTPUT " << std::left << std::setw(60) << ss.str() << std::endl; // contact: address of the relevant contact email - //*snx_file << " OUTPUT " << left << setw(60) << __COPYRIGHT_OWNER__ << endl; + //*snx_file << " OUTPUT " << std::left << std::setw(60) << __COPYRIGHT_OWNER__ << std::endl; // software/hardware *snx_file << snx_softwarehardware_text(); // input files. first, create a unique list of filenames - vector files; + std::vector files; for (UINT16 i(0); i 1) { *snx_file << " This file contains the rigorous estimates for block " << block_ + 1 << - " of a segmented" << endl << - " network comprised of " << blockCount_ << " blocks. Due to the way in which junction stations" << endl << - " are carried through successive blocks, stations appearing in this file" << endl << - " may also be found in other SINEX files relating to this network, such as" << endl << - " " << p.g.network_name << "-block1.snx, " << p.g.network_name << "-block2.snx, etc." << endl; + " of a segmented" << std::endl << + " network comprised of " << blockCount_ << " blocks. Due to the way in which junction stations" << std::endl << + " are carried through successive blocks, stations appearing in this file" << std::endl << + " may also be found in other SINEX files relating to this network, such as" << std::endl << + " " << p.g.network_name << "-block1.snx, " << p.g.network_name << "-block2.snx, etc." << std::endl; } *snx_file << - "-FILE/COMMENT" << endl; + "-FILE/COMMENT" << std::endl; } -void dna_io_snx::add_warning(const string& message, SINEX_WARN_TYPE warning) +void dna_io_snx::add_warning(const std::string& message, SINEX_WARN_TYPE warning) { - stringstream ss; + std::stringstream ss; switch (warning) { @@ -181,18 +181,18 @@ void dna_io_snx::add_warning(const string& message, SINEX_WARN_TYPE warning) } -void dna_io_snx::print_warnings(std::ofstream* warning_file, const string& fileName) +void dna_io_snx::print_warnings(std::ofstream* warning_file, const std::string& fileName) { // Print formatted header print_file_header(*warning_file, "DYNADJUST SINEX OUTPUT WARNINGS FILE"); - *warning_file << setw(PRINT_VAR_PAD) << left << "File name:" << system_complete(fileName).string() << endl; + *warning_file << std::setw(PRINT_VAR_PAD) << std::left << "File name:" << boost::filesystem::system_complete(fileName).string() << std::endl; - *warning_file << OUTPUTLINE << endl << endl; + *warning_file << OUTPUTLINE << std::endl << std::endl; for_each( warningMessages_.begin(), warningMessages_.end(), - [warning_file] (string warning) { - *warning_file << warning << endl; + [warning_file] (std::string warning) { + *warning_file << warning << std::endl; }); } @@ -202,11 +202,11 @@ void dna_io_snx::serialise_site_id(std::ofstream* snx_file, pvstn_t bstRecords) print_line(snx_file); - *snx_file << "+SITE/ID" << endl; - *snx_file << "*CODE PT __DOMES__ T _STATION DESCRIPTION__ APPROX_LON_ APPROX_LAT_ _APP_H_" << endl; + *snx_file << "+SITE/ID" << std::endl; + *snx_file << "*CODE PT __DOMES__ T _STATION DESCRIPTION__ APPROX_LON_ APPROX_LAT_ _APP_H_" << std::endl; const station_t* stn; - string stationName; + std::string stationName; for (UINT32 i(0); isize(); ++i) { @@ -217,17 +217,17 @@ void dna_io_snx::serialise_site_id(std::ofstream* snx_file, pvstn_t bstRecords) add_warning(stationName, excessive_name_chars); *snx_file << " " << - left << setw(4) << stationName.substr(0, 4) << " " << - right << setw(2) << "A" << " " << - left << setw(9) << stationName.substr(0, 9) << " " << - right << setw(1) << "P" << " " << - left << setw(22) << string(stn->description).substr(0, 22) << " " << - right << setw(11) << FormatDmsString(RadtoDms(stn->currentLongitude), 5, true, false) << " " << - right << setw(11) << FormatDmsString(RadtoDms(stn->currentLatitude), 5, true, false) << " " << - right << setw(7) << setprecision(1) << fixed << stn->currentHeight << endl; + std::left << std::setw(4) << stationName.substr(0, 4) << " " << + std::right << std::setw(2) << "A" << " " << + std::left << std::setw(9) << stationName.substr(0, 9) << " " << + std::right << std::setw(1) << "P" << " " << + std::left << std::setw(22) << std::string(stn->description).substr(0, 22) << " " << + std::right << std::setw(11) << FormatDmsString(RadtoDms(stn->currentLongitude), 5, true, false) << " " << + std::right << std::setw(11) << FormatDmsString(RadtoDms(stn->currentLatitude), 5, true, false) << " " << + std::right << std::setw(7) << std::setprecision(1) << std::fixed << stn->currentHeight << std::endl; } - *snx_file << "-SITE/ID" << endl; + *snx_file << "-SITE/ID" << std::endl; } @@ -235,23 +235,23 @@ void dna_io_snx::serialise_statistics(std::ofstream* snx_file) { print_line(snx_file); - *snx_file << "+SOLUTION/STATISTICS" << endl; - *snx_file << "*_STATISTICAL PARAMETER________ __VALUE(S)____________" << endl; + *snx_file << "+SOLUTION/STATISTICS" << std::endl; + *snx_file << "*_STATISTICAL PARAMETER________ __VALUE(S)____________" << std::endl; *snx_file << " " << - left << setw(30) << "NUMBER OF OBSERVATIONS" << " " << - right << setw(22) << measurementParams_ << endl; + std::left << std::setw(30) << "NUMBER OF OBSERVATIONS" << " " << + std::right << std::setw(22) << measurementParams_ << std::endl; *snx_file << " " << - left << setw(30) << "NUMBER OF UNKNOWNS" << " " << - right << setw(22) << unknownParams_ << endl; + std::left << std::setw(30) << "NUMBER OF UNKNOWNS" << " " << + std::right << std::setw(22) << unknownParams_ << std::endl; *snx_file << " " << - left << setw(30) << "NUMBER OF DEGREES OF FREEDOM" << " " << - right << setw(22) << (measurementParams_ - unknownParams_) << endl; + std::left << std::setw(30) << "NUMBER OF DEGREES OF FREEDOM" << " " << + std::right << std::setw(22) << (measurementParams_ - unknownParams_) << std::endl; *snx_file << " " << - left << setw(30) << "VARIANCE FACTOR" << " " << - right << setw(22) << fixed << setprecision(6) << sigmaZero_ << endl; + std::left << std::setw(30) << "VARIANCE FACTOR" << " " << + std::right << std::setw(22) << std::fixed << std::setprecision(6) << sigmaZero_ << std::endl; - *snx_file << "-SOLUTION/STATISTICS" << endl; + *snx_file << "-SOLUTION/STATISTICS" << std::endl; } @@ -260,12 +260,12 @@ void dna_io_snx::serialise_solution_estimates(std::ofstream* snx_file, pvstn_t b { print_line(snx_file); - *snx_file << "+SOLUTION/ESTIMATE" << endl; - *snx_file << "*INDEX TYPE__ CODE PT SOLN _REF_EPOCH__ UNIT S __ESTIMATED VALUE____ _STD_DEV___" << endl; + *snx_file << "+SOLUTION/ESTIMATE" << std::endl; + *snx_file << "*INDEX TYPE__ CODE PT SOLN _REF_EPOCH__ UNIT S __ESTIMATED VALUE____ _STD_DEV___" << std::endl; UINT32 i, j, index(1); - string floating_value; - stringstream ss; + std::string floating_value; + std::stringstream ss; // Print stations for (i=0; isize(); ++i) @@ -275,13 +275,13 @@ void dna_io_snx::serialise_solution_estimates(std::ofstream* snx_file, pvstn_t b // estimated parameter (X) *snx_file << " " << // parameter index - right << setw(5) << index++ << " " << + std::right << std::setw(5) << index++ << " " << // parameter type "STAX " << // 4 character site code - left << setw(4) << string(bstRecords->at(blockStations_->at(i)).stationName).substr(0, 4) << " " << + std::left << std::setw(4) << std::string(bstRecords->at(blockStations_->at(i)).stationName).substr(0, 4) << " " << // Point code - right << setw(2) << "A" << " " << + std::right << std::setw(2) << "A" << " " << // Solution id "0001 "; // epoch @@ -289,29 +289,29 @@ void dna_io_snx::serialise_solution_estimates(std::ofstream* snx_file, pvstn_t b *snx_file << " " << // Parameter units - left << setw(4) << "m" << " " << + std::left << std::setw(4) << "m" << " " << // Constraint code "0" << " "; // Parameter estimate ss.str(""); - ss << setiosflags(ios_base::uppercase | ios_base::scientific) << setprecision(14) << estimates->get(j, 0); - *snx_file << right << setw(21) << ss.str() << " "; + ss << std::setiosflags(std::ios_base::uppercase | std::ios_base::scientific) << std::setprecision(14) << estimates->get(j, 0); + *snx_file << std::right << std::setw(21) << ss.str() << " "; // standard deviation ss.str(""); - ss << setprecision(5) << sqrt(variances->get(j, j)); - *snx_file << right << setw(11) << ss.str() << endl; + ss << std::setprecision(5) << sqrt(variances->get(j, j)); + *snx_file << std::right << std::setw(11) << ss.str() << std::endl; // estimated parameter (Y) *snx_file << " " << // parameter index - right << setw(5) << index++ << " " << + std::right << std::setw(5) << index++ << " " << // parameter type "STAY " << // 4 character site code - left << setw(4) << string(bstRecords->at(blockStations_->at(i)).stationName).substr(0, 4) << " " << + std::left << std::setw(4) << std::string(bstRecords->at(blockStations_->at(i)).stationName).substr(0, 4) << " " << // Point code - right << setw(2) << "A" << " " << + std::right << std::setw(2) << "A" << " " << // Solution id "0001 "; // epoch @@ -319,29 +319,29 @@ void dna_io_snx::serialise_solution_estimates(std::ofstream* snx_file, pvstn_t b *snx_file << " " << // Parameter units - left << setw(4) << "m" << " " << + std::left << std::setw(4) << "m" << " " << // Constraint code "0" << " "; // Parameter estimate ss.str(""); - ss << setprecision(14) << estimates->get(j+1, 0); - *snx_file << right << setw(21) << ss.str() << " "; + ss << std::setprecision(14) << estimates->get(j+1, 0); + *snx_file << std::right << std::setw(21) << ss.str() << " "; // standard deviation ss.str(""); - ss << setprecision(5) << sqrt(variances->get(j+1, j+1)); - *snx_file << right << setw(11) << ss.str() << endl; + ss << std::setprecision(5) << sqrt(variances->get(j+1, j+1)); + *snx_file << std::right << std::setw(11) << ss.str() << std::endl; // estimated parameter (Z) *snx_file << " " << // parameter index - right << setw(5) << index++ << " " << + std::right << std::setw(5) << index++ << " " << // parameter type "STAZ " << // 4 character site code - left << setw(4) << string(bstRecords->at(blockStations_->at(i)).stationName).substr(0, 4) << " " << + std::left << std::setw(4) << std::string(bstRecords->at(blockStations_->at(i)).stationName).substr(0, 4) << " " << // Point code - right << setw(2) << "A" << " " << + std::right << std::setw(2) << "A" << " " << // Solution id "0001 "; // epoch @@ -349,42 +349,42 @@ void dna_io_snx::serialise_solution_estimates(std::ofstream* snx_file, pvstn_t b *snx_file << " " << // Parameter units - left << setw(4) << "m" << " " << + std::left << std::setw(4) << "m" << " " << // Constraint code "0" << " "; // Parameter estimate ss.str(""); - ss << setprecision(14) << estimates->get(j+2, 0); - *snx_file << right << setw(21) << ss.str() << " "; + ss << std::setprecision(14) << estimates->get(j+2, 0); + *snx_file << std::right << std::setw(21) << ss.str() << " "; // standard deviation ss.str(""); - ss << setprecision(5) << sqrt(variances->get(j+2, j+2)); - *snx_file << right << setw(11) << ss.str() << endl; + ss << std::setprecision(5) << sqrt(variances->get(j+2, j+2)); + *snx_file << std::right << std::setw(11) << ss.str() << std::endl; } - *snx_file << "-SOLUTION/ESTIMATE" << endl; + *snx_file << "-SOLUTION/ESTIMATE" << std::endl; } void dna_io_snx::print_matrix_index(std::ofstream* snx_file, const UINT32& row, const UINT32& col) { *snx_file << " " << - right << setw(5) << row + 1 << " " << - right << setw(5) << col + 1 << " "; + std::right << std::setw(5) << row + 1 << " " << + std::right << std::setw(5) << col + 1 << " "; } void dna_io_snx::serialise_solution_variances(std::ofstream* snx_file, matrix_2d* variances) { print_line(snx_file); - *snx_file << "+SOLUTION/MATRIX_ESTIMATE L COVA" << endl; - *snx_file << "*PARA1 PARA2 ____PARA2+0__________ ____PARA2+1__________ ____PARA2+2__________" << endl; + *snx_file << "+SOLUTION/MATRIX_ESTIMATE L COVA" << std::endl; + *snx_file << "*PARA1 PARA2 ____PARA2+0__________ ____PARA2+1__________ ____PARA2+2__________" << std::endl; UINT32 row, col, max_dimension(variances->rows()); - string floating_value; - stringstream ss; - ss << setiosflags(ios_base::uppercase | ios_base::scientific); + std::string floating_value; + std::stringstream ss; + ss << std::setiosflags(std::ios_base::uppercase | std::ios_base::scientific); bool newRecord(true); UINT16 field(1); @@ -403,19 +403,19 @@ void dna_io_snx::serialise_solution_variances(std::ofstream* snx_file, matrix_2d // variance ss.str(""); - ss << setprecision(14) << variances->get(row, col); - *snx_file << right << setw(21) << ss.str() << " "; + ss << std::setprecision(14) << variances->get(row, col); + *snx_file << std::right << std::setw(21) << ss.str() << " "; if (row == col || ++field > 3) { - *snx_file << endl; + *snx_file << std::endl; newRecord = true; field = 1; } } } - *snx_file << "-SOLUTION/MATRIX_ESTIMATE L COVA" << endl; + *snx_file << "-SOLUTION/MATRIX_ESTIMATE L COVA" << std::endl; } diff --git a/dynadjust/include/io/dnaiotbu.cpp b/dynadjust/include/io/dnaiotbu.cpp index c6431509..5835db0d 100644 --- a/dynadjust/include/io/dnaiotbu.cpp +++ b/dynadjust/include/io/dnaiotbu.cpp @@ -29,7 +29,7 @@ void dna_io_tbu::assign_typeb_values_global(const vstring& typeBUncertainties, t { double e(0.), n(0.), u(0.); UINT32 i(0); - stringstream ss; + std::stringstream ss; if (typeBUncertainties.size() > 2) { @@ -56,8 +56,8 @@ void dna_io_tbu::assign_typeb_values_global(const vstring& typeBUncertainties, t u = DoubleFromString(typeBUncertainties.at(i)); } else { - ss << " No Type b uncertainties provided." << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << " No Type b uncertainties provided." << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } // assign @@ -83,36 +83,36 @@ void dna_io_tbu::assign_typeb_values_local(const vstring& typeBUncertainties, ty } -void dna_io_tbu::validate_typeb_values(const string& argument, vstring& typeBUncertainties) +void dna_io_tbu::validate_typeb_values(const std::string& argument, vstring& typeBUncertainties) { - stringstream ss; + std::stringstream ss; if (typeBUncertainties.size() == 0) { - ss << " No Type b uncertainties provided:" << endl << - " " << argument << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << " No Type b uncertainties provided:" << std::endl << + " " << argument << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } UINT32 i(0), j; for (j = i; j < typeBUncertainties.size(); j++) { - if (!is_floatingpoint(typeBUncertainties.at(i))) + if (!is_floatingpoint(typeBUncertainties.at(i))) { ss << " Type b uncertainty '" << typeBUncertainties.at(i) << - "' is not a number:" << endl << - " " << argument << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + "' is not a number:" << std::endl << + " " << argument << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } i++; } } -void dna_io_tbu::read_tbu_header(std::ifstream* ptr, string& version, INPUT_DATA_TYPE& idt) +void dna_io_tbu::read_tbu_header(std::ifstream* ptr, std::string& version, INPUT_DATA_TYPE& idt) { - string sBuf; + std::string sBuf; getline((*ptr), sBuf); sBuf = trimstr(sBuf); @@ -121,52 +121,52 @@ void dna_io_tbu::read_tbu_header(std::ifstream* ptr, string& version, INPUT_DATA // Attempt to get the file's version try { - if (iequals("!#=DNA", sBuf.substr(0, 6))) + if (boost::iequals("!#=DNA", sBuf.substr(0, 6))) version = trimstr(sBuf.substr(6, 6)); } - catch (const runtime_error& e) { - throw boost::enable_current_exception(runtime_error(e.what())); + catch (const std::runtime_error& e) { + throw boost::enable_current_exception(std::runtime_error(e.what())); } - string type; - stringstream ssError; - ssError << " File type has not been provided in the header:" << endl << - " " << sBuf << endl; + std::string type; + std::stringstream ssError; + ssError << " File type has not been provided in the header:" << std::endl << + " " << sBuf << std::endl; if (sBuf.length() < 15) - throw boost::enable_current_exception(runtime_error(ssError.str())); + throw boost::enable_current_exception(std::runtime_error(ssError.str())); // Attempt to get the file's type try { type = trimstr(sBuf.substr(12, 3)); } - catch (const runtime_error& e) { - ssError << " " << e.what() << endl; - throw boost::enable_current_exception(runtime_error(ssError.str())); + catch (const std::runtime_error& e) { + ssError << " " << e.what() << std::endl; + throw boost::enable_current_exception(std::runtime_error(ssError.str())); } // Check this is a Type B file - if (iequals(type, "tbu")) + if (boost::iequals(type, "tbu")) idt = tbu_data; else { idt = unknown; - stringstream ssError; - ssError << " The supplied filetype '" << type << "' is not recognised:" << endl << - " " << sBuf << endl; - throw boost::enable_current_exception(runtime_error(ssError.str())); + std::stringstream ssError; + ssError << " The supplied filetype '" << type << "' is not recognised:" << std::endl << + " " << sBuf << std::endl; + throw boost::enable_current_exception(std::runtime_error(ssError.str())); } } -void dna_io_tbu::load_tbu_argument(const string& argument, type_b_uncertainty& type_b_uncertainties) +void dna_io_tbu::load_tbu_argument(const std::string& argument, type_b_uncertainty& type_b_uncertainties) { vstring typeBUncertainties; typeBUncertainties.resize(3); // Extract constraints from comma delimited string - SplitDelimitedString( + SplitDelimitedString( argument, // the comma delimited string - string(","), // the delimiter + std::string(","), // the delimiter &typeBUncertainties); // the respective values // validate values. Throws on exception @@ -178,18 +178,18 @@ void dna_io_tbu::load_tbu_argument(const string& argument, type_b_uncertainty& t } -void dna_io_tbu::identify_station_id(const string& stn_str, UINT32& stn_id, v_string_uint32_pair& vStnsMap) +void dna_io_tbu::identify_station_id(const std::string& stn_str, UINT32& stn_id, v_string_uint32_pair& vStnsMap) { it_pair_string_vUINT32 it_stnmap_range; - stringstream ss; + std::stringstream ss; // find this station in the station map it_stnmap_range = equal_range(vStnsMap.begin(), vStnsMap.end(), stn_str, StationNameIDCompareName()); if (it_stnmap_range.first == it_stnmap_range.second) { ss << " Station '" << stn_str << - "' is not included in the network." << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + "' is not included in the network." << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } stn_id = it_stnmap_range.first->second; @@ -197,7 +197,7 @@ void dna_io_tbu::identify_station_id(const string& stn_str, UINT32& stn_id, v_st } -void dna_io_tbu::load_tbu_file(const string& tbu_filename, v_type_b_uncertainty& type_b_uncertainties, v_string_uint32_pair& vStnsMap) +void dna_io_tbu::load_tbu_file(const std::string& tbu_filename, v_type_b_uncertainty& type_b_uncertainties, v_string_uint32_pair& vStnsMap) { // Type B uncertainty file structure is as follows. // Note - uncertainties are in metres, in the local reference frame (e,n,u) @@ -208,33 +208,33 @@ void dna_io_tbu::load_tbu_file(const string& tbu_filename, v_type_b_uncertainty& // EOF std::ifstream tbu_file; - stringstream ss; - ss << "load_tbu_file(): An error was encountered when opening " << tbu_filename << "." << endl; + std::stringstream ss; + ss << "load_tbu_file(): An error was encountered when opening " << tbu_filename << "." << std::endl; INPUT_DATA_TYPE idt; - string version; + std::string version; try { // open ascii plate boundaries file. Throws runtime_error on failure. - file_opener(tbu_file, tbu_filename, ios::in, ascii, true); + file_opener(tbu_file, tbu_filename, std::ios::in, ascii, true); // read header information read_tbu_header(&tbu_file, version, idt); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "load_tbu_file(): An error was encountered when reading from " << tbu_filename << "." << endl; + ss << "load_tbu_file(): An error was encountered when reading from " << tbu_filename << "." << std::endl; UINT32 stn_id; - string record, stn_str; + std::string record, stn_str; vstring typeb_values; const UINT16 STDDEVn(STATION + STDDEV); const UINT16 STDDEVu(STATION + STDDEV + STDDEV); @@ -269,7 +269,7 @@ void dna_io_tbu::load_tbu_file(const string& tbu_filename, v_type_b_uncertainty& try { identify_station_id(stn_str, stn_id, vStnsMap); } - catch (const runtime_error&) { + catch (const std::runtime_error&) { // Can't find the station, ignore. continue; } @@ -306,7 +306,7 @@ void dna_io_tbu::load_tbu_file(const string& tbu_filename, v_type_b_uncertainty& // to the next set of values validate_typeb_values(record, typeb_values); } - catch (const runtime_error&) { + catch (const std::runtime_error&) { continue; } @@ -321,18 +321,18 @@ void dna_io_tbu::load_tbu_file(const string& tbu_filename, v_type_b_uncertainty& tbu_file.close(); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if (tbu_file.eof()) { tbu_file.close(); return; } ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { if (tbu_file.eof()) @@ -340,7 +340,7 @@ void dna_io_tbu::load_tbu_file(const string& tbu_filename, v_type_b_uncertainty& tbu_file.close(); return; } - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } return; diff --git a/dynadjust/include/io/dnaiotbu.hpp b/dynadjust/include/io/dnaiotbu.hpp index 281f46a2..0222e6f2 100644 --- a/dynadjust/include/io/dnaiotbu.hpp +++ b/dynadjust/include/io/dnaiotbu.hpp @@ -38,9 +38,6 @@ #include #include -using namespace std; -using namespace boost; - using namespace dynadjust::math; namespace dynadjust { @@ -80,9 +77,9 @@ struct type_b_uncertainty_t // Create types for the type b uncertainties to be managed for sites typedef type_b_uncertainty_t type_b_uncertainty; -typedef vector v_type_b_uncertainty; +typedef std::vector v_type_b_uncertainty; typedef v_type_b_uncertainty::iterator it_type_b_uncertainty; -typedef pair it_pair_type_b_uncertainty; +typedef std::pair it_pair_type_b_uncertainty; template class CompareTypeBStationID @@ -134,7 +131,7 @@ struct type_b_method_t }; typedef type_b_method_t type_b_method; -typedef vector v_type_b_method; +typedef std::vector v_type_b_method; typedef v_type_b_method::iterator it_type_b_method; @@ -149,14 +146,14 @@ class dna_io_tbu : public dna_io_base dna_io_tbu& operator=(const dna_io_tbu& rhs); - void read_tbu_header(std::ifstream* ptr, string& version, INPUT_DATA_TYPE& idt); + void read_tbu_header(std::ifstream* ptr, std::string& version, INPUT_DATA_TYPE& idt); - void load_tbu_file(const string& tbu_filename, v_type_b_uncertainty& type_b_uncertainties, v_string_uint32_pair& vStnsMap); - void load_tbu_argument(const string& argument, type_b_uncertainty& type_b_uncertainties); + void load_tbu_file(const std::string& tbu_filename, v_type_b_uncertainty& type_b_uncertainties, v_string_uint32_pair& vStnsMap); + void load_tbu_argument(const std::string& argument, type_b_uncertainty& type_b_uncertainties); - void identify_station_id(const string& stn_str, UINT32& stn_id, v_string_uint32_pair& vStnsMap); + void identify_station_id(const std::string& stn_str, UINT32& stn_id, v_string_uint32_pair& vStnsMap); - void validate_typeb_values(const string& argument, vstring& typeBUncertainties); + void validate_typeb_values(const std::string& argument, vstring& typeBUncertainties); void assign_typeb_values_global(const vstring& typeBUncertainties, type_b_uncertainty& type_b); void assign_typeb_values_local(const vstring& typeBUncertainties, type_b_uncertainty& type_b); diff --git a/dynadjust/include/io/dnaiotpb.cpp b/dynadjust/include/io/dnaiotpb.cpp index 8c384cc5..6e9bddc3 100644 --- a/dynadjust/include/io/dnaiotpb.cpp +++ b/dynadjust/include/io/dnaiotpb.cpp @@ -27,7 +27,7 @@ namespace dynadjust { namespace iostreams { -void dna_io_tpb::load_tpb_file(const string& tpb_filename, v_string_v_doubledouble_pair& global_plates) +void dna_io_tpb::load_tpb_file(const std::string& tpb_filename, v_string_v_doubledouble_pair& global_plates) { // From the standard: // PB2002_plates.dig.For some applications it is necessary to @@ -62,26 +62,26 @@ void dna_io_tpb::load_tpb_file(const string& tpb_filename, v_string_v_doubledoub // *** end of line segment *** std::ifstream tpb_file; - stringstream ss; - ss << "load_tpb_file(): An error was encountered when opening " << tpb_filename << "." << endl; + std::stringstream ss; + ss << "load_tpb_file(): An error was encountered when opening " << tpb_filename << "." << std::endl; try { // open ascii plate boundaries file. Throws runtime_error on failure. - file_opener(tpb_file, tpb_filename, ios::in, ascii, true); + file_opener(tpb_file, tpb_filename, std::ios::in, ascii, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "load_tpb_file(): An error was encountered when reading from " << tpb_filename << "." << endl; + ss << "load_tpb_file(): An error was encountered when reading from " << tpb_filename << "." << std::endl; v_doubledouble_pair plate_nodes; - string plate_name, node_coordinates; + std::string plate_name, node_coordinates; vstring coordinates; try { @@ -99,7 +99,7 @@ void dna_io_tpb::load_tpb_file(const string& tpb_filename, v_string_v_doubledoub // Ignore lines with comments if ((plate_name.compare(0, 1, "*") == 0) && - !iequals(plate_name.substr(0, 7), "*** end")) + !boost::iequals(plate_name.substr(0, 7), "*** end")) continue; str_toupper(plate_name); @@ -107,12 +107,12 @@ void dna_io_tpb::load_tpb_file(const string& tpb_filename, v_string_v_doubledoub // get the next set of plate coordinates getline(tpb_file, node_coordinates); - while (!iequals(node_coordinates.substr(0, 7), "*** end")) + while (!boost::iequals(node_coordinates.substr(0, 7), "*** end")) { // Extract coordinates from comma delimited string - SplitDelimitedString( + SplitDelimitedString( node_coordinates, // the comma delimited string - string(","), // the delimiter + std::string(","), // the delimiter &coordinates); // the respective values plate_nodes.push_back(doubledouble_pair( @@ -131,18 +131,18 @@ void dna_io_tpb::load_tpb_file(const string& tpb_filename, v_string_v_doubledoub tpb_file.close(); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if (tpb_file.eof()) { tpb_file.close(); return; } ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { if (tpb_file.eof()) @@ -150,13 +150,13 @@ void dna_io_tpb::load_tpb_file(const string& tpb_filename, v_string_v_doubledoub tpb_file.close(); return; } - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } return; } -void dna_io_tpb::load_tpp_file(const string& tpp_filename, v_plate_motion_eulers& plate_pole_parameters) +void dna_io_tpb::load_tpp_file(const std::string& tpp_filename, v_plate_motion_eulers& plate_pole_parameters) { // Tectonic pole parameters file structure is as follows. // Note - coordinates are in degrees. @@ -165,26 +165,26 @@ void dna_io_tpb::load_tpp_file(const string& tpp_filename, v_plate_motion_eulers // std::ifstream tpp_file; - stringstream ss; - ss << "load_tpp_file(): An error was encountered when opening " << tpp_filename << "." << endl; + std::stringstream ss; + ss << "load_tpp_file(): An error was encountered when opening " << tpp_filename << "." << std::endl; try { // open ascii pole parameters file. Throws runtime_error on failure. - file_opener(tpp_file, tpp_filename, ios::in, ascii, true); + file_opener(tpp_file, tpp_filename, std::ios::in, ascii, true); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } ss.str(""); - ss << "load_tpp_file(): An error was encountered when reading from " << tpp_filename << "." << endl; + ss << "load_tpp_file(): An error was encountered when reading from " << tpp_filename << "." << std::endl; plate_motion_euler pmm; - string record; + std::string record; try { @@ -221,18 +221,18 @@ void dna_io_tpb::load_tpp_file(const string& tpp_filename, v_plate_motion_eulers tpp_file.close(); } - catch (const ios_base::failure& f) { + catch (const std::ios_base::failure& f) { if (tpp_file.eof()) { tpp_file.close(); return; } ss << f.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } - catch (const runtime_error& e) { + catch (const std::runtime_error& e) { ss << e.what(); - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } catch (...) { if (tpp_file.eof()) @@ -240,14 +240,14 @@ void dna_io_tpb::load_tpp_file(const string& tpp_filename, v_plate_motion_eulers tpp_file.close(); return; } - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } return; } bool dna_io_tpb::validate_plate_files(v_string_v_doubledouble_pair& global_plates, - v_plate_motion_eulers& plate_pole_parameters, string& message) + v_plate_motion_eulers& plate_pole_parameters, std::string& message) { if (plate_pole_parameters.size() != global_plates.size()) { diff --git a/dynadjust/include/io/dnaiotpb.hpp b/dynadjust/include/io/dnaiotpb.hpp index 3f7a91cf..eabcc4cc 100644 --- a/dynadjust/include/io/dnaiotpb.hpp +++ b/dynadjust/include/io/dnaiotpb.hpp @@ -37,7 +37,7 @@ namespace iostreams { ///////////////////////////////////////////////////////////// // Custom type to manage euler plate motion model parameters -template +template struct plate_motion_euler_t { T1 plate_name; @@ -75,15 +75,15 @@ struct plate_motion_euler_t }; -typedef plate_motion_euler_t plate_motion_euler; -typedef vector v_plate_motion_eulers; +typedef plate_motion_euler_t plate_motion_euler; +typedef std::vector v_plate_motion_eulers; typedef v_plate_motion_eulers::iterator it_plate_motion_euler; ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// // Custom type to manage cartesian plate motion model parameters -template +template struct plate_motion_cartesian_t { T1 plate_name; @@ -124,8 +124,8 @@ struct plate_motion_cartesian_t }; -typedef plate_motion_cartesian_t plate_motion_cartesian; -typedef vector v_plate_motion_cartesians; +typedef plate_motion_cartesian_t plate_motion_cartesian; +typedef std::vector v_plate_motion_cartesians; typedef v_plate_motion_cartesians::iterator it_plate_motion_cartesian; ///////////////////////////////////////////////////////////// @@ -139,11 +139,11 @@ class dna_io_tpb : public dna_io_base dna_io_tpb& operator=(const dna_io_tpb& rhs); - void load_tpb_file(const string& tpb_filename, v_string_v_doubledouble_pair& global_plates); - void load_tpp_file(const string& tpp_filename, v_plate_motion_eulers& plate_pole_parameters); + void load_tpb_file(const std::string& tpb_filename, v_string_v_doubledouble_pair& global_plates); + void load_tpp_file(const std::string& tpp_filename, v_plate_motion_eulers& plate_pole_parameters); bool validate_plate_files(v_string_v_doubledouble_pair& global_plates, - v_plate_motion_eulers& plate_pole_parameters, string& message); + v_plate_motion_eulers& plate_pole_parameters, std::string& message); protected: diff --git a/dynadjust/include/io/pdfdde.cpp b/dynadjust/include/io/pdfdde.cpp index 72003d19..62d48dc0 100644 --- a/dynadjust/include/io/pdfdde.cpp +++ b/dynadjust/include/io/pdfdde.cpp @@ -30,6 +30,10 @@ PURPOSE #include #include +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif + //#include #define ACROBAT_EXE "acrobat.exe" diff --git a/dynadjust/include/math/dnamatrix_contiguous.cpp b/dynadjust/include/math/dnamatrix_contiguous.cpp index 8b6e64da..ab7645e7 100644 --- a/dynadjust/include/math/dnamatrix_contiguous.cpp +++ b/dynadjust/include/math/dnamatrix_contiguous.cpp @@ -32,20 +32,18 @@ //FLT_MAX; //#include -//cout << "Float max: " << numeric_limits::max() << endl; -//cout << "Float min: " << numeric_limits::min() << endl; -//cout << "Double max: " << numeric_limits::max() << endl; -//cout << "Double min: " << numeric_limits::min() << endl; -//cout << "UINT16 max: " << numeric_limits::min() << endl; -//cout << "UINT16 min: " << numeric_limits::min() << endl; -//cout << "UINT32 max: " << numeric_limits::min() << endl; -//cout << "UINT32 min: " << numeric_limits::min() << endl; - -using namespace std; +//cout << "Float max: " << numeric_limits::max() << std::endl; +//cout << "Float min: " << numeric_limits::min() << std::endl; +//cout << "Double max: " << numeric_limits::max() << std::endl; +//cout << "Double min: " << numeric_limits::min() << std::endl; +//cout << "UINT16 max: " << numeric_limits::min() << std::endl; +//cout << "UINT16 min: " << numeric_limits::min() << std::endl; +//cout << "UINT32 max: " << numeric_limits::min() << std::endl; +//cout << "UINT32 min: " << numeric_limits::min() << std::endl; namespace dynadjust { namespace math { -ostream& operator<< (ostream& os, const matrix_2d& rhs) +std::ostream& operator<< (std::ostream& os, const matrix_2d& rhs) { if (os.iword(0) == binary) { @@ -68,7 +66,7 @@ ostream& operator<< (ostream& os, const matrix_2d& rhs) case mtx_lower: // output lower triangular part of a square matrix if (rhs._mem_rows != rhs._mem_cols) - throw boost::enable_current_exception(runtime_error("matrix_2d operator<< (): Matrix is not square.")); + throw boost::enable_current_exception(std::runtime_error("matrix_2d operator<< (): Matrix is not square.")); // print each column for (c=0; c(rhs.size())); // if (os.iword(0) == binary) // os.write(reinterpret_cast(&vector_size), sizeof(UINT32)); // else -// os << vector_size << endl; +// os << vector_size << std::endl; // for (_it_v_mat_2d_const iter = rhs.begin(); iter != rhs.end(); ++iter) -// os << *iter; // calls ostream& operator<< (ostream& os, const matrix_2d& rhs) +// os << *iter; // calls ostream& operator<< (std::ostream& os, const matrix_2d& rhs) // return os; //} //// Output to stream vectors of matrix_2d -//ostream& operator<< (ostream& os, const v_mat_2d* rhs) +//ostream& operator<< (std::ostream& os, const v_mat_2d* rhs) //{ // os << *rhs; // return os; @@ -160,7 +158,7 @@ ostream& operator<< (ostream& os, const matrix_2d& rhs) // case mtx_lower: // // output lower triangular part of a square matrix // if (rhs._mem_rows != rhs._mem_cols) -// throw boost::enable_current_exception(runtime_error("matrix_2d operator>> (): Matrix is not square.")); +// throw boost::enable_current_exception(std::runtime_error("matrix_2d operator>> (): Matrix is not square.")); // // // retrieve each column // for (c=0; c> has not been tested")); +// //throw boost::enable_current_exception(std::runtime_error("istream& operator>> has not been tested")); // -// string str; +// std::string str; // UINT32 type; // is >> type; // rhs._matrixType = static_cast(type); @@ -243,13 +241,13 @@ UINT32 __col__; void out_of_memory_handler() { - stringstream ss(""); - UINT32 mem(max(__row__, __col__)); - mem *= min(__row__, __col__) * sizeof(UINT32); + std::stringstream ss(""); + UINT32 mem(std::max(__row__, __col__)); + mem *= std::min(__row__, __col__) * sizeof(UINT32); ss << "Insufficient memory available to create a " << __row__ << " x " << __col__ << " matrix (" << - fixed << setprecision(2); + std::fixed << std::setprecision(2); if (mem < MEGABYTE_SIZE) ss << (mem/KILOBYTE_SIZE) << " KB)."; @@ -271,14 +269,14 @@ matrix_2d::matrix_2d() , _maxvalRow(0) , _matrixType(mtx_full) { - ::set_new_handler(out_of_memory_handler); + std::set_new_handler(out_of_memory_handler); // if this class were to be modified to use templates, each // instance could be tested for an invalid data type as follows // //if (strcmp(typeid(a(1,1)).name(), "double") != 0 && // strcmp(typeid(a(1,1)).name(), "float") != 0 ) { - // throw boost::enable_current_exception(runtime_error("Not a floating point type")); + // throw boost::enable_current_exception(std::runtime_error("Not a floating point type")); } matrix_2d::matrix_2d(const UINT32& rows, const UINT32& columns) @@ -291,7 +289,7 @@ matrix_2d::matrix_2d(const UINT32& rows, const UINT32& columns) , _maxvalRow(0) , _matrixType(mtx_full) { - ::set_new_handler(out_of_memory_handler); + std::set_new_handler(out_of_memory_handler); allocate(_rows, _cols); } @@ -307,9 +305,9 @@ matrix_2d::matrix_2d(const UINT32& rows, const UINT32& columns, , _maxvalRow(0) , _matrixType(matrix_type) { - ::set_new_handler(out_of_memory_handler); + std::set_new_handler(out_of_memory_handler); - stringstream ss; + std::stringstream ss; UINT32 upperMatrixElements(sumOfConsecutiveIntegers(rows)); UINT32 j; @@ -322,7 +320,7 @@ matrix_2d::matrix_2d(const UINT32& rows, const UINT32& columns, if (upperMatrixElements != data_size) { ss << "Data size must be equivalent to upper matrix element count for " << rows << " x " << columns << "."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } // Create memory and store the data @@ -339,7 +337,7 @@ matrix_2d::matrix_2d(const UINT32& rows, const UINT32& columns, case mtx_sparse: ss << "matrix_2d(): A sparse matrix cannot be initialised with a double array."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); break; case mtx_full: @@ -348,7 +346,7 @@ matrix_2d::matrix_2d(const UINT32& rows, const UINT32& columns, if (data_size != rows * columns) { ss << "Data size must be equivalent to matrix dimensions (" << rows << " x " << columns << ")."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } // Create memory and store the data @@ -371,7 +369,7 @@ matrix_2d::matrix_2d(const matrix_2d& newmat) , _maxvalRow(newmat.maxvalueRow()) , _matrixType(newmat.matrixType()) { - ::set_new_handler(out_of_memory_handler); + std::set_new_handler(out_of_memory_handler); allocate(_mem_rows, _mem_cols); @@ -636,7 +634,7 @@ void matrix_2d::buy(const UINT32& rows, const UINT32& columns, double** mem_spac if ((*mem_space) == NULL) { - stringstream ss; + std::stringstream ss; ss << "Insufficient memory for a " << rows << " x " << columns << " matrix."; throw boost::enable_current_exception(NetMemoryException(ss.str())); } @@ -669,39 +667,39 @@ void matrix_2d::submatrix(const UINT32& row_begin, const UINT32& col_begin, matrix_2d* dest, const UINT32& subrows, const UINT32& subcolumns) const { if (row_begin >= _rows) { - stringstream ss; + std::stringstream ss; ss << row_begin << ", " << col_begin << " lies outside the range of the matrix (" << _rows << ", " << _cols << ")."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } if (col_begin >= _cols) { - stringstream ss; + std::stringstream ss; ss << row_begin << ", " << col_begin << " lies outside the range of the matrix (" << _rows << ", " << _cols << ")."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } if (subrows > dest->rows()) { - stringstream ss; + std::stringstream ss; ss << subrows << ", " << subcolumns << " exceeds the size of the matrix (" << dest->rows() << ", " << dest->columns() << ")."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } if (subcolumns > dest->columns()) { - stringstream ss; + std::stringstream ss; ss << subrows << ", " << subcolumns << " exceeds the size of the matrix (" << dest->rows() << ", " << dest->columns() << ")."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } if (row_begin + subrows > _rows) { - stringstream ss; + std::stringstream ss; ss << row_begin + subrows << ", " << col_begin + subcolumns << " lies outside the range of the matrix (" << _rows << ", " << _cols << ")."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } if (col_begin + subcolumns > _cols) { - stringstream ss; + std::stringstream ss; ss << row_begin + subrows << ", " << col_begin + subcolumns << " lies outside the range of the matrix (" << _rows << ", " << _cols << ")."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } UINT32 i, j, m(0), n(0), row_end(row_begin+subrows), col_end(col_begin+subcolumns); @@ -736,7 +734,7 @@ void matrix_2d::redim(const UINT32& rows, const UINT32& columns) //deallocate(); //_buffer = new_buffer; - ::set_new_handler(out_of_memory_handler); + std::set_new_handler(out_of_memory_handler); deallocate(); allocate(rows, columns); @@ -750,13 +748,13 @@ void matrix_2d::shrink(const UINT32& rows, const UINT32& columns) { if (rows > _rows || columns > _cols) { - stringstream ss; - ss << " " << endl; + std::stringstream ss; + ss << " " << std::endl; if (rows >= _rows) - ss << " Cannot shrink by " << rows << " rows on a matrix of " << _rows << " rows. " << endl; + ss << " Cannot shrink by " << rows << " rows on a matrix of " << _rows << " rows. " << std::endl; if (columns >= _cols) ss << " Cannot shrink by " << columns << " columns on a matrix of " << _cols << " columns."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } _rows -= rows; @@ -768,13 +766,13 @@ void matrix_2d::grow(const UINT32& rows, const UINT32& columns) { if ((rows+_rows) > _mem_rows || (columns+_cols) > _mem_cols) { - stringstream ss; - ss << " " << endl; + std::stringstream ss; + ss << " " << std::endl; if (rows >= _rows) ss << " Cannot grow matrix by " << rows << " rows: growth exceeds row memory limit (" << _mem_rows << ")."; if (columns >= _cols) ss << " Cannot grow matrix by " << columns << " columns: growth exceeds column memory limit (" << _mem_cols << ")."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } _rows += rows; @@ -866,13 +864,13 @@ void matrix_2d::copybuffer(const UINT32& rowstart, const UINT32& columnstart, co UINT32 rowend(rowstart+rows), columnend(columnstart+columns); if (rowend > _rows || columnend > _cols) { - stringstream ss; - ss << " " << endl; + std::stringstream ss; + ss << " " << std::endl; if (rowend >= _rows) - ss << " Row index " << rowend << " exceeds the matrix row count (" << _rows << "). " << endl; + ss << " Row index " << rowend << " exceeds the matrix row count (" << _rows << "). " << std::endl; if (columnend >= _cols) ss << " Column index " << columnend << " exceeds the matrix column count (" << _cols << ")."; - throw boost::enable_current_exception(runtime_error(ss.str())); + throw boost::enable_current_exception(std::runtime_error(ss.str())); } #if defined(DNAMATRIX_ROW_WISE) @@ -938,17 +936,17 @@ void matrix_2d::copyelements(const UINT32& row_dest, const UINT32& column_dest, // UINT32 rowend_src(row_src+rows), columnend_src(column_src+columns); // if (rowend_src > _rows || columnend_src > _cols || rowend_dest > _rows || columnend_dest > _cols) // { -// stringstream ss; -// ss << "copyelements(): " << endl; +// std::stringstream ss; +// ss << "copyelements(): " << std::endl; // if (rowend_src >= _rows) -// ss << " Row index (source) " << rowend_src << " exceeds the matrix row count (" << _rows << "). " << endl; +// ss << " Row index (source) " << rowend_src << " exceeds the matrix row count (" << _rows << "). " << std::endl; // if (columnend_src >= _cols) // ss << " Column index (source) " << columnend_src << " exceeds the matrix column count (" << _cols << ")."; // if (rowend_dest >= _rows) -// ss << " Row index (destination) " << rowend_dest << " exceeds the matrix row count (" << _rows << "). " << endl; +// ss << " Row index (destination) " << rowend_dest << " exceeds the matrix row count (" << _rows << "). " << std::endl; // if (columnend_dest >= _cols) // ss << " Column index (destination) " << columnend_dest << " exceeds the matrix column count (" << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // UINT32 m, n; @@ -967,24 +965,24 @@ void matrix_2d::copyelements(const UINT32& row_dest, const UINT32& column_dest, // UINT32 rowend_src(row_src+rows), columnend_src(column_src+columns); // if (rowend_src > src.rows() || columnend_src > src.columns()) // { -// stringstream ss; -// ss << "copyelements(): " << endl; +// std::stringstream ss; +// ss << "copyelements(): " << std::endl; // if (rowend_src >= src.rows()) -// ss << " Row index (source) " << rowend_src << " exceeds the matrix row count (" << src.rows() << "). " << endl; +// ss << " Row index (source) " << rowend_src << " exceeds the matrix row count (" << src.rows() << "). " << std::endl; // if (columnend_src >= src.columns()) // ss << " Column index (source) " << columnend_src << " exceeds the matrix column count (" << src.columns() << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // if (rowend_dest > _rows || columnend_dest > _cols) // { -// stringstream ss; -// ss << "copyelements(): " << endl; +// std::stringstream ss; +// ss << "copyelements(): " << std::endl; // if (rowend_dest >= _rows) -// ss << " Row index (destination) " << rowend_dest << " exceeds the matrix row count (" << _rows << "). " << endl; +// ss << " Row index (destination) " << rowend_dest << " exceeds the matrix row count (" << _rows << "). " << std::endl; // if (columnend_dest >= _cols) // ss << " Column index (destination) " << columnend_dest << " exceeds the matrix column count (" << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // UINT32 m, n; @@ -1001,13 +999,13 @@ void matrix_2d::copyelements(const UINT32& row_dest, const UINT32& column_dest, //{ // if (row >= _rows || column >= _cols) // { -// stringstream ss; -// ss << " " << endl; +// std::stringstream ss; +// ss << " " << std::endl; // if (row >= _rows) -// ss << " Row index " << row << " exceeds the matrix row count (" << _rows << "). " << endl; +// ss << " Row index " << row << " exceeds the matrix row count (" << _rows << "). " << std::endl; // if (column >= _cols) // ss << " Column index " << column << " exceeds the matrix column count (" << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // return get(row, column); @@ -1016,13 +1014,13 @@ void matrix_2d::copyelements(const UINT32& row_dest, const UINT32& column_dest, //void matrix_2d::put(const double data[], const UINT32& data_size) //{ -// ::set_new_handler(out_of_memory_handler); +// std::set_new_handler(out_of_memory_handler); // // if (data_size != _rows * _cols) // { -// stringstream ss; +// std::stringstream ss; // ss << "Data size must be equivalent to matrix dimensions (" << _rows << " x " << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // UINT32 i, j, k(0); @@ -1036,13 +1034,13 @@ void matrix_2d::copyelements(const UINT32& row_dest, const UINT32& column_dest, //{ // if (row >= _rows || column >= _cols) // { -// stringstream ss; -// ss << " " << endl; +// std::stringstream ss; +// ss << " " << std::endl; // if (row >= _rows) -// ss << " Row index " << row << " exceeds the matrix row count (" << _rows << "). " << endl; +// ss << " Row index " << row << " exceeds the matrix row count (" << _rows << "). " << std::endl; // if (column >= _cols) // ss << " Column index " << column << " exceeds the matrix column count (" << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // put(row, column, value); @@ -1052,9 +1050,9 @@ void matrix_2d::copyelements(const UINT32& row_dest, const UINT32& column_dest, //void matrix_2d::elementadd_safe(const UINT32& row, const UINT32& column, const double& increment) //{ // if (row >= _rows || column >= _cols) { -// stringstream ss; +// std::stringstream ss; // ss << row << ", " << column << " lies outside the range of the matrix (" << _rows << ", " << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // elementadd(row, column, increment); //} @@ -1063,28 +1061,28 @@ void matrix_2d::copyelements(const UINT32& row_dest, const UINT32& column_dest, // const UINT32& row_src, const UINT32& col_src, const UINT32& rows, const UINT32& cols) //{ // if (row_dest >= _rows || col_dest >= _cols) { -// stringstream ss; +// std::stringstream ss; // ss << row_dest << ", " << col_dest << " lies outside the range of the destination matrix (" << // _rows << ", " << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // if (row_dest+rows > _rows || col_dest+cols > _cols) { -// stringstream ss; +// std::stringstream ss; // ss << "Adding a " << rows << ", " << cols << " matrix extends beyond the range of the destination matrix (" << // _rows << ", " << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // if (row_src >= mat_src.rows() || col_src >= mat_src.columns()) { -// stringstream ss; +// std::stringstream ss; // ss << mat_src.rows() << ", " << mat_src.columns() << " lies outside the range of the source matrix (" << // mat_src.rows() << ", " << mat_src.columns() << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // if (row_src+rows > mat_src.rows() || col_src+cols > mat_src.columns()) { -// stringstream ss; +// std::stringstream ss; // ss << "Adding a " << rows << ", " << cols << " matrix extends beyond the range of the destination matrix (" << // mat_src.rows() << ", " << mat_src.columns() << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // blockadd(row_dest, col_dest, mat_src, row_src, col_src, rows, cols); @@ -1094,30 +1092,30 @@ void matrix_2d::copyelements(const UINT32& row_dest, const UINT32& column_dest, // const UINT32& row_src, const UINT32& col_src, const UINT32& rows, const UINT32& cols) //{ // if (rows != cols) -// throw boost::enable_current_exception(runtime_error("The source matrix is not square.")); +// throw boost::enable_current_exception(std::runtime_error("The source matrix is not square.")); // if (row_dest >= _rows || col_dest >= _cols) { -// stringstream ss; +// std::stringstream ss; // ss << row_dest << ", " << col_dest << " lies outside the range of the destination matrix (" << // _rows << ", " << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // if (row_dest+rows > _rows || col_dest+cols > _cols) { -// stringstream ss; +// std::stringstream ss; // ss << "Adding a " << rows << ", " << cols << " matrix extends beyond the range of the destination matrix (" << // _rows << ", " << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // if (row_src >= mat_src.rows() || col_src >= mat_src.columns()) { -// stringstream ss; +// std::stringstream ss; // ss << mat_src.rows() << ", " << mat_src.columns() << " lies outside the range of the source matrix (" << // mat_src.rows() << ", " << mat_src.columns() << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // if (row_src+rows > mat_src.rows() || col_src+cols > mat_src.columns()) { -// stringstream ss; +// std::stringstream ss; // ss << "Adding a " << rows << ", " << cols << " matrix extends beyond the range of the destination matrix (" << // mat_src.rows() << ", " << mat_src.columns() << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // blockTadd(row_dest, col_dest, mat_src, row_src, col_src, rows, cols); @@ -1129,15 +1127,15 @@ void matrix_2d::copyelements(const UINT32& row_dest, const UINT32& column_dest, //{ // // comparison of unsigned expression < 0 is always false // if (row_begin >= _rows) { -// stringstream ss; +// std::stringstream ss; // ss << row_begin << ", " << col_begin << " lies outside the range of the matrix (" << _rows << ", " << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // comparison of unsigned expression < 0 is always false // if (col_begin >= _cols) { -// stringstream ss; +// std::stringstream ss; // ss << row_begin << ", " << col_begin << " lies outside the range of the matrix (" << _rows << ", " << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // if (rows < 1) // rows = _rows - row_begin; // apply scale from row_begin to end @@ -1145,14 +1143,14 @@ void matrix_2d::copyelements(const UINT32& row_dest, const UINT32& column_dest, // columns = _cols - col_begin; // apply scale from col_begin to end // // if (row_begin + rows > _rows || rows < 0) { -// stringstream ss; +// std::stringstream ss; // ss << row_begin + rows << ", " << col_begin + rows << " lies outside the range of the matrix (" << _rows << ", " << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // if (col_begin + columns > _cols || columns < 0) { -// stringstream ss; +// std::stringstream ss; // ss << row_begin + rows << ", " << col_begin + rows << " lies outside the range of the matrix (" << _rows << ", " << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // UINT32 i, j, row_end(row_begin+rows), col_end(col_begin+columns); @@ -1231,7 +1229,7 @@ void matrix_2d::sweep(UINT32 k1, UINT32 k2) matrix_2d matrix_2d::sweepinverse() { if (_rows != _cols) - throw boost::enable_current_exception(runtime_error("sweepinverse(): Matrix is not square.")); + throw boost::enable_current_exception(std::runtime_error("sweepinverse(): Matrix is not square.")); sweep(0, _rows); return *this; @@ -1250,7 +1248,7 @@ matrix_2d matrix_2d::sweepinverse() //matrix_2d matrix_2d::gaussianinverse() //{ // if (_rows != _cols) -// throw boost::enable_current_exception(runtime_error("gaussinverse(): Matrix is not square.")); +// throw boost::enable_current_exception(std::runtime_error("gaussinverse(): Matrix is not square.")); // // // create copy of upper triangular // matrix_2d matcopy(*this); @@ -1268,7 +1266,7 @@ matrix_2d matrix_2d::sweepinverse() // for (nCol = nRow+1; nCol=0; nRow--) // { // if (fabs(matcopy.get(nRow, nRow)) < epsilon) -// throw boost::enable_current_exception(runtime_error("gaussinverse(): Matrix inversion failed.")); +// throw boost::enable_current_exception(std::runtime_error("gaussinverse(): Matrix inversion failed.")); // // for (nCol = 0; nCol _rows || columnend > _cols) // { -// stringstream ss; -// ss << "identity(): " << endl; +// std::stringstream ss; +// ss << "identity(): " << std::endl; // if (rowend >= _rows) -// ss << " Row index (destination) " << rowend << " exceeds the matrix row count (" << _rows << "). " << endl; +// ss << " Row index (destination) " << rowend << " exceeds the matrix row count (" << _rows << "). " << std::endl; // if (columnend >= _cols) // ss << " Column index (destination) " << columnend << " exceeds the matrix column count (" << _cols << ")."; -// throw boost::enable_current_exception(runtime_error(ss.str())); +// throw boost::enable_current_exception(std::runtime_error(ss.str())); // } // // UINT32 row, column; @@ -1655,29 +1653,29 @@ void matrix_2d::zero(const UINT32& row_begin, const UINT32& col_begin, //// coutMatrix() //// -//void matrix_2d::coutmatrix(const string& sTitle, const short& precision) const +//void matrix_2d::coutmatrix(const std::string& sTitle, const short& precision) const //{ -// cout << sTitle << " (" << _rows << "x" << _cols << ")" << endl; +// std::cout << sTitle << " (" << _rows << "x" << _cols << ")" << std::endl; // UINT32 column, row; -// stringstream ss; +// std::stringstream ss; // for (row=0; row<_rows; row++) { // for (column=0; column<_cols; column++) { // ss.str(""); -// ss << fixed << setprecision(precision) << get(row, column) << " "; +// ss << std::fixed << std::setprecision(precision) << get(row, column) << " "; // if (precision < 1) -// cout << setw(3) << ss.str(); +// std::cout << std::setw(3) << ss.str(); // else -// cout << setw(precision + 4) << right << ss.str(); +// std::cout << std::setw(precision + 4) << std::right << ss.str(); // // if (column > 20) // break; // } -// cout << endl; +// std::cout << std::endl; // if (row > 20) // break; // // } -// cout << endl; +// std::cout << std::endl; // //} // coutMatrix() @@ -1738,7 +1736,7 @@ matrix_2d matrix_2d::operator*(const double& rhs) const //matrix_2d matrix_2d::operator*(const matrix_2d& rhs) const //{ // if (_cols != rhs.rows()) -// throw boost::enable_current_exception(runtime_error("operator*(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("operator*(): Matrix dimensions are incompatible.")); // // matrix_2d m(_rows, rhs.columns()); // @@ -1760,7 +1758,7 @@ matrix_2d matrix_2d::operator*(const double& rhs) const //matrix_2d matrix_2d::operator+(const matrix_2d& rhs) const //{ // if (_cols != rhs.rows()) -// throw boost::enable_current_exception(runtime_error("operator+(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("operator+(): Matrix dimensions are incompatible.")); // // matrix_2d m(_rows, rhs.columns()); // @@ -1780,7 +1778,7 @@ matrix_2d matrix_2d::operator*(const double& rhs) const //matrix_2d matrix_2d::operator-(const matrix_2d& rhs) const //{ // if (_cols != rhs.rows()) -// throw boost::enable_current_exception(runtime_error("operator-(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("operator-(): Matrix dimensions are incompatible.")); // // matrix_2d m(_rows, rhs.columns()); // @@ -1801,7 +1799,7 @@ matrix_2d matrix_2d::operator*(const double& rhs) const //matrix_2d matrix_2d::operator*=(const matrix_2d& rhs) //{ // if (_cols != rhs.rows()) -// throw boost::enable_current_exception(runtime_error("operator*=(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("operator*=(): Matrix dimensions are incompatible.")); // // matrix_2d m(_rows, rhs.columns()); // @@ -1822,7 +1820,7 @@ matrix_2d matrix_2d::operator*(const double& rhs) const //matrix_2d matrix_2d::operator+=(const matrix_2d& rhs) //{ // if (_cols != rhs.columns() || _rows != rhs.rows()) -// throw boost::enable_current_exception(runtime_error("operator+=(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("operator+=(): Matrix dimensions are incompatible.")); // // // Perform the addition // UINT32 row, column; @@ -1837,7 +1835,7 @@ matrix_2d matrix_2d::operator*(const double& rhs) const //matrix_2d matrix_2d::operator-=(const matrix_2d& rhs) //{ // if (_cols != rhs.columns() || _rows != rhs.rows()) -// throw boost::enable_current_exception(runtime_error("operator-=(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("operator-=(): Matrix dimensions are incompatible.")); // // // Perform the addition // UINT32 row, column; @@ -1850,7 +1848,7 @@ matrix_2d matrix_2d::operator*(const double& rhs) const matrix_2d matrix_2d::add(const matrix_2d& rhs) { if (_rows != rhs.rows() || _cols != rhs.columns()) - throw boost::enable_current_exception(runtime_error("add(): Result matrix dimensions are incompatible.")); + throw boost::enable_current_exception(std::runtime_error("add(): Result matrix dimensions are incompatible.")); UINT32 row, column; for (row=0; row<_rows; row++) { @@ -1865,10 +1863,10 @@ matrix_2d matrix_2d::add(const matrix_2d& rhs) //matrix_2d matrix_2d::add(const matrix_2d& lhs, const matrix_2d& rhs) //{ // if (_rows != lhs.rows() || _cols != lhs.columns()) -// throw boost::enable_current_exception(runtime_error("add(): Result matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("add(): Result matrix dimensions are incompatible.")); // // if (_rows != rhs.rows() || _cols != rhs.columns()) -// throw boost::enable_current_exception(runtime_error("add(): Result matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("add(): Result matrix dimensions are incompatible.")); // // UINT32 row, column; // for (row=0; row<_rows; row++) { @@ -1884,7 +1882,7 @@ matrix_2d matrix_2d::add(const matrix_2d& rhs) //matrix_2d matrix_2d::multiply(const matrix_2d& rhs) //{ // if (_cols != rhs.rows()) -// throw boost::enable_current_exception(runtime_error("multiply(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("multiply(): Matrix dimensions are incompatible.")); // // matrix_2d m(_rows, rhs.columns()); // @@ -1937,9 +1935,9 @@ matrix_2d matrix_2d::multiply_mkl(const char* lhs_trans, const matrix_2d& rhs, c } if (lhs_cols != rhs_rows) - throw boost::enable_current_exception(runtime_error("multiply_mkl(): Matrix dimensions are incompatible.")); + throw boost::enable_current_exception(std::runtime_error("multiply_mkl(): Matrix dimensions are incompatible.")); else if (_rows != lhs_rows || _cols != rhs_cols) - throw boost::enable_current_exception(runtime_error("multiply_mkl(): Result matrix dimensions are incompatible.")); + throw boost::enable_current_exception(std::runtime_error("multiply_mkl(): Result matrix dimensions are incompatible.")); dgemm(lhs_trans, rhs_trans, // Type of matrices &lhs_rows, // rows of A @@ -1961,9 +1959,9 @@ matrix_2d matrix_2d::multiply_mkl(const char* lhs_trans, const matrix_2d& rhs, c //matrix_2d matrix_2d::multiply(const matrix_2d& lhs, const matrix_2d& rhs) //{ // if (lhs.columns() != rhs.rows()) -// throw boost::enable_current_exception(runtime_error("multiply(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("multiply(): Matrix dimensions are incompatible.")); // else if (_rows != lhs.rows() || _cols != rhs.columns()) -// throw boost::enable_current_exception(runtime_error("multiply(): Result matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("multiply(): Result matrix dimensions are incompatible.")); // // // Perform the multiplication // UINT32 row, column, i; @@ -2014,9 +2012,9 @@ matrix_2d matrix_2d::multiply_mkl(const matrix_2d& lhs, const char* lhs_trans, } if (lhs_cols != rhs_rows) - throw boost::enable_current_exception(runtime_error("multiply_mkl(): Matrix dimensions are incompatible.")); + throw boost::enable_current_exception(std::runtime_error("multiply_mkl(): Matrix dimensions are incompatible.")); else if (_rows != lhs_rows || _cols != rhs_cols) - throw boost::enable_current_exception(runtime_error("multiply_mkl(): Result matrix dimensions are incompatible.")); + throw boost::enable_current_exception(std::runtime_error("multiply_mkl(): Result matrix dimensions are incompatible.")); dgemm(lhs_trans, rhs_trans, // Type of matrices &lhs_rows, // rows of A @@ -2041,11 +2039,11 @@ matrix_2d matrix_2d::multiply_mkl(const matrix_2d& lhs, const char* lhs_trans, //matrix_2d matrix_2d::multiply_square(const matrix_2d& lhs, const matrix_2d& rhs) //{ // //if (lhs.columns() != rhs.rows()) -// // throw boost::enable_current_exception(runtime_error("multiply_square(): Matrix dimensions are incompatible.")); +// // throw boost::enable_current_exception(std::runtime_error("multiply_square(): Matrix dimensions are incompatible.")); // //else if (_rows != lhs.rows() || _cols != rhs.columns()) -// // throw boost::enable_current_exception(runtime_error("multiply_square(): Result matrix dimensions are incompatible.")); +// // throw boost::enable_current_exception(std::runtime_error("multiply_square(): Result matrix dimensions are incompatible.")); // //else if (_rows != _cols) -// // throw boost::enable_current_exception(runtime_error("multiply_square(): Result matrix must be square.")); +// // throw boost::enable_current_exception(std::runtime_error("multiply_square(): Result matrix must be square.")); // // // //// Perform the multiplication: // //UINT32 row, column, i; @@ -2070,11 +2068,11 @@ matrix_2d matrix_2d::multiply_mkl(const matrix_2d& lhs, const char* lhs_trans, //matrix_2d matrix_2d::multiply_square_triangular(const matrix_2d& lhs, const matrix_2d& rhs) //{ // if (lhs.columns() != rhs.rows()) -// throw boost::enable_current_exception(runtime_error("multiply_square_triangular(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("multiply_square_triangular(): Matrix dimensions are incompatible.")); // else if (_rows != lhs.rows() || _cols != rhs.columns()) -// throw boost::enable_current_exception(runtime_error("multiply_square_triangular(): Result matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("multiply_square_triangular(): Result matrix dimensions are incompatible.")); // else if (_rows != _cols) -// throw boost::enable_current_exception(runtime_error("multiply_square_triangular(): Result matrix must be square.")); +// throw boost::enable_current_exception(std::runtime_error("multiply_square_triangular(): Result matrix must be square.")); // // // Perform the multiplication: // UINT32 row, column, i; @@ -2097,11 +2095,11 @@ matrix_2d matrix_2d::multiply_mkl(const matrix_2d& lhs, const char* lhs_trans, //matrix_2d matrix_2d::multiply_square_t(const matrix_2d& lhs, const matrix_2d& rhs) //{ // if (lhs.columns() != rhs.rows()) -// throw boost::enable_current_exception(runtime_error("multiply_square_t(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("multiply_square_t(): Matrix dimensions are incompatible.")); // else if (_rows != lhs.rows() || _cols != rhs.columns()) -// throw boost::enable_current_exception(runtime_error("multiply_square_t(): Result matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("multiply_square_t(): Result matrix dimensions are incompatible.")); // else if (_rows != _cols) -// throw boost::enable_current_exception(runtime_error("multiply_square_t(): Result matrix must be square.")); +// throw boost::enable_current_exception(std::runtime_error("multiply_square_t(): Result matrix must be square.")); // // // Perform the multiplication: // UINT32 row, column, i; @@ -2121,7 +2119,7 @@ matrix_2d matrix_2d::multiply_mkl(const matrix_2d& lhs, const char* lhs_trans, matrix_2d matrix_2d::transpose(const matrix_2d& matA) { if ((matA.columns() != _rows) || (matA.rows() != _cols)) - throw boost::enable_current_exception(runtime_error("transpose(): Matrix dimensions are incompatible.")); + throw boost::enable_current_exception(std::runtime_error("transpose(): Matrix dimensions are incompatible.")); UINT32 column, row; for (row=0; row<_rows; row++) @@ -2163,7 +2161,7 @@ double matrix_2d::compute_maximum_value() //double matrix_2d::vectordifference(const matrix_2d& rhs) //{ // if (_rows != rhs.rows() && _cols != rhs.columns()) -// throw boost::enable_current_exception(runtime_error("vectordifference(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("vectordifference(): Matrix dimensions are incompatible.")); // // double diffPrev(0.), diff(0.); // for (UINT32 row=0; row<_rows; ++row) @@ -2178,10 +2176,10 @@ double matrix_2d::compute_maximum_value() //void matrix_2d::difference(const matrix_2d* lhs, const matrix_2d* rhs) //{ // if (_rows != rhs->rows() && _cols != rhs->columns()) -// throw boost::enable_current_exception(runtime_error("difference(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("difference(): Matrix dimensions are incompatible.")); // // if (_rows != lhs->rows() && _cols != lhs->columns()) -// throw boost::enable_current_exception(runtime_error("difference(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("difference(): Matrix dimensions are incompatible.")); // // UINT32 i, j; // for (i=0; i<_rows; ++i) @@ -2193,7 +2191,7 @@ double matrix_2d::compute_maximum_value() //void matrix_2d::difference(const UINT32& row_begin, const UINT32& col_begin, const matrix_2d& lhs, const matrix_2d& rhs) //{ // if (lhs.rows() != rhs.rows() && lhs.columns() != rhs.columns()) -// throw boost::enable_current_exception(runtime_error("differenceabs(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("differenceabs(): Matrix dimensions are incompatible.")); // if (row_begin >= _rows) // return; // if (col_begin >= _cols) @@ -2214,10 +2212,10 @@ double matrix_2d::compute_maximum_value() //void matrix_2d::differenceabs(const matrix_2d& lhs, const matrix_2d& rhs) //{ // if (_rows != rhs.rows() && _cols != rhs.columns()) -// throw boost::enable_current_exception(runtime_error("differenceabs(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("differenceabs(): Matrix dimensions are incompatible.")); // // if (_rows != lhs.rows() && _cols != lhs.columns()) -// throw boost::enable_current_exception(runtime_error("differenceabs(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("differenceabs(): Matrix dimensions are incompatible.")); // // UINT32 i, j; // for (i=0; i<_rows; ++i) @@ -2228,10 +2226,10 @@ double matrix_2d::compute_maximum_value() //void matrix_2d::differenceabs(const matrix_2d& lhs, const matrix_2d* rhs) //{ // if (_rows != rhs->rows() && _cols != rhs->columns()) -// throw boost::enable_current_exception(runtime_error("differenceabs(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("differenceabs(): Matrix dimensions are incompatible.")); // // if (_rows != lhs.rows() && _cols != lhs.columns()) -// throw boost::enable_current_exception(runtime_error("differenceabs(): Matrix dimensions are incompatible.")); +// throw boost::enable_current_exception(std::runtime_error("differenceabs(): Matrix dimensions are incompatible.")); // // UINT32 i, j; // for (i=0; i<_rows; ++i) @@ -2240,7 +2238,7 @@ double matrix_2d::compute_maximum_value() //} #ifdef _MSDEBUG -void matrix_2d::trace(const string& comment, const string& format) const +void matrix_2d::trace(const std::string& comment, const std::string& format) const { UINT32 i, j; if (comment.empty()) @@ -2256,7 +2254,7 @@ void matrix_2d::trace(const string& comment, const string& format) const #endif #ifdef _MSDEBUG -void matrix_2d::trace(const string& comment, const string& submat_comment, const string& format, +void matrix_2d::trace(const std::string& comment, const std::string& submat_comment, const std::string& format, const UINT32& row_begin, const UINT32& col_begin, const UINT32& rows, const UINT32& columns) const { // comparison of unsigned expression < 0 is always false diff --git a/dynadjust/include/math/dnamatrix_contiguous.hpp b/dynadjust/include/math/dnamatrix_contiguous.hpp index e84a587f..37ffd6de 100644 --- a/dynadjust/include/math/dnamatrix_contiguous.hpp +++ b/dynadjust/include/math/dnamatrix_contiguous.hpp @@ -59,18 +59,16 @@ #include #include // memset -using namespace std; -using namespace boost; using namespace dynadjust::memory; using namespace dynadjust::exception; namespace dynadjust { namespace math { class matrix_2d; -typedef vector v_mat_2d, *pv_mat_2d; +typedef std::vector v_mat_2d, *pv_mat_2d; typedef v_mat_2d::iterator _it_v_mat_2d; typedef v_mat_2d::const_iterator _it_v_mat_2d_const; -typedef vector vv_mat_2d; +typedef std::vector vv_mat_2d; // Uncomment the following to store matrices in row-wise fashion //#define DNAMATRIX_ROW_WISE @@ -305,11 +303,11 @@ class matrix_2d: public new_handler_support double compute_maximum_value(); // Printing - //void coutmatrix(const string& sTitle, const short& precision) const; - friend ostream& operator<< (ostream& os, const matrix_2d& rhs); - //friend ostream& operator<< (ostream& os, const matrix_2d* rhs); - //friend ostream& operator<< (ostream& os, const v_mat_2d& rhs); - //friend ostream& operator<< (ostream& os, const v_mat_2d* rhs); + //void coutmatrix(const std::string& sTitle, const short& precision) const; + friend std::ostream& operator<< (std::ostream& os, const matrix_2d& rhs); + //friend ostream& operator<< (std::ostream& os, const matrix_2d* rhs); + //friend ostream& operator<< (std::ostream& os, const v_mat_2d& rhs); + //friend ostream& operator<< (std::ostream& os, const v_mat_2d* rhs); //// Reading //friend istream& operator>> (istream& is, matrix_2d& rhs); @@ -325,8 +323,8 @@ class matrix_2d: public new_handler_support // debug #ifdef _MSDEBUG - void trace(const string& comment, const string& format) const; - void trace(const string& comment, const string& submat_comment, const string& format, + void trace(const std::string& comment, const std::string& format) const; + void trace(const std::string& comment, const std::string& submat_comment, const std::string& format, const UINT32& row_begin, const UINT32& col_begin, const UINT32& rows, const UINT32& columns) const; #endif diff --git a/dynadjust/include/measurement_types/dnaangle.cpp b/dynadjust/include/measurement_types/dnaangle.cpp index 390990c6..064b4d08 100644 --- a/dynadjust/include/measurement_types/dnaangle.cpp +++ b/dynadjust/include/measurement_types/dnaangle.cpp @@ -79,65 +79,65 @@ bool CDnaAngle::operator< (const CDnaAngle& rhs) const } -void CDnaAngle::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const +void CDnaAngle::WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const { if (comment.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; - *dynaml_stream << " " << endl; - *dynaml_stream << " " << m_strType << "" << endl; + *dynaml_stream << " " << std::endl; + *dynaml_stream << " " << m_strType << "" << std::endl; // Source file from which the measurement came - *dynaml_stream << " " << m_sourceFile << "" << endl; + *dynaml_stream << " " << m_sourceFile << "" << std::endl; if (m_bIgnore) - *dynaml_stream << " *" << endl; + *dynaml_stream << " *" << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; if (m_epoch.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << m_epoch << "" << endl; + *dynaml_stream << " " << m_epoch << "" << std::endl; - *dynaml_stream << " " << m_strFirst << "" << endl; - *dynaml_stream << " " << m_strTarget << "" << endl; - *dynaml_stream << " " << m_strTarget2 << "" << endl; - *dynaml_stream << " " << setprecision(8) << fixed << RadtoDms(m_drValue) << "" << endl; - *dynaml_stream << " " << scientific << setprecision(6) << Seconds(m_dStdDev) << "" << endl; + *dynaml_stream << " " << m_strFirst << "" << std::endl; + *dynaml_stream << " " << m_strTarget << "" << std::endl; + *dynaml_stream << " " << m_strTarget2 << "" << std::endl; + *dynaml_stream << " " << std::setprecision(8) << std::fixed << RadtoDms(m_drValue) << "" << std::endl; + *dynaml_stream << " " << std::scientific << std::setprecision(6) << Seconds(m_dStdDev) << "" << std::endl; if (m_msr_db_map.is_msr_id_set) - *dynaml_stream << " " << m_msr_db_map.msr_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.msr_id << "" << std::endl; - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } void CDnaAngle::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const { - *dna_stream << setw(dmw.msr_type) << m_strType; + *dna_stream << std::setw(dmw.msr_type) << m_strType; if (m_bIgnore) - *dna_stream << setw(dmw.msr_ignore) << "*"; + *dna_stream << std::setw(dmw.msr_ignore) << "*"; else - *dna_stream << setw(dmw.msr_ignore) << " "; - *dna_stream << left << setw(dmw.msr_inst) << m_strFirst; - *dna_stream << left << setw(dmw.msr_targ1) << m_strTarget; - *dna_stream << left << setw(dmw.msr_targ2) << m_strTarget2; - *dna_stream << setw(dmw.msr_linear) << " "; // linear measurement value - *dna_stream << setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << - right << FormatDnaDmsString(RadtoDms(m_drValue), 8); + *dna_stream << std::setw(dmw.msr_ignore) << " "; + *dna_stream << std::left << std::setw(dmw.msr_inst) << m_strFirst; + *dna_stream << std::left << std::setw(dmw.msr_targ1) << m_strTarget; + *dna_stream << std::left << std::setw(dmw.msr_targ2) << m_strTarget2; + *dna_stream << std::setw(dmw.msr_linear) << " "; // linear measurement value + *dna_stream << std::setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << + std::right << FormatDnaDmsString(RadtoDms(m_drValue), 8); UINT32 m_stdDevPrec(3); - *dna_stream << setw(dmw.msr_stddev) << StringFromTW(Seconds(m_dStdDev), dmw.msr_stddev, m_stdDevPrec); - //*dna_stream << setw(dmw.msr_stddev) << fixed << setprecision(3) << Seconds(m_dStdDev); + *dna_stream << std::setw(dmw.msr_stddev) << StringFromTW(Seconds(m_dStdDev), dmw.msr_stddev, m_stdDevPrec); + //*dna_stream << std::setw(dmw.msr_stddev) << std::fixed << std::setprecision(3) << Seconds(m_dStdDev); - *dna_stream << setw(dml.msr_gps_epoch - dml.msr_inst_ht) << " "; - *dna_stream << setw(dmw.msr_gps_epoch) << m_epoch; + *dna_stream << std::setw(dml.msr_gps_epoch - dml.msr_inst_ht) << " "; + *dna_stream << std::setw(dmw.msr_gps_epoch) << m_epoch; if (m_msr_db_map.is_msr_id_set) - *dna_stream << setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; + *dna_stream << std::setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; - *dna_stream << endl; + *dna_stream << std::endl; } @@ -280,13 +280,13 @@ void CDnaAngle::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) c binary_stream->write(reinterpret_cast(&measRecord), sizeof(measurement_t)); } -void CDnaAngle::SetValue(const string& str) +void CDnaAngle::SetValue(const std::string& str) { // convert to radians RadFromDmsString(&m_drValue, trimstr(str)); } -void CDnaAngle::SetStdDev(const string& str) +void CDnaAngle::SetStdDev(const std::string& str) { // convert seconds to radians RadFromSecondsString(&m_dStdDev, trimstr(str)); diff --git a/dynadjust/include/measurement_types/dnaangle.hpp b/dynadjust/include/measurement_types/dnaangle.hpp index d13d4c52..d6901f93 100644 --- a/dynadjust/include/measurement_types/dnaangle.hpp +++ b/dynadjust/include/measurement_types/dnaangle.hpp @@ -32,8 +32,6 @@ #include #include -using namespace std; - namespace dynadjust { namespace measurements { @@ -49,34 +47,34 @@ class CDnaAngle : public CDnaMeasurement //CDnaAngle& operator=(const CDnaAngle& rhs); public: - //CDnaAngle(const bool strIgnore, const string& strFirst, const string& strTarget, const string& strTarget2, const double& drValue, const double& dStdDev); + //CDnaAngle(const bool strIgnore, const std::string& strFirst, const std::string& strTarget, const std::string& strTarget2, const double& drValue, const double& dStdDev); bool operator==(const CDnaAngle& rhs) const; bool operator<(const CDnaAngle& rhs) const; //inline CDnaAngle& operator[](int iIndex) { return this[iIndex]; } - inline string GetTarget() const { return m_strTarget; } - inline string GetTarget2() const { return m_strTarget2; } + inline std::string GetTarget() const { return m_strTarget; } + inline std::string GetTarget2() const { return m_strTarget2; } inline double GetValue() const { return m_drValue; } inline double GetStdDev() const { return m_dStdDev; } - inline void SetTarget(const string& str) { m_strTarget = trimstr(str); } - inline void SetTarget2(const string& str) { m_strTarget2 = trimstr(str); } + inline void SetTarget(const std::string& str) { m_strTarget = trimstr(str); } + inline void SetTarget2(const std::string& str) { m_strTarget2 = trimstr(str); } - void SetValue(const string& str); - void SetStdDev(const string& str); + void SetValue(const std::string& str); + void SetStdDev(const std::string& str); inline virtual UINT32 CalcBinaryRecordCount() const { return 1; } virtual void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const; virtual UINT32 SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_msr, it_vdbid_t& dbidmap); - virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const; + virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const; virtual void WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const; virtual void SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid); protected: - string m_strTarget; - string m_strTarget2; + std::string m_strTarget; + std::string m_strTarget2; double m_drValue; double m_dStdDev; }; diff --git a/dynadjust/include/measurement_types/dnacoordinate.cpp b/dynadjust/include/measurement_types/dnacoordinate.cpp index b8262bfe..f0b71c82 100644 --- a/dynadjust/include/measurement_types/dnacoordinate.cpp +++ b/dynadjust/include/measurement_types/dnacoordinate.cpp @@ -72,30 +72,30 @@ bool CDnaCoordinate::operator< (const CDnaCoordinate& rhs) const } -void CDnaCoordinate::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const +void CDnaCoordinate::WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const { if (comment.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; - *dynaml_stream << " " << endl; - *dynaml_stream << " " << m_strType << "" << endl; + *dynaml_stream << " " << std::endl; + *dynaml_stream << " " << m_strType << "" << std::endl; // Source file from which the measurement came - *dynaml_stream << " " << m_sourceFile << "" << endl; + *dynaml_stream << " " << m_sourceFile << "" << std::endl; if (m_bIgnore) - *dynaml_stream << " *" << endl; + *dynaml_stream << " *" << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; if (m_epoch.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << m_epoch << "" << endl; + *dynaml_stream << " " << m_epoch << "" << std::endl; - *dynaml_stream << " " << m_strFirst << "" << endl; + *dynaml_stream << " " << m_strFirst << "" << std::endl; - *dynaml_stream << " " << fixed << setprecision(10); + *dynaml_stream << " " << std::fixed << std::setprecision(10); switch (GetTypeC()) { case 'P': @@ -108,41 +108,41 @@ void CDnaCoordinate::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& break; } - *dynaml_stream << "" << endl; + *dynaml_stream << "" << std::endl; - *dynaml_stream << " " << scientific << setprecision(6) << Seconds(m_dStdDev) << "" << endl; + *dynaml_stream << " " << std::scientific << std::setprecision(6) << Seconds(m_dStdDev) << "" << std::endl; if (m_msr_db_map.is_msr_id_set) - *dynaml_stream << " " << m_msr_db_map.msr_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.msr_id << "" << std::endl; - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } void CDnaCoordinate::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const { - *dna_stream << setw(dmw.msr_type) << m_strType; + *dna_stream << std::setw(dmw.msr_type) << m_strType; if (m_bIgnore) - *dna_stream << setw(dmw.msr_ignore) << "*"; + *dna_stream << std::setw(dmw.msr_ignore) << "*"; else - *dna_stream << setw(dmw.msr_ignore) << " "; - *dna_stream << left << setw(dmw.msr_inst) << m_strFirst; - *dna_stream << setw(dmw.msr_targ1) << " "; // first target - *dna_stream << setw(dmw.msr_targ2) << " "; // second target - *dna_stream << right << setw(dmw.msr_linear) << fixed << setprecision(9) << RadtoDms(m_drValue); // linear measurement value - *dna_stream << setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << " "; + *dna_stream << std::setw(dmw.msr_ignore) << " "; + *dna_stream << std::left << std::setw(dmw.msr_inst) << m_strFirst; + *dna_stream << std::setw(dmw.msr_targ1) << " "; // first target + *dna_stream << std::setw(dmw.msr_targ2) << " "; // second target + *dna_stream << std::right << std::setw(dmw.msr_linear) << std::fixed << std::setprecision(9) << RadtoDms(m_drValue); // linear measurement value + *dna_stream << std::setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << " "; UINT32 m_stdDevPrec(6); - *dna_stream << setw(dmw.msr_stddev) << StringFromTW(Seconds(m_dStdDev), dmw.msr_stddev, m_stdDevPrec); - //*dna_stream << setw(dmw.msr_stddev) << fixed << setprecision(6) << Seconds(m_dStdDev); + *dna_stream << std::setw(dmw.msr_stddev) << StringFromTW(Seconds(m_dStdDev), dmw.msr_stddev, m_stdDevPrec); + //*dna_stream << std::setw(dmw.msr_stddev) << std::fixed << std::setprecision(6) << Seconds(m_dStdDev); - *dna_stream << setw(dml.msr_gps_epoch - dml.msr_inst_ht) << " "; - *dna_stream << setw(dmw.msr_gps_epoch) << m_epoch; + *dna_stream << std::setw(dml.msr_gps_epoch - dml.msr_inst_ht) << " "; + *dna_stream << std::setw(dmw.msr_gps_epoch) << m_epoch; if (m_msr_db_map.is_msr_id_set) - *dna_stream << setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; + *dna_stream << std::setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; - *dna_stream << endl; + *dna_stream << std::endl; } @@ -232,12 +232,12 @@ void CDnaCoordinate::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrInd } -void CDnaCoordinate::SetValue(const string& str) +void CDnaCoordinate::SetValue(const std::string& str) { RadFromDmsString(&m_drValue, trimstr(str)); } -void CDnaCoordinate::SetStdDev(const string& str) +void CDnaCoordinate::SetStdDev(const std::string& str) { RadFromSecondsString(&m_dStdDev, trimstr(str)); // convert to radians } diff --git a/dynadjust/include/measurement_types/dnacoordinate.hpp b/dynadjust/include/measurement_types/dnacoordinate.hpp index ee5be48a..d0e4d296 100644 --- a/dynadjust/include/measurement_types/dnacoordinate.hpp +++ b/dynadjust/include/measurement_types/dnacoordinate.hpp @@ -37,8 +37,6 @@ const int ASTRONOMIC_LONITUDE = 1; const int GEODETIC_LATITUDE = 2; const int GEODETIC_LONITUDE = 3; -using namespace std; - namespace dynadjust { namespace measurements { @@ -54,7 +52,7 @@ class CDnaCoordinate : public CDnaMeasurement //CDnaCoordinate& operator=(const CDnaCoordinate& rhs); public: - //CDnaCoordinate(const bool, const string&, const double&, const double&); + //CDnaCoordinate(const bool, const std::string&, const double&, const double&); bool operator==(const CDnaCoordinate& rhs) const; bool operator<(const CDnaCoordinate& rhs) const; @@ -64,13 +62,13 @@ class CDnaCoordinate : public CDnaMeasurement inline double GetValue() const { return m_drValue; } inline double GetStdDev() const { return m_dStdDev; } - void SetValue(const string& str); - void SetStdDev(const string& str); + void SetValue(const std::string& str); + void SetStdDev(const std::string& str); inline virtual UINT32 CalcBinaryRecordCount() const { return 1; } virtual void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const; virtual UINT32 SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_msr, it_vdbid_t& dbidmap); - virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const; + virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const; virtual void WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const; virtual void SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid); diff --git a/dynadjust/include/measurement_types/dnadirection.cpp b/dynadjust/include/measurement_types/dnadirection.cpp index 5055ee8e..e9e8a7f9 100644 --- a/dynadjust/include/measurement_types/dnadirection.cpp +++ b/dynadjust/include/measurement_types/dnadirection.cpp @@ -115,7 +115,7 @@ CDnaDirection& CDnaDirection::operator= (CDnaDirection&& rhs) //} -//CDnaDirection::CDnaDirection(const bool bIgnore, const string& strFirst, const string& strTarget, const double& drValue, const double& dStdDev) +//CDnaDirection::CDnaDirection(const bool bIgnore, const std::string& strFirst, const std::string& strTarget, const double& drValue, const double& dStdDev) //{ // m_strType = "D"; // m_strFirst = strFirst; @@ -196,78 +196,78 @@ bool CDnaDirection::operator< (const CDnaDirection& rhs) const } -void CDnaDirection::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool bSubMeasurement /*= false*/) const +void CDnaDirection::WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool bSubMeasurement /*= false*/) const { if (bSubMeasurement) { // Direction set - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; if (m_bIgnore) - *dynaml_stream << " *" << endl; + *dynaml_stream << " *" << std::endl; else - *dynaml_stream << " " << endl; - *dynaml_stream << " " << m_strTarget << "" << endl; - *dynaml_stream << " " << setprecision(8) << fixed - << RadtoDms(m_drValue) << "" << endl; - *dynaml_stream << " " << scientific << setprecision(6) << Seconds(m_dStdDev) << "" << endl; + *dynaml_stream << " " << std::endl; + *dynaml_stream << " " << m_strTarget << "" << std::endl; + *dynaml_stream << " " << std::setprecision(8) << std::fixed + << RadtoDms(m_drValue) << "" << std::endl; + *dynaml_stream << " " << std::scientific << std::setprecision(6) << Seconds(m_dStdDev) << "" << std::endl; if (m_msr_db_map.is_msr_id_set) - *dynaml_stream << " " << m_msr_db_map.msr_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.msr_id << "" << std::endl; - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } else { // Zenith distance, vertical angle if (comment.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; - *dynaml_stream << " " << endl; - *dynaml_stream << " " << m_strType << "" << endl; + *dynaml_stream << " " << std::endl; + *dynaml_stream << " " << m_strType << "" << std::endl; // Source file from which the measurement came - *dynaml_stream << " " << m_sourceFile << "" << endl; + *dynaml_stream << " " << m_sourceFile << "" << std::endl; if (m_bIgnore) - *dynaml_stream << " *" << endl; + *dynaml_stream << " *" << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; if (m_epoch.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << m_epoch << "" << endl; + *dynaml_stream << " " << m_epoch << "" << std::endl; - *dynaml_stream << " " << m_strFirst << "" << endl; - *dynaml_stream << " " << m_strTarget << "" << endl; - *dynaml_stream << " " << setprecision(8) << fixed - << RadtoDms(m_drValue) << "" << endl; - *dynaml_stream << " " << scientific << setprecision(6) << Seconds(m_dStdDev) << "" << endl; + *dynaml_stream << " " << m_strFirst << "" << std::endl; + *dynaml_stream << " " << m_strTarget << "" << std::endl; + *dynaml_stream << " " << std::setprecision(8) << std::fixed + << RadtoDms(m_drValue) << "" << std::endl; + *dynaml_stream << " " << std::scientific << std::setprecision(6) << Seconds(m_dStdDev) << "" << std::endl; // Zenith distance, vertical angle switch (GetTypeC()) { case 'Z': case 'V': - *dynaml_stream << " " << fixed << setprecision(3) << m_fInstHeight << "" << endl; - *dynaml_stream << " " << fixed << setprecision(3) << m_fTargHeight << "" << endl; + *dynaml_stream << " " << std::fixed << std::setprecision(3) << m_fInstHeight << "" << std::endl; + *dynaml_stream << " " << std::fixed << std::setprecision(3) << m_fTargHeight << "" << std::endl; break; } if (m_msr_db_map.is_msr_id_set) - *dynaml_stream << " " << m_msr_db_map.msr_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.msr_id << "" << std::endl; - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } } void CDnaDirection::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool bSubMeasurement /*= false*/) const { - *dna_stream << setw(dmw.msr_type) << m_strType; + *dna_stream << std::setw(dmw.msr_type) << m_strType; if (m_bIgnore) - *dna_stream << setw(dmw.msr_ignore) << "*"; + *dna_stream << std::setw(dmw.msr_ignore) << "*"; else - *dna_stream << setw(dmw.msr_ignore) << " "; + *dna_stream << std::setw(dmw.msr_ignore) << " "; // database id width UINT32 width(dml.msr_id_msr - dml.msr_stddev - dmw.msr_stddev); @@ -275,30 +275,30 @@ void CDnaDirection::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& if (bSubMeasurement) { // Direction set - *dna_stream << left << setw(dmw.msr_inst) << " "; - *dna_stream << setw(dmw.msr_targ1) << " "; - *dna_stream << left << setw(dmw.msr_targ2) << m_strTarget; - *dna_stream << setw(dmw.msr_linear) << " "; // linear measurement value - *dna_stream << setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << - right << FormatDnaDmsString(RadtoDms(m_drValue), 8); + *dna_stream << std::left << std::setw(dmw.msr_inst) << " "; + *dna_stream << std::setw(dmw.msr_targ1) << " "; + *dna_stream << std::left << std::setw(dmw.msr_targ2) << m_strTarget; + *dna_stream << std::setw(dmw.msr_linear) << " "; // linear measurement value + *dna_stream << std::setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << + std::right << FormatDnaDmsString(RadtoDms(m_drValue), 8); UINT32 m_stdDevPrec(3); - *dna_stream << setw(dmw.msr_stddev) << StringFromTW(Seconds(m_dStdDev), dmw.msr_stddev, m_stdDevPrec); - //*dna_stream << setw(dmw.msr_stddev) << fixed << setprecision(3) << Seconds(m_dStdDev); + *dna_stream << std::setw(dmw.msr_stddev) << StringFromTW(Seconds(m_dStdDev), dmw.msr_stddev, m_stdDevPrec); + //*dna_stream << std::setw(dmw.msr_stddev) << std::fixed << std::setprecision(3) << Seconds(m_dStdDev); } else { // Azimuth, zenith distance, vertical angle - *dna_stream << left << setw(dmw.msr_inst) << m_strFirst; - *dna_stream << left << setw(dmw.msr_targ1) << m_strTarget; - *dna_stream << setw(dmw.msr_targ2) << " "; - *dna_stream << setw(dmw.msr_linear) << " "; // linear measurement value - *dna_stream << setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << - right << FormatDnaDmsString(RadtoDms(m_drValue), 8); + *dna_stream << std::left << std::setw(dmw.msr_inst) << m_strFirst; + *dna_stream << std::left << std::setw(dmw.msr_targ1) << m_strTarget; + *dna_stream << std::setw(dmw.msr_targ2) << " "; + *dna_stream << std::setw(dmw.msr_linear) << " "; // linear measurement value + *dna_stream << std::setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << + std::right << FormatDnaDmsString(RadtoDms(m_drValue), 8); UINT32 m_stdDevPrec(3); - *dna_stream << setw(dmw.msr_stddev) << StringFromTW(Seconds(m_dStdDev), dmw.msr_stddev, m_stdDevPrec); - //*dna_stream << setw(dmw.msr_stddev) << fixed << setprecision(3) << Seconds(m_dStdDev); + *dna_stream << std::setw(dmw.msr_stddev) << StringFromTW(Seconds(m_dStdDev), dmw.msr_stddev, m_stdDevPrec); + //*dna_stream << std::setw(dmw.msr_stddev) << std::fixed << std::setprecision(3) << Seconds(m_dStdDev); width = dml.msr_gps_epoch - dml.msr_inst_ht; // Zenith distance, vertical angle @@ -306,29 +306,29 @@ void CDnaDirection::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& { case 'Z': case 'V': - *dna_stream << setw(dmw.msr_inst_ht) << fixed << setprecision(3) << m_fInstHeight; - *dna_stream << setw(dmw.msr_targ_ht) << fixed << setprecision(3) << m_fTargHeight; + *dna_stream << std::setw(dmw.msr_inst_ht) << std::fixed << std::setprecision(3) << m_fInstHeight; + *dna_stream << std::setw(dmw.msr_targ_ht) << std::fixed << std::setprecision(3) << m_fTargHeight; width = dml.msr_gps_epoch - dml.msr_targ_ht - dmw.msr_targ_ht; break; } - *dna_stream << setw(width) << " "; - *dna_stream << setw(dmw.msr_gps_epoch) << m_epoch; + *dna_stream << std::setw(width) << " "; + *dna_stream << std::setw(dmw.msr_gps_epoch) << m_epoch; width = 0; } if (m_msr_db_map.is_msr_id_set) { if (width) - *dna_stream << setw(width) << " "; - *dna_stream << setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; + *dna_stream << std::setw(width) << " "; + *dna_stream << std::setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; if (bSubMeasurement) if (m_msr_db_map.is_cls_id_set) - *dna_stream << setw(dmw.msr_id_cluster) << m_msr_db_map.cluster_id; + *dna_stream << std::setw(dmw.msr_id_cluster) << m_msr_db_map.cluster_id; } - *dna_stream << endl; + *dna_stream << std::endl; } void CDnaDirection::SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid*) @@ -539,7 +539,7 @@ void CDnaDirection::SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid*) // // // first station // m_lstn1Index = measRecord->station1; -// ifs_stns->seekg(sizeof(UINT32) + measRecord->station1 * sizeof(station_t), ios::beg); +// ifs_stns->seekg(sizeof(UINT32) + measRecord->station1 * sizeof(station_t), std::ios::beg); // ifs_stns->read(reinterpret_cast(&stationName), sizeof(stationName)); // m_strFirst = stationName; // @@ -549,7 +549,7 @@ void CDnaDirection::SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid*) // // // target station // m_lstn2Index = measRecord->station2; -// ifs_stns->seekg(sizeof(UINT32) + measRecord->station2 * sizeof(station_t), ios::beg); +// ifs_stns->seekg(sizeof(UINT32) + measRecord->station2 * sizeof(station_t), std::ios::beg); // ifs_stns->read(reinterpret_cast(&stationName), sizeof(stationName)); // m_strTarget = stationName; // @@ -639,31 +639,31 @@ void CDnaDirection::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrInde } -//void CDnaDirection::coutDirectionData(ostream &os) const +//void CDnaDirection::coutDirectionData(std::ostream &os) const //{ -// os << setw(16) << " " << setw(MSR2_WIDTH) << m_strTarget; -// os << setw(3) << (m_bIgnore ? "*" : " ") << setw(MEAS_WIDTH) << m_drValue; -// os << setw(VAR_WIDTH) << m_dStdDev; -// os << setw(7) << " "; // m_fInstHeight +// os << std::setw(16) << " " << std::setw(MSR2_WIDTH) << m_strTarget; +// os << std::setw(3) << (m_bIgnore ? "*" : " ") << std::setw(MEAS_WIDTH) << m_drValue; +// os << std::setw(VAR_WIDTH) << m_dStdDev; +// os << std::setw(7) << " "; // m_fInstHeight // switch (GetTypeC()) // { // case 'Z': // case 'V': -// os << setw(7) << setprecision(3) << fixed << m_fTargHeight; +// os << std::setw(7) << std::setprecision(3) << std::fixed << m_fTargHeight; // break; // default: -// os << setw(7) << " "; +// os << std::setw(7) << " "; // break; // } -// os << endl; +// os << std::endl; //} -void CDnaDirection::SetValue(const string& str) +void CDnaDirection::SetValue(const std::string& str) { RadFromDmsString(&m_drValue, trimstr(str)); } -void CDnaDirection::SetStdDev(const string& str) +void CDnaDirection::SetStdDev(const std::string& str) { // convert seconds to radians RadFromSecondsString(&m_dStdDev, trimstr(str)); @@ -674,12 +674,12 @@ void CDnaDirection::SetStdDev(const string& str) // Note: vertical angles and zenith distances are derived // from CDnaDirection, so these methods are provided here, // but don't need instrument height for 'D' measurements. -void CDnaDirection::SetInstrumentHeight(const string& str) +void CDnaDirection::SetInstrumentHeight(const std::string& str) { FloatFromString(m_fInstHeight, trimstr(str)); } -void CDnaDirection::SetTargetHeight(const string& str) +void CDnaDirection::SetTargetHeight(const std::string& str) { FloatFromString(m_fTargHeight, trimstr(str)); } @@ -727,7 +727,7 @@ CDnaAzimuth::~CDnaAzimuth(void) //} -//CDnaAzimuth::CDnaAzimuth(const bool bIgnore, const string& strFirst, const string& strTarget, const double& drValue, const double& dStdDev) +//CDnaAzimuth::CDnaAzimuth(const bool bIgnore, const std::string& strFirst, const std::string& strTarget, const double& drValue, const double& dStdDev) //{ // m_bIgnore = bIgnore; // m_strTarget = strTarget; diff --git a/dynadjust/include/measurement_types/dnadirection.hpp b/dynadjust/include/measurement_types/dnadirection.hpp index 2c8a0f2b..9cec0ab0 100644 --- a/dynadjust/include/measurement_types/dnadirection.hpp +++ b/dynadjust/include/measurement_types/dnadirection.hpp @@ -33,8 +33,6 @@ #include #include -using namespace std; - namespace dynadjust { namespace measurements { @@ -54,7 +52,7 @@ class CDnaDirection : public CDnaMeasurement //CDnaDirection& operator=(const CDnaDirection& rhs); public: - //CDnaDirection(const bool bIgnore, const string& strFirst, const string& strTarget, const double& dValue, const double& dStdDev); + //CDnaDirection(const bool bIgnore, const std::string& strFirst, const std::string& strTarget, const double& dValue, const double& dStdDev); //virtual inline CDnaDirection* clone() const { return new CDnaDirection(*this); } bool operator==(const CDnaDirection& rhs) const; @@ -62,7 +60,7 @@ class CDnaDirection : public CDnaMeasurement //inline CDnaDirection& operator[](int iIndex) { return this[iIndex]; } - inline string GetTarget() const { return m_strTarget; } + inline std::string GetTarget() const { return m_strTarget; } inline double GetValue() const { return m_drValue; } inline double GetStdDev() const { return m_dStdDev; } inline float GetInstrHeight() const { return m_fInstHeight; } @@ -70,23 +68,23 @@ class CDnaDirection : public CDnaMeasurement inline void SetRecordedTotal(const UINT32& l) { m_lRecordedTotal = l; } inline void SetClusterID(const UINT32& id) { m_lsetID = id; } - inline void SetTarget(const string& str) { m_strTarget = trimstr(str); } - void SetValue(const string& str); - void SetStdDev(const string& str); - void SetInstrumentHeight(const string& str); - void SetTargetHeight(const string& str); + inline void SetTarget(const std::string& str) { m_strTarget = trimstr(str); } + void SetValue(const std::string& str); + void SetStdDev(const std::string& str); + void SetInstrumentHeight(const std::string& str); + void SetTargetHeight(const std::string& str); inline virtual UINT32 CalcBinaryRecordCount() const { return 1; } - //void coutDirectionData(ostream &os) const; + //void coutDirectionData(std::ostream &os) const; virtual void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const; virtual UINT32 SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_msr, it_vdbid_t& dbidmap); - virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool bSubMeasurement = false) const; + virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool bSubMeasurement = false) const; virtual void WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool bSubMeasurement = false) const; virtual void SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid); //virtual inline void SetDatabaseMap_bmsIndex(const UINT32& bmsIndex) { m_msr_db_map.bms_index = bmsIndex; } public: - string m_strTarget; + std::string m_strTarget; protected: double m_drValue; @@ -114,7 +112,7 @@ class CDnaAzimuth : public CDnaDirection public: - //CDnaAzimuth(const bool bIgnore, const string& strFirst, const string& strTarget, const double& drValue, const double& dStdDev); + //CDnaAzimuth(const bool bIgnore, const std::string& strFirst, const std::string& strTarget, const double& drValue, const double& dStdDev); bool operator==(const CDnaAzimuth& rhs) const; diff --git a/dynadjust/include/measurement_types/dnadirectionset.cpp b/dynadjust/include/measurement_types/dnadirectionset.cpp index 64e63b40..4057f42f 100644 --- a/dynadjust/include/measurement_types/dnadirectionset.cpp +++ b/dynadjust/include/measurement_types/dnadirectionset.cpp @@ -168,13 +168,13 @@ void CDnaDirectionSet::ClearDirections() } -//bool CDnaDirectionSet::IsRepeatedDirection(string strTarget) +//bool CDnaDirectionSet::IsRepeatedDirection(std::string strTarget) //{ // if (m_vTargetDirections.empty()) // return false; // // if (find_if(m_vTargetDirections.begin(), m_vTargetDirections.end(), -// bind2nd(operator_on_mem(&CDnaDirection::m_strTarget, std::equal_to()), strTarget)) != m_vTargetDirections.end()) +// bind2nd(operator_on_mem(&CDnaDirection::m_strTarget, std::equal_to()), strTarget)) != m_vTargetDirections.end()) // return true; // return false; //} @@ -218,54 +218,54 @@ UINT32 CDnaDirectionSet::CalcBinaryRecordCount() const } -void CDnaDirectionSet::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const +void CDnaDirectionSet::WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const { const size_t dirCount(GetNumDirections()); if (comment.empty()) { - *dynaml_stream << " " << endl; + *dynaml_stream << " -->" << std::endl; } else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; - *dynaml_stream << " " << endl; - *dynaml_stream << " " << m_strType << "" << endl; + *dynaml_stream << " " << std::endl; + *dynaml_stream << " " << m_strType << "" << std::endl; // Source file from which the measurement came - *dynaml_stream << " " << m_sourceFile << "" << endl; + *dynaml_stream << " " << m_sourceFile << "" << std::endl; if (m_bIgnore) - *dynaml_stream << " *" << endl; + *dynaml_stream << " *" << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; if (m_epoch.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << m_epoch << "" << endl; + *dynaml_stream << " " << m_epoch << "" << std::endl; - *dynaml_stream << " " << m_strFirst << "" << endl; - *dynaml_stream << " " << m_strTarget << "" << endl; - *dynaml_stream << " " << setprecision(8) << fixed << RadtoDms(m_drValue) << "" << endl; - *dynaml_stream << " " << scientific << setprecision(6) << Seconds(m_dStdDev) << "" << endl; + *dynaml_stream << " " << m_strFirst << "" << std::endl; + *dynaml_stream << " " << m_strTarget << "" << std::endl; + *dynaml_stream << " " << std::setprecision(8) << std::fixed << RadtoDms(m_drValue) << "" << std::endl; + *dynaml_stream << " " << std::scientific << std::setprecision(6) << Seconds(m_dStdDev) << "" << std::endl; if (m_msr_db_map.is_msr_id_set) - *dynaml_stream << " " << m_msr_db_map.msr_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.msr_id << "" << std::endl; if (m_msr_db_map.is_cls_id_set) - *dynaml_stream << " " << m_msr_db_map.cluster_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.cluster_id << "" << std::endl; - *dynaml_stream << " " << dirCount << "" << endl; + *dynaml_stream << " " << dirCount << "" << std::endl; // write directions - vector::const_iterator _it_dir = m_vTargetDirections.begin(); + std::vector::const_iterator _it_dir = m_vTargetDirections.begin(); for (_it_dir = m_vTargetDirections.begin(); _it_dir!=m_vTargetDirections.end(); ++_it_dir) _it_dir->WriteDynaMLMsr(dynaml_stream, comment, true); - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } @@ -273,34 +273,34 @@ void CDnaDirectionSet::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fiel { const size_t dirCount(GetNumDirections()); - *dna_stream << setw(dmw.msr_type) << m_strType; + *dna_stream << std::setw(dmw.msr_type) << m_strType; if (m_bIgnore) - *dna_stream << setw(dmw.msr_ignore) << "*"; + *dna_stream << std::setw(dmw.msr_ignore) << "*"; else - *dna_stream << setw(dmw.msr_ignore) << " "; + *dna_stream << std::setw(dmw.msr_ignore) << " "; - *dna_stream << left << setw(dmw.msr_inst) << m_strFirst; - *dna_stream << left << setw(dmw.msr_targ1) << m_strTarget; - *dna_stream << left << setw(dmw.msr_targ2) << dirCount; - *dna_stream << setw(dmw.msr_linear) << " "; // linear measurement value - *dna_stream << setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << - right << FormatDnaDmsString(RadtoDms(m_drValue), 8); + *dna_stream << std::left << std::setw(dmw.msr_inst) << m_strFirst; + *dna_stream << std::left << std::setw(dmw.msr_targ1) << m_strTarget; + *dna_stream << std::left << std::setw(dmw.msr_targ2) << dirCount; + *dna_stream << std::setw(dmw.msr_linear) << " "; // linear measurement value + *dna_stream << std::setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << + std::right << FormatDnaDmsString(RadtoDms(m_drValue), 8); UINT32 m_stdDevPrec(3); - *dna_stream << setw(dmw.msr_stddev) << StringFromTW(Seconds(m_dStdDev), dmw.msr_stddev, m_stdDevPrec); - //*dna_stream << setw(dmw.msr_stddev) << fixed << setprecision(3) << Seconds(m_dStdDev); + *dna_stream << std::setw(dmw.msr_stddev) << StringFromTW(Seconds(m_dStdDev), dmw.msr_stddev, m_stdDevPrec); + //*dna_stream << std::setw(dmw.msr_stddev) << std::fixed << std::setprecision(3) << Seconds(m_dStdDev); - *dna_stream << setw(dml.msr_gps_epoch - dml.msr_inst_ht) << " "; - *dna_stream << setw(dmw.msr_gps_epoch) << m_epoch; + *dna_stream << std::setw(dml.msr_gps_epoch - dml.msr_inst_ht) << " "; + *dna_stream << std::setw(dmw.msr_gps_epoch) << m_epoch; if (m_msr_db_map.is_msr_id_set) - *dna_stream << setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; + *dna_stream << std::setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; if (m_msr_db_map.is_cls_id_set) - *dna_stream << setw(dmw.msr_id_cluster) << m_msr_db_map.cluster_id; + *dna_stream << std::setw(dmw.msr_id_cluster) << m_msr_db_map.cluster_id; - *dna_stream << endl; + *dna_stream << std::endl; // write directions - vector::const_iterator _it_dir = m_vTargetDirections.begin(); + std::vector::const_iterator _it_dir = m_vTargetDirections.begin(); for (_it_dir = m_vTargetDirections.begin(); _it_dir!=m_vTargetDirections.end(); ++_it_dir) _it_dir->WriteDNAMsr(dna_stream, dmw, dml, true); } @@ -356,7 +356,7 @@ void CDnaDirectionSet::SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* e m_epoch = "01.10.1985"; - vector::iterator _it_dir = m_vTargetDirections.begin(); + std::vector::iterator _it_dir = m_vTargetDirections.begin(); for (_it_dir = m_vTargetDirections.begin(); _it_dir!=m_vTargetDirections.end(); ++_it_dir) _it_dir->SimulateMsr(vStations, ellipsoid); } @@ -403,7 +403,7 @@ UINT32 CDnaDirectionSet::SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& i CDnaMeasurement::SetDatabaseMap(*dbidmap); // now covariances - vector::iterator _it_dir = m_vTargetDirections.begin(); + std::vector::iterator _it_dir = m_vTargetDirections.begin(); for (; _it_dir!=m_vTargetDirections.end(); ++_it_dir) { it_msr++; @@ -448,22 +448,22 @@ void CDnaDirectionSet::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrI binary_stream->write(reinterpret_cast(&measRecord), sizeof(measurement_t)); - vector::const_iterator _it_dir; + std::vector::const_iterator _it_dir; for (_it_dir = m_vTargetDirections.begin(); _it_dir!=m_vTargetDirections.end(); ++_it_dir) _it_dir->WriteBinaryMsr(binary_stream, msrIndex); } -void CDnaDirectionSet::SetValue(const string& str) +void CDnaDirectionSet::SetValue(const std::string& str) { RadFromDmsString(&m_drValue, trimstr(str)); } -void CDnaDirectionSet::SetStdDev(const string& str) +void CDnaDirectionSet::SetStdDev(const std::string& str) { RadFromSecondsString(&m_dStdDev, trimstr(str)); } -void CDnaDirectionSet::SetTotal(const string& str) +void CDnaDirectionSet::SetTotal(const std::string& str) { m_lRecordedTotal = LongFromString(trimstr(str)); m_vTargetDirections.reserve(m_lRecordedTotal); diff --git a/dynadjust/include/measurement_types/dnadirectionset.hpp b/dynadjust/include/measurement_types/dnadirectionset.hpp index 5f8b8c1d..f6858594 100644 --- a/dynadjust/include/measurement_types/dnadirectionset.hpp +++ b/dynadjust/include/measurement_types/dnadirectionset.hpp @@ -36,9 +36,6 @@ #include -using namespace std; -using namespace boost; - namespace dynadjust { namespace measurements { @@ -61,7 +58,7 @@ class CDnaDirectionSet : public CDnaMeasurement CDnaDirectionSet(const UINT32 lsetID); //CDnaDirectionSet(bool bIgnore, - // const string& strFirst, const string& strTarget, + // const std::string& strFirst, const std::string& strTarget, // const double& drValue, const double& dStdDev, // const float& fInstrHeight, const float& fTargetHeight); @@ -70,25 +67,25 @@ class CDnaDirectionSet : public CDnaMeasurement //inline CDnaDirectionSet& operator[](int iIndex) { return this[iIndex]; } - void LoadDirectionSet(const char* const, const int&, const string&, const string&, bool, const int&); + void LoadDirectionSet(const char* const, const int&, const std::string&, const std::string&, bool, const int&); inline UINT32 GetClusterID() const { return m_lsetID; } - inline string GetTarget() const { return m_strTarget; } + inline std::string GetTarget() const { return m_strTarget; } inline UINT32 GetTotal() const { return m_lRecordedTotal; } inline double GetValue() const { return m_drValue; } inline double GetStdDev() const { return m_dStdDev; } inline size_t GetNumDirections() const { return m_vTargetDirections.size(); } - inline vector* GetDirections_ptr() { return &m_vTargetDirections; } + inline std::vector* GetDirections_ptr() { return &m_vTargetDirections; } inline void SetClusterID(const UINT32& id) { m_lsetID = id; } - inline void SetTarget(const string& str) { m_strTarget = trimstr(str); } + inline void SetTarget(const std::string& str) { m_strTarget = trimstr(str); } inline void SetTotal(const UINT32& l) { m_lRecordedTotal = l; } inline void SetNonIgnoredDirns(const UINT32& n) { m_lNonIgnoredDirns = n; } - void SetTotal(const string& str); - void SetValue(const string& str); - void SetStdDev(const string& str); + void SetTotal(const std::string& str); + void SetValue(const std::string& str); + void SetStdDev(const std::string& str); void AddDirection(const CDnaMeasurement* pDirection); void ClearDirections(); @@ -97,7 +94,7 @@ class CDnaDirectionSet : public CDnaMeasurement virtual UINT32 CalcBinaryRecordCount() const; virtual void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const; virtual UINT32 SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_msr, it_vdbid_t& dbidmap); - virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const; + virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const; virtual void WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const; virtual void SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid); @@ -105,14 +102,14 @@ class CDnaDirectionSet : public CDnaMeasurement void SetDatabaseMaps(it_vdbid_t& dbidmap); - string m_strTarget; + std::string m_strTarget; protected: double m_drValue; double m_dStdDev; UINT32 m_lRecordedTotal; UINT32 m_lNonIgnoredDirns; - vector m_vTargetDirections; + std::vector m_vTargetDirections; UINT32 m_lsetID; it_vdbid_t m_dbidmap; diff --git a/dynadjust/include/measurement_types/dnadistance.cpp b/dynadjust/include/measurement_types/dnadistance.cpp index 2144a8ed..60de315f 100644 --- a/dynadjust/include/measurement_types/dnadistance.cpp +++ b/dynadjust/include/measurement_types/dnadistance.cpp @@ -89,64 +89,64 @@ bool CDnaDistance::operator< (const CDnaDistance& rhs) const } -void CDnaDistance::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const +void CDnaDistance::WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const { if (comment.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; - *dynaml_stream << " " << endl; - *dynaml_stream << " " << m_strType << "" << endl; + *dynaml_stream << " " << std::endl; + *dynaml_stream << " " << m_strType << "" << std::endl; // Source file from which the measurement came - *dynaml_stream << " " << m_sourceFile << "" << endl; + *dynaml_stream << " " << m_sourceFile << "" << std::endl; if (m_bIgnore) - *dynaml_stream << " *" << endl; + *dynaml_stream << " *" << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; if (m_epoch.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << m_epoch << "" << endl; + *dynaml_stream << " " << m_epoch << "" << std::endl; - *dynaml_stream << " " << m_strFirst << "" << endl; - *dynaml_stream << " " << m_strTarget << "" << endl; - *dynaml_stream << " " << fixed << setprecision(4) << m_dValue << "" << endl; - *dynaml_stream << " " << fixed << setprecision(4) << m_dStdDev << "" << endl; + *dynaml_stream << " " << m_strFirst << "" << std::endl; + *dynaml_stream << " " << m_strTarget << "" << std::endl; + *dynaml_stream << " " << std::fixed << std::setprecision(4) << m_dValue << "" << std::endl; + *dynaml_stream << " " << std::fixed << std::setprecision(4) << m_dStdDev << "" << std::endl; switch (GetTypeC()) { case 'S': - *dynaml_stream << " " << fixed << setprecision(3) << m_fInstHeight << "" << endl; - *dynaml_stream << " " << fixed << setprecision(3) << m_fTargHeight << "" << endl; + *dynaml_stream << " " << std::fixed << std::setprecision(3) << m_fInstHeight << "" << std::endl; + *dynaml_stream << " " << std::fixed << std::setprecision(3) << m_fTargHeight << "" << std::endl; break; } if (m_msr_db_map.is_msr_id_set) - *dynaml_stream << " " << m_msr_db_map.msr_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.msr_id << "" << std::endl; - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } void CDnaDistance::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const { - *dna_stream << setw(dmw.msr_type) << m_strType; + *dna_stream << std::setw(dmw.msr_type) << m_strType; if (m_bIgnore) - *dna_stream << setw(dmw.msr_ignore) << "*"; + *dna_stream << std::setw(dmw.msr_ignore) << "*"; else - *dna_stream << setw(dmw.msr_ignore) << " "; + *dna_stream << std::setw(dmw.msr_ignore) << " "; - *dna_stream << left << setw(dmw.msr_inst) << m_strFirst; - *dna_stream << left << setw(dmw.msr_targ1) << m_strTarget; - *dna_stream << setw(dmw.msr_targ2) << " "; - *dna_stream << right << setw(dmw.msr_linear) << fixed << setprecision(4) << m_dValue; - *dna_stream << setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << " "; + *dna_stream << std::left << std::setw(dmw.msr_inst) << m_strFirst; + *dna_stream << std::left << std::setw(dmw.msr_targ1) << m_strTarget; + *dna_stream << std::setw(dmw.msr_targ2) << " "; + *dna_stream << std::right << std::setw(dmw.msr_linear) << std::fixed << std::setprecision(4) << m_dValue; + *dna_stream << std::setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << " "; UINT32 m_stdDevPrec(3); - *dna_stream << setw(dmw.msr_stddev) << StringFromTW(m_dStdDev, dmw.msr_stddev, m_stdDevPrec); - //*dna_stream << setw(dmw.msr_stddev) << fixed << setprecision(3) << m_dStdDev; + *dna_stream << std::setw(dmw.msr_stddev) << StringFromTW(m_dStdDev, dmw.msr_stddev, m_stdDevPrec); + //*dna_stream << std::setw(dmw.msr_stddev) << std::fixed << std::setprecision(3) << m_dStdDev; // database id width UINT32 width(dml.msr_gps_epoch - dml.msr_inst_ht); @@ -155,19 +155,19 @@ void CDnaDistance::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& switch (GetTypeC()) { case 'S': - *dna_stream << setw(dmw.msr_inst_ht) << fixed << setprecision(3) << m_fInstHeight; - *dna_stream << setw(dmw.msr_targ_ht) << fixed << setprecision(3) << m_fTargHeight; + *dna_stream << std::setw(dmw.msr_inst_ht) << std::fixed << std::setprecision(3) << m_fInstHeight; + *dna_stream << std::setw(dmw.msr_targ_ht) << std::fixed << std::setprecision(3) << m_fTargHeight; width = dml.msr_gps_epoch - dml.msr_targ_ht - dmw.msr_targ_ht; break; } - *dna_stream << setw(width) << " "; - *dna_stream << setw(dmw.msr_gps_epoch) << m_epoch; + *dna_stream << std::setw(width) << " "; + *dna_stream << std::setw(dmw.msr_gps_epoch) << m_epoch; if (m_msr_db_map.is_msr_id_set) - *dna_stream << setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; + *dna_stream << std::setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; - *dna_stream << endl; + *dna_stream << std::endl; } @@ -316,12 +316,12 @@ void CDnaDistance::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex } -void CDnaDistance::SetValue(const string& str) +void CDnaDistance::SetValue(const std::string& str) { DoubleFromString(m_dValue, trimstr(str)); } -void CDnaDistance::SetStdDev(const string& str) +void CDnaDistance::SetStdDev(const std::string& str) { DoubleFromString(m_dStdDev, trimstr(str)); } @@ -331,12 +331,12 @@ void CDnaDistance::SetStdDev(const string& str) // Note: slope distances are derived from CDnaDistance, so // these methods are provided here, but don't need // instrument height for 'C', 'E' and 'M' measurements. -void CDnaDistance::SetInstrumentHeight(const string& str) +void CDnaDistance::SetInstrumentHeight(const std::string& str) { FloatFromString(m_fInstHeight, trimstr(str)); } -void CDnaDistance::SetTargetHeight(const string& str) +void CDnaDistance::SetTargetHeight(const std::string& str) { DoubleFromString(m_fTargHeight, trimstr(str)); } diff --git a/dynadjust/include/measurement_types/dnadistance.hpp b/dynadjust/include/measurement_types/dnadistance.hpp index 53d2ddb0..99ad3ea5 100644 --- a/dynadjust/include/measurement_types/dnadistance.hpp +++ b/dynadjust/include/measurement_types/dnadistance.hpp @@ -31,8 +31,6 @@ #include -using namespace std; - namespace dynadjust { namespace measurements { @@ -48,35 +46,35 @@ class CDnaDistance : public CDnaMeasurement //CDnaDistance& operator=(const CDnaDistance& rhs); public: - //CDnaDistance(const bool bIgnore, const string& strType, const string& strFirst, const string& strTarget, const double& dValue, const double& dStdDev); + //CDnaDistance(const bool bIgnore, const std::string& strType, const std::string& strFirst, const std::string& strTarget, const double& dValue, const double& dStdDev); bool operator==(const CDnaDistance& rhs) const; bool operator<(const CDnaDistance& rhs) const; //inline CDnaDistance& operator[](int iIndex) { return this[iIndex]; } - inline string GetTarget() const { return m_strTarget; } + inline std::string GetTarget() const { return m_strTarget; } inline double GetValue() const { return m_dValue; } inline double GetStdDev() const { return m_dStdDev; } inline float GetInstrHeight() const { return m_fInstHeight; } inline float GetTargetHeight() const { return m_fTargHeight; } - inline void SetTarget(const string& str) { m_strTarget = trimstr(str); } - void SetValue(const string& str); - void SetStdDev(const string& str); - void SetInstrumentHeight(const string& str); - void SetTargetHeight(const string& str); + inline void SetTarget(const std::string& str) { m_strTarget = trimstr(str); } + void SetValue(const std::string& str); + void SetStdDev(const std::string& str); + void SetInstrumentHeight(const std::string& str); + void SetTargetHeight(const std::string& str); inline virtual UINT32 CalcBinaryRecordCount() const { return 1; } virtual void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const; virtual UINT32 SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_msr, it_vdbid_t& dbidmap); - virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const; + virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const; virtual void WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const; virtual void SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid); protected: - string m_strTarget; + std::string m_strTarget; double m_dValue; double m_dStdDev; float m_fInstHeight; diff --git a/dynadjust/include/measurement_types/dnageometries.hpp b/dynadjust/include/measurement_types/dnageometries.hpp index b5aaec65..bdb378f4 100644 --- a/dynadjust/include/measurement_types/dnageometries.hpp +++ b/dynadjust/include/measurement_types/dnageometries.hpp @@ -34,9 +34,6 @@ #include #include -using namespace std; -using namespace boost::geometry; - namespace dynadjust { namespace geometries { diff --git a/dynadjust/include/measurement_types/dnagpsbaseline.cpp b/dynadjust/include/measurement_types/dnagpsbaseline.cpp index 51e49254..bdacd8f2 100644 --- a/dynadjust/include/measurement_types/dnagpsbaseline.cpp +++ b/dynadjust/include/measurement_types/dnagpsbaseline.cpp @@ -50,7 +50,7 @@ CDnaGpsBaseline::CDnaGpsBaseline(void) , m_lclusterID(0) { SetEpoch(DEFAULT_EPOCH); - SetEpsg(epsgStringFromName(m_referenceFrame)); + SetEpsg(epsgStringFromName(m_referenceFrame)); m_vGpsCovariances.clear(); m_vGpsCovariances.reserve(0); @@ -151,7 +151,7 @@ bool CDnaGpsBaseline::operator== (const CDnaGpsBaseline& rhs) const fabs(m_dX - rhs.m_dX) < PRECISION_1E4 && fabs(m_dY - rhs.m_dY) < PRECISION_1E4 && fabs(m_dZ - rhs.m_dZ) < PRECISION_1E4 && - iequals(m_referenceFrame, rhs.m_referenceFrame) && + boost::iequals(m_referenceFrame, rhs.m_referenceFrame) && m_epoch == rhs.m_epoch ); } @@ -206,55 +206,55 @@ void CDnaGpsBaseline::AddGpsCovariance(const CDnaCovariance* pGpsCovariance) UINT32 CDnaGpsBaseline::CalcBinaryRecordCount() const { UINT32 RecordCount = 3; - vector::const_iterator _it_cov = m_vGpsCovariances.begin(); + std::vector::const_iterator _it_cov = m_vGpsCovariances.begin(); for (; _it_cov!=m_vGpsCovariances.end(); ++_it_cov) RecordCount += _it_cov->CalcBinaryRecordCount(); return RecordCount; } -void CDnaGpsBaseline::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string&, bool) const +void CDnaGpsBaseline::WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string&, bool) const { - *dynaml_stream << " " << m_strFirst << "" << endl; - *dynaml_stream << " " << m_strTarget << "" << endl; + *dynaml_stream << " " << m_strFirst << "" << std::endl; + *dynaml_stream << " " << m_strTarget << "" << std::endl; UINT32 precision = 4; - *dynaml_stream << " " << endl; - *dynaml_stream << " " << fixed << setprecision(precision) << m_dX << "" << endl; - *dynaml_stream << " " << m_dY << "" << endl; - *dynaml_stream << " " << m_dZ << "" << endl; + *dynaml_stream << " " << std::endl; + *dynaml_stream << " " << std::fixed << std::setprecision(precision) << m_dX << "" << std::endl; + *dynaml_stream << " " << m_dY << "" << std::endl; + *dynaml_stream << " " << m_dZ << "" << std::endl; if (m_msr_db_map.is_msr_id_set) - *dynaml_stream << " " << m_msr_db_map.msr_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.msr_id << "" << std::endl; - *dynaml_stream << " " << scientific << setprecision(13) << m_dSigmaXX << "" << endl; - *dynaml_stream << " " << m_dSigmaXY << "" << endl; - *dynaml_stream << " " << m_dSigmaXZ << "" << endl; - *dynaml_stream << " " << m_dSigmaYY << "" << endl; - *dynaml_stream << " " << m_dSigmaYZ << "" << endl; - *dynaml_stream << " " << m_dSigmaZZ << "" << endl; + *dynaml_stream << " " << std::scientific << std::setprecision(13) << m_dSigmaXX << "" << std::endl; + *dynaml_stream << " " << m_dSigmaXY << "" << std::endl; + *dynaml_stream << " " << m_dSigmaXZ << "" << std::endl; + *dynaml_stream << " " << m_dSigmaYY << "" << std::endl; + *dynaml_stream << " " << m_dSigmaYZ << "" << std::endl; + *dynaml_stream << " " << m_dSigmaZZ << "" << std::endl; // write GPSPoint covariances - vector::const_iterator _it_cov = m_vGpsCovariances.begin(); + std::vector::const_iterator _it_cov = m_vGpsCovariances.begin(); for (; _it_cov!=m_vGpsCovariances.end(); ++_it_cov) _it_cov->WriteDynaMLMsr(dynaml_stream); - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } void CDnaGpsBaseline::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const { - *dna_stream << setw(dmw.msr_type) << m_strType; + *dna_stream << std::setw(dmw.msr_type) << m_strType; if (m_bIgnore) - *dna_stream << setw(dmw.msr_ignore) << "*"; + *dna_stream << std::setw(dmw.msr_ignore) << "*"; else - *dna_stream << setw(dmw.msr_ignore) << " "; + *dna_stream << std::setw(dmw.msr_ignore) << " "; - *dna_stream << left << setw(dmw.msr_inst) << m_strFirst; - *dna_stream << left << setw(dmw.msr_targ1) << m_strTarget; + *dna_stream << std::left << std::setw(dmw.msr_inst) << m_strFirst; + *dna_stream << std::left << std::setw(dmw.msr_targ1) << m_strTarget; // Print header for G baseline and first X cluster baseline bool printHeader(true); @@ -267,69 +267,69 @@ void CDnaGpsBaseline::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_field // print database ids if (m_msr_db_map.is_msr_id_set) - *dna_stream << setw(dml.msr_id_msr - dml.msr_targ2) << " " << - right << setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; + *dna_stream << std::setw(dml.msr_id_msr - dml.msr_targ2) << " " << + std::right << std::setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; if (m_msr_db_map.is_cls_id_set) - *dna_stream << setw(dmw.msr_id_cluster) << m_msr_db_map.cluster_id; + *dna_stream << std::setw(dmw.msr_id_cluster) << m_msr_db_map.cluster_id; } } if (printHeader) { if (GetTypeC() == 'X') - *dna_stream << left << setw(dmw.msr_targ2) << m_lRecordedTotal; + *dna_stream << std::left << std::setw(dmw.msr_targ2) << m_lRecordedTotal; else - *dna_stream << right << setw(dmw.msr_targ2) << " "; + *dna_stream << std::right << std::setw(dmw.msr_targ2) << " "; // print scaling *dna_stream << - fixed << setprecision(2) << - right << setw(dmw.msr_gps_vscale) << double_string_width(m_dVscale, dmw.msr_gps_vscale) << - right << setw(dmw.msr_gps_pscale) << double_string_width(m_dPscale, dmw.msr_gps_vscale) << - right << setw(dmw.msr_gps_lscale) << double_string_width(m_dLscale, dmw.msr_gps_vscale) << - right << setw(dmw.msr_gps_hscale) << double_string_width(m_dHscale, dmw.msr_gps_vscale); + std::fixed << std::setprecision(2) << + std::right << std::setw(dmw.msr_gps_vscale) << double_string_width(m_dVscale, dmw.msr_gps_vscale) << + std::right << std::setw(dmw.msr_gps_pscale) << double_string_width(m_dPscale, dmw.msr_gps_vscale) << + std::right << std::setw(dmw.msr_gps_lscale) << double_string_width(m_dLscale, dmw.msr_gps_vscale) << + std::right << std::setw(dmw.msr_gps_hscale) << double_string_width(m_dHscale, dmw.msr_gps_vscale); // print reference frame and epoch *dna_stream << - right << setw(dmw.msr_gps_reframe) << m_referenceFrame << - right << setw(dmw.msr_gps_epoch) << m_epoch; + std::right << std::setw(dmw.msr_gps_reframe) << m_referenceFrame << + std::right << std::setw(dmw.msr_gps_epoch) << m_epoch; // print database ids if (m_msr_db_map.is_msr_id_set) - *dna_stream << setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; + *dna_stream << std::setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; if (m_msr_db_map.is_cls_id_set) - *dna_stream << setw(dmw.msr_id_cluster) << m_msr_db_map.cluster_id; + *dna_stream << std::setw(dmw.msr_id_cluster) << m_msr_db_map.cluster_id; } - *dna_stream << endl; + *dna_stream << std::endl; UINT32 pad(dmw.msr_type + dmw.msr_ignore + dmw.msr_inst + dmw.msr_targ1 + dmw.msr_targ2); // X - *dna_stream << setw(pad) << " "; - *dna_stream << right << setw(dmw.msr_gps) << fixed << setprecision(4) << m_dX; - *dna_stream << right << setw(dmw.msr_gps_vcv_1) << scientific << setprecision(13) << m_dSigmaXX; - *dna_stream << endl; + *dna_stream << std::setw(pad) << " "; + *dna_stream << std::right << std::setw(dmw.msr_gps) << std::fixed << std::setprecision(4) << m_dX; + *dna_stream << std::right << std::setw(dmw.msr_gps_vcv_1) << std::scientific << std::setprecision(13) << m_dSigmaXX; + *dna_stream << std::endl; // Y - *dna_stream << setw(pad) << " "; - *dna_stream << right << setw(dmw.msr_gps) << fixed << setprecision(4) << m_dY; + *dna_stream << std::setw(pad) << " "; + *dna_stream << std::right << std::setw(dmw.msr_gps) << std::fixed << std::setprecision(4) << m_dY; *dna_stream << - right << setw(dmw.msr_gps_vcv_1) << scientific << setprecision(13) << m_dSigmaXY << - right << setw(dmw.msr_gps_vcv_2) << m_dSigmaYY; - *dna_stream << endl; + std::right << std::setw(dmw.msr_gps_vcv_1) << std::scientific << std::setprecision(13) << m_dSigmaXY << + std::right << std::setw(dmw.msr_gps_vcv_2) << m_dSigmaYY; + *dna_stream << std::endl; // Z - *dna_stream << setw(pad) << " "; - *dna_stream << right << setw(dmw.msr_gps) << fixed << setprecision(4) << m_dZ; + *dna_stream << std::setw(pad) << " "; + *dna_stream << std::right << std::setw(dmw.msr_gps) << std::fixed << std::setprecision(4) << m_dZ; *dna_stream << - right << setw(dmw.msr_gps_vcv_1) << scientific << setprecision(13) << m_dSigmaXZ << - right << setw(dmw.msr_gps_vcv_2) << m_dSigmaYZ << - right << setw(dmw.msr_gps_vcv_3) << m_dSigmaZZ; - *dna_stream << endl; + std::right << std::setw(dmw.msr_gps_vcv_1) << std::scientific << std::setprecision(13) << m_dSigmaXZ << + std::right << std::setw(dmw.msr_gps_vcv_2) << m_dSigmaYZ << + std::right << std::setw(dmw.msr_gps_vcv_3) << m_dSigmaZZ; + *dna_stream << std::endl; // write GPSBaseline covariances (not supported by DNA format) - vector::const_iterator _it_cov = m_vGpsCovariances.begin(); + std::vector::const_iterator _it_cov = m_vGpsCovariances.begin(); for (_it_cov=m_vGpsCovariances.begin(); _it_cov!=m_vGpsCovariances.end(); ++_it_cov) _it_cov->WriteDNAMsr(dna_stream, dmw, dml); } @@ -348,7 +348,7 @@ void CDnaGpsBaseline::SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* el m_dSigmaYZ = -2.035E-05; m_dSigmaZZ = 6.803E-05; - vector::iterator _it_cov = m_vGpsCovariances.begin(); + std::vector::iterator _it_cov = m_vGpsCovariances.begin(); for (_it_cov=m_vGpsCovariances.begin(); _it_cov!=m_vGpsCovariances.end(); ++_it_cov) _it_cov->SimulateMsr(vStations, ellipsoid); } @@ -371,7 +371,7 @@ UINT32 CDnaGpsBaseline::SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it m_epoch = it_msr->epoch; m_epsgCode = it_msr->epsgCode; - m_referenceFrame = datumFromEpsgString(it_msr->epsgCode); + m_referenceFrame = datumFromEpsgString(it_msr->epsgCode); m_lclusterID = it_msr->clusterID; m_MSmeasurementStations = (MEASUREMENT_STATIONS)it_msr->measurementStations; @@ -405,7 +405,7 @@ UINT32 CDnaGpsBaseline::SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it dbidmap += (it_msr->vectorCount2 * 3); // now covariances - vector::iterator _it_cov = m_vGpsCovariances.begin(); + std::vector::iterator _it_cov = m_vGpsCovariances.begin(); for (; _it_cov!=m_vGpsCovariances.end(); ++_it_cov) _it_cov->SetMeasurementRec(binaryStn, it_msr); @@ -480,7 +480,7 @@ void CDnaGpsBaseline::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIn binary_stream->write(reinterpret_cast(&measRecord), sizeof(measurement_t)); // now write covariance elements - vector::const_iterator _it_cov; + std::vector::const_iterator _it_cov; for (_it_cov=m_vGpsCovariances.begin(); _it_cov!=m_vGpsCovariances.end(); ++_it_cov) _it_cov->WriteBinaryMsr(binary_stream, msrIndex, m_epsgCode, m_epoch); } @@ -504,96 +504,96 @@ void CDnaGpsBaseline::SerialiseDatabaseMap(std::ofstream* os) -void CDnaGpsBaseline::SetX(const string& str) +void CDnaGpsBaseline::SetX(const std::string& str) { DoubleFromString(m_dX, trimstr(str)); } -void CDnaGpsBaseline::SetY(const string& str) +void CDnaGpsBaseline::SetY(const std::string& str) { DoubleFromString(m_dY, trimstr(str)); } -void CDnaGpsBaseline::SetZ(const string& str) +void CDnaGpsBaseline::SetZ(const std::string& str) { DoubleFromString(m_dZ, trimstr(str)); } -void CDnaGpsBaseline::SetSigmaXX(const string& str) +void CDnaGpsBaseline::SetSigmaXX(const std::string& str) { if (DoubleFromString_ZeroCheck(m_dSigmaXX, trimstr(str))) { - stringstream ss; + std::stringstream ss; ss << "SetSigmaXX(): Variances cannot be zero: " << str << "."; throw XMLInteropException(ss.str(), 0); } } -void CDnaGpsBaseline::SetSigmaXY(const string& str) +void CDnaGpsBaseline::SetSigmaXY(const std::string& str) { DoubleFromString(m_dSigmaXY, trimstr(str)); } -void CDnaGpsBaseline::SetSigmaXZ(const string& str) +void CDnaGpsBaseline::SetSigmaXZ(const std::string& str) { DoubleFromString(m_dSigmaXZ, trimstr(str)); } -void CDnaGpsBaseline::SetSigmaYY(const string& str) +void CDnaGpsBaseline::SetSigmaYY(const std::string& str) { if (DoubleFromString_ZeroCheck(m_dSigmaYY, trimstr(str))) { - stringstream ss; + std::stringstream ss; ss << "SetSigmaYY(): Variances cannot be zero: " << str << "."; throw XMLInteropException(ss.str(), 0); } } -void CDnaGpsBaseline::SetSigmaYZ(const string& str) +void CDnaGpsBaseline::SetSigmaYZ(const std::string& str) { DoubleFromString(m_dSigmaYZ, trimstr(str)); } -void CDnaGpsBaseline::SetSigmaZZ(const string& str) +void CDnaGpsBaseline::SetSigmaZZ(const std::string& str) { if (DoubleFromString_ZeroCheck(m_dSigmaZZ, trimstr(str))) { - stringstream ss; + std::stringstream ss; ss << "SetSigmaZZ(): Variances cannot be zero: " << str << "."; throw XMLInteropException(ss.str(), 0); } } -void CDnaGpsBaseline::SetEpsg(const string& epsg) +void CDnaGpsBaseline::SetEpsg(const std::string& epsg) { m_epsgCode = epsg; } -void CDnaGpsBaseline::SetReferenceFrame(const string& refFrame) +void CDnaGpsBaseline::SetReferenceFrame(const std::string& refFrame) { m_referenceFrame = refFrame; - SetEpsg(epsgStringFromName(refFrame)); + SetEpsg(epsgStringFromName(refFrame)); } -void CDnaGpsBaseline::SetPscale(const string& str) +void CDnaGpsBaseline::SetPscale(const std::string& str) { DoubleFromString(m_dPscale, trimstr(str)); } -void CDnaGpsBaseline::SetLscale(const string& str) +void CDnaGpsBaseline::SetLscale(const std::string& str) { DoubleFromString(m_dLscale, trimstr(str)); } -void CDnaGpsBaseline::SetHscale(const string& str) +void CDnaGpsBaseline::SetHscale(const std::string& str) { DoubleFromString(m_dHscale, trimstr(str)); } -void CDnaGpsBaseline::SetVscale(const string& str) +void CDnaGpsBaseline::SetVscale(const std::string& str) { DoubleFromString(m_dVscale, trimstr(str)); } @@ -617,7 +617,7 @@ CDnaGpsBaselineCluster::CDnaGpsBaselineCluster(void) , m_lclusterID(0) { SetEpoch(DEFAULT_EPOCH); - SetEpsg(epsgStringFromName(m_referenceFrame)); + SetEpsg(epsgStringFromName(m_referenceFrame)); m_vGpsBaselines.clear(); m_vGpsBaselines.reserve(1); @@ -690,7 +690,7 @@ CDnaGpsBaselineCluster& CDnaGpsBaselineCluster::operator= (CDnaGpsBaselineCluste } -CDnaGpsBaselineCluster::CDnaGpsBaselineCluster(const UINT32 lclusterID, const string& referenceframe, const string& epoch) +CDnaGpsBaselineCluster::CDnaGpsBaselineCluster(const UINT32 lclusterID, const std::string& referenceframe, const std::string& epoch) : m_strTarget("") , m_lRecordedTotal(1) , m_dPscale(1.) @@ -701,7 +701,7 @@ CDnaGpsBaselineCluster::CDnaGpsBaselineCluster(const UINT32 lclusterID, const st , m_lclusterID(lclusterID) { SetEpoch(epoch); - SetEpsg(epsgStringFromName(referenceframe)); + SetEpsg(epsgStringFromName(referenceframe)); m_vGpsBaselines.clear(); m_vGpsBaselines.reserve(1); @@ -723,7 +723,7 @@ bool CDnaGpsBaselineCluster::operator== (const CDnaGpsBaselineCluster& rhs) cons m_dHscale == rhs.m_dHscale && m_dVscale == rhs.m_dVscale && m_vGpsBaselines == rhs.m_vGpsBaselines && - iequals(m_referenceFrame, rhs.m_referenceFrame) && + boost::iequals(m_referenceFrame, rhs.m_referenceFrame) && m_epoch == rhs.m_epoch ); } @@ -805,58 +805,58 @@ UINT32 CDnaGpsBaselineCluster::CalcBinaryRecordCount() const } -void CDnaGpsBaselineCluster::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const +void CDnaGpsBaselineCluster::WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const { const size_t bslCount = m_vGpsBaselines.size(); char cType = GetTypeC(); if (comment.empty()) { - *dynaml_stream << " " << endl; + *dynaml_stream << " -->" << std::endl; } else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; - *dynaml_stream << " " << endl; - *dynaml_stream << " " << cType << "" << endl; + *dynaml_stream << " " << std::endl; + *dynaml_stream << " " << cType << "" << std::endl; // Source file from which the measurement came - *dynaml_stream << " " << m_sourceFile << "" << endl; + *dynaml_stream << " " << m_sourceFile << "" << std::endl; if (m_bIgnore) - *dynaml_stream << " *" << endl; + *dynaml_stream << " *" << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; // Reference frame and epoch - *dynaml_stream << " " << m_referenceFrame << "" << endl; - *dynaml_stream << " " << m_epoch << "" << endl; + *dynaml_stream << " " << m_referenceFrame << "" << std::endl; + *dynaml_stream << " " << m_epoch << "" << std::endl; // Scalars - *dynaml_stream << " " << fixed << setprecision(3) << m_dVscale << "" << endl; - *dynaml_stream << " " << m_dPscale << "" << endl; - *dynaml_stream << " " << m_dLscale << "" << endl; - *dynaml_stream << " " << m_dHscale << "" << endl; + *dynaml_stream << " " << std::fixed << std::setprecision(3) << m_dVscale << "" << std::endl; + *dynaml_stream << " " << m_dPscale << "" << std::endl; + *dynaml_stream << " " << m_dLscale << "" << std::endl; + *dynaml_stream << " " << m_dHscale << "" << std::endl; if (m_msr_db_map.is_cls_id_set) - *dynaml_stream << " " << m_msr_db_map.cluster_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.cluster_id << "" << std::endl; // baseline count if (cType == 'X') - *dynaml_stream << " " << bslCount << "" << endl; + *dynaml_stream << " " << bslCount << "" << std::endl; // write GpsBaselines - vector::const_iterator _it_bsl; + std::vector::const_iterator _it_bsl; for (_it_bsl=m_vGpsBaselines.begin(); _it_bsl!=m_vGpsBaselines.end(); ++_it_bsl) _it_bsl->WriteDynaMLMsr(dynaml_stream, comment, true); - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } @@ -864,7 +864,7 @@ void CDnaGpsBaselineCluster::WriteDynaMLMsr(std::ofstream* dynaml_stream, const void CDnaGpsBaselineCluster::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const { // write GpsBaselines - vector::const_iterator _it_bsl; + std::vector::const_iterator _it_bsl; for (_it_bsl=m_vGpsBaselines.begin(); _it_bsl!=m_vGpsBaselines.end(); ++_it_bsl) _it_bsl->WriteDNAMsr(dna_stream, dmw, dml, true); } @@ -872,7 +872,7 @@ void CDnaGpsBaselineCluster::WriteDNAMsr(std::ofstream* dna_stream, const dna_ms void CDnaGpsBaselineCluster::SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid) { - vector::iterator _it_bsl; + std::vector::iterator _it_bsl; for (_it_bsl=m_vGpsBaselines.begin(); _it_bsl!=m_vGpsBaselines.end(); ++_it_bsl) _it_bsl->SimulateMsr(vStations, ellipsoid); } @@ -886,7 +886,7 @@ UINT32 CDnaGpsBaselineCluster::SetMeasurementRec(const vstn_t& binaryStn, it_vms m_vGpsBaselines.clear(); m_vGpsBaselines.resize(m_lRecordedTotal); - m_referenceFrame = datumFromEpsgString(it_msr->epsgCode); + m_referenceFrame = datumFromEpsgString(it_msr->epsgCode); m_epoch = it_msr->epoch; m_epsgCode = it_msr->epsgCode; @@ -918,49 +918,49 @@ UINT32 CDnaGpsBaselineCluster::SetMeasurementRec(const vstn_t& binaryStn, it_vms void CDnaGpsBaselineCluster::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const { - vector::const_iterator _it_bsl; + std::vector::const_iterator _it_bsl; for (_it_bsl=m_vGpsBaselines.begin(); _it_bsl!=m_vGpsBaselines.end(); ++_it_bsl) _it_bsl->WriteBinaryMsr(binary_stream, msrIndex); } -void CDnaGpsBaselineCluster::SetEpsg(const string& epsg) +void CDnaGpsBaselineCluster::SetEpsg(const std::string& epsg) { // m_epsgCode is a member of CDnaMeasurement m_epsgCode = epsg; } -void CDnaGpsBaselineCluster::SetReferenceFrame(const string& refFrame) +void CDnaGpsBaselineCluster::SetReferenceFrame(const std::string& refFrame) { // m_referenceFrame is a member of CDnaGpsBaselineCluster m_referenceFrame = refFrame; - SetEpsg(epsgStringFromName(refFrame)); + SetEpsg(epsgStringFromName(refFrame)); } -void CDnaGpsBaselineCluster::SetTotal(const string& str) +void CDnaGpsBaselineCluster::SetTotal(const std::string& str) { m_lRecordedTotal = LongFromString(trimstr(str)); m_vGpsBaselines.reserve(m_lRecordedTotal); } -void CDnaGpsBaselineCluster::SetPscale(const string& str) +void CDnaGpsBaselineCluster::SetPscale(const std::string& str) { DoubleFromString(m_dPscale, trimstr(str)); } -void CDnaGpsBaselineCluster::SetLscale(const string& str) +void CDnaGpsBaselineCluster::SetLscale(const std::string& str) { DoubleFromString(m_dLscale, trimstr(str)); } -void CDnaGpsBaselineCluster::SetHscale(const string& str) +void CDnaGpsBaselineCluster::SetHscale(const std::string& str) { DoubleFromString(m_dHscale, trimstr(str)); } -void CDnaGpsBaselineCluster::SetVscale(const string& str) +void CDnaGpsBaselineCluster::SetVscale(const std::string& str) { DoubleFromString(m_dVscale, trimstr(str)); } diff --git a/dynadjust/include/measurement_types/dnagpsbaseline.hpp b/dynadjust/include/measurement_types/dnagpsbaseline.hpp index df69cb66..7403314f 100644 --- a/dynadjust/include/measurement_types/dnagpsbaseline.hpp +++ b/dynadjust/include/measurement_types/dnagpsbaseline.hpp @@ -32,8 +32,6 @@ #include -using namespace std; - namespace dynadjust { namespace measurements { @@ -53,7 +51,7 @@ class CDnaGpsBaseline : public CDnaMeasurement //CDnaGpsBaseline& operator=(const CDnaGpsBaseline& rhs); public: - //CDnaGpsBaseline(const bool bIgnore, const string& strType, const string& strFirstStation, const string& strSecondStation); + //CDnaGpsBaseline(const bool bIgnore, const std::string& strType, const std::string& strFirstStation, const std::string& strSecondStation); //virtual inline CDnaGpsBaseline* clone() const { return new CDnaGpsBaseline(*this); } bool operator==(const CDnaGpsBaseline& rhs) const; @@ -62,8 +60,8 @@ class CDnaGpsBaseline : public CDnaMeasurement //inline CDnaGpsBaseline& operator[](int iIndex) { return this[iIndex]; } inline UINT32 GetClusterID() const { return m_lclusterID; } - inline string GetTarget() const { return m_strTarget; } - inline vector* GetCovariances_ptr() { return &m_vGpsCovariances; } + inline std::string GetTarget() const { return m_strTarget; } + inline std::vector* GetCovariances_ptr() { return &m_vGpsCovariances; } void AddGpsCovariance(const CDnaCovariance* pGpsCovariance); @@ -71,27 +69,27 @@ class CDnaGpsBaseline : public CDnaMeasurement void ResizeGpsCovariancesCount(const UINT32& size = 0); inline void SetClusterID(const UINT32& id) { m_lclusterID = id; } - inline void SetTarget(const string& str) { m_strTarget = trimstr(str); } - void SetX(const string& str); - void SetY(const string& str); - void SetZ(const string& str); - void SetSigmaXX(const string& str); - void SetSigmaXY(const string& str); - void SetSigmaXZ(const string& str); - void SetSigmaYY(const string& str); - void SetSigmaYZ(const string& str); - void SetSigmaZZ(const string& str); + inline void SetTarget(const std::string& str) { m_strTarget = trimstr(str); } + void SetX(const std::string& str); + void SetY(const std::string& str); + void SetZ(const std::string& str); + void SetSigmaXX(const std::string& str); + void SetSigmaXY(const std::string& str); + void SetSigmaXZ(const std::string& str); + void SetSigmaYY(const std::string& str); + void SetSigmaYZ(const std::string& str); + void SetSigmaZZ(const std::string& str); - void SetReferenceFrame(const string& refFrame); - //void SetEpoch(const string& epoch); //moved to CDnaMeasurement - void SetEpsg(const string& epsg); - inline string GetReferenceFrame() const { return m_referenceFrame; } - //inline string GetEpoch() const { return m_epoch; } // moved to CDnaMeasurement + void SetReferenceFrame(const std::string& refFrame); + //void SetEpoch(const std::string& epoch); //moved to CDnaMeasurement + void SetEpsg(const std::string& epsg); + inline std::string GetReferenceFrame() const { return m_referenceFrame; } + //inline std::string GetEpoch() const { return m_epoch; } // moved to CDnaMeasurement - void SetPscale(const string& str); - void SetLscale(const string& str); - void SetHscale(const string& str); - void SetVscale(const string& str); + void SetPscale(const std::string& str); + void SetLscale(const std::string& str); + void SetHscale(const std::string& str); + void SetVscale(const std::string& str); inline void SetPscale(const double& dbl) { m_dPscale = dbl; } inline void SetLscale(const double& dbl) { m_dLscale = dbl; } @@ -102,16 +100,16 @@ class CDnaGpsBaseline : public CDnaMeasurement inline void SetTotal(const UINT32& l) { m_lRecordedTotal = l; } virtual UINT32 CalcBinaryRecordCount() const; - //void coutBaselineData(ostream &os, const int& pad, const UINT16& uType = 0) const; + //void coutBaselineData(std::ostream &os, const int& pad, const UINT16& uType = 0) const; virtual void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const; virtual UINT32 SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_msr, it_vdbid_t& dbidmap); - virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const; + virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const; virtual void WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const; virtual void SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid); virtual void SerialiseDatabaseMap(std::ofstream* os); - string m_strTarget; + std::string m_strTarget; inline double GetVscale() const { return m_dVscale; } inline double GetPscale() const { return m_dPscale; } @@ -139,12 +137,12 @@ class CDnaGpsBaseline : public CDnaMeasurement double m_dHscale; double m_dVscale; - string m_referenceFrame; + std::string m_referenceFrame; //string m_epoch; UINT32 m_lclusterID; - vector m_vGpsCovariances; + std::vector m_vGpsCovariances; }; // used for Type G or X @@ -164,8 +162,8 @@ class CDnaGpsBaselineCluster : public CDnaMeasurement CDnaGpsBaselineCluster& operator=(const CDnaGpsBaselineCluster& rhs); public: - //CDnaGpsBaselineCluster(const bool bIgnore, const string& strType, const string& strFirstStation); - CDnaGpsBaselineCluster(const UINT32 lclusterID, const string& referenceframe, const string& epoch); + //CDnaGpsBaselineCluster(const bool bIgnore, const std::string& strType, const std::string& strFirstStation); + CDnaGpsBaselineCluster(const UINT32 lclusterID, const std::string& referenceframe, const std::string& epoch); //virtual inline CDnaGpsBaselineCluster* clone() const { return new CDnaGpsBaselineCluster(*this); } bool operator==(const CDnaGpsBaselineCluster& rhs) const; @@ -174,31 +172,31 @@ class CDnaGpsBaselineCluster : public CDnaMeasurement //inline CDnaGpsBaselineCluster& operator[](int iIndex) { return this[iIndex]; } //inline UINT32 GetNumBaselinens() { return m_vGpsBaselines.size(); } - inline vector& GetBaselines() { return m_vGpsBaselines; } - inline vector* GetBaselines_ptr() { return &m_vGpsBaselines; } + inline std::vector& GetBaselines() { return m_vGpsBaselines; } + inline std::vector* GetBaselines_ptr() { return &m_vGpsBaselines; } inline UINT32 GetClusterID() const { return m_lclusterID; } - inline string GetTarget() const { return m_strTarget; } + inline std::string GetTarget() const { return m_strTarget; } inline UINT32 GetTotal() const { return m_lRecordedTotal; } inline double GetPscale() const { return m_dPscale; } inline double GetLscale() const { return m_dLscale; } inline double GetHscale() const { return m_dHscale; } inline double GetVscale() const { return m_dVscale; } - void SetReferenceFrame(const string& refFrame); - //void SetEpoch(const string& epoch); - void SetEpsg(const string& epsg); - inline string GetReferenceFrame() const { return m_referenceFrame; } - //inline string GetEpoch() const { return m_epoch; } + void SetReferenceFrame(const std::string& refFrame); + //void SetEpoch(const std::string& epoch); + void SetEpsg(const std::string& epsg); + inline std::string GetReferenceFrame() const { return m_referenceFrame; } + //inline std::string GetEpoch() const { return m_epoch; } - inline void SetTarget(const string& str) { m_strTarget = trimstr(str); } + inline void SetTarget(const std::string& str) { m_strTarget = trimstr(str); } inline void SetTotal(const UINT32& l) { m_lRecordedTotal = l; } - void SetTotal(const string& str); - void SetPscale(const string& str); - void SetLscale(const string& str); - void SetHscale(const string& str); - void SetVscale(const string& str); + void SetTotal(const std::string& str); + void SetPscale(const std::string& str); + void SetLscale(const std::string& str); + void SetHscale(const std::string& str); + void SetVscale(const std::string& str); inline void SetPscale(const double& dbl) { m_dPscale = dbl; } inline void SetLscale(const double& dbl) { m_dLscale = dbl; } @@ -214,7 +212,7 @@ class CDnaGpsBaselineCluster : public CDnaMeasurement virtual UINT32 CalcBinaryRecordCount() const; virtual void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const; virtual UINT32 SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_msr, it_vdbid_t& dbidmap); - virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const; + virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const; virtual void WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const; virtual void SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid); @@ -224,17 +222,17 @@ class CDnaGpsBaselineCluster : public CDnaMeasurement protected: - string m_strTarget; + std::string m_strTarget; UINT32 m_lRecordedTotal; double m_dPscale; double m_dLscale; double m_dHscale; double m_dVscale; - vector m_vGpsBaselines; + std::vector m_vGpsBaselines; - string m_referenceFrame; - //string m_epoch; + std::string m_referenceFrame; + //std::string m_epoch; UINT32 m_lclusterID; diff --git a/dynadjust/include/measurement_types/dnagpspoint.cpp b/dynadjust/include/measurement_types/dnagpspoint.cpp index 4f0bdef2..81a05c86 100644 --- a/dynadjust/include/measurement_types/dnagpspoint.cpp +++ b/dynadjust/include/measurement_types/dnagpspoint.cpp @@ -53,7 +53,7 @@ CDnaGpsPoint::CDnaGpsPoint(void) { SetEpoch(DEFAULT_EPOCH); - SetEpsg(epsgStringFromName(m_referenceFrame)); + SetEpsg(epsgStringFromName(m_referenceFrame)); m_vPointCovariances.clear(); m_vPointCovariances.reserve(0); @@ -155,7 +155,7 @@ bool CDnaGpsPoint::operator== (const CDnaGpsPoint& rhs) const fabs(m_dX - rhs.m_dX) < PRECISION_1E4 && fabs(m_dY - rhs.m_dY) < PRECISION_1E4 && fabs(m_dZ - rhs.m_dZ) < PRECISION_1E4 && - iequals(m_referenceFrame, rhs.m_referenceFrame) + boost::iequals(m_referenceFrame, rhs.m_referenceFrame) ); } @@ -198,7 +198,7 @@ void CDnaGpsPoint::ResizeGpsCovariancesCount(const UINT32& size) } -void CDnaGpsPoint::SetCoordType(const string& sType) { +void CDnaGpsPoint::SetCoordType(const std::string& sType) { m_strCoordType = trimstr(sType); m_ctType = GetMyCoordTypeC(); } @@ -219,145 +219,145 @@ void CDnaGpsPoint::AddPointCovariance(const CDnaCovariance* pGpsCovariance) UINT32 CDnaGpsPoint::CalcBinaryRecordCount() const { UINT32 RecordCount = 3; - vector::const_iterator _it_cov = m_vPointCovariances.begin(); + std::vector::const_iterator _it_cov = m_vPointCovariances.begin(); for (; _it_cov!=m_vPointCovariances.end(); ++_it_cov) RecordCount += _it_cov->CalcBinaryRecordCount(); return RecordCount; } -void CDnaGpsPoint::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string&, bool) const +void CDnaGpsPoint::WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string&, bool) const { UINT32 precision(4); - *dynaml_stream << " " << m_strFirst << "" << endl; - *dynaml_stream << " " << endl; + *dynaml_stream << " " << m_strFirst << "" << std::endl; + *dynaml_stream << " " << std::endl; if (m_ctType == LLH_type_i || m_ctType == LLh_type_i) { precision = 10; - *dynaml_stream << " " << fixed << setprecision(precision) << RadtoDms(m_dX) << "" << endl; - *dynaml_stream << " " << RadtoDmsL(m_dY) << "" << endl; + *dynaml_stream << " " << std::fixed << std::setprecision(precision) << RadtoDms(m_dX) << "" << std::endl; + *dynaml_stream << " " << RadtoDmsL(m_dY) << "" << std::endl; } else { - *dynaml_stream << " " << fixed << setprecision(precision) << m_dX << "" << endl; - *dynaml_stream << " " << m_dY << "" << endl; + *dynaml_stream << " " << std::fixed << std::setprecision(precision) << m_dX << "" << std::endl; + *dynaml_stream << " " << m_dY << "" << std::endl; } - *dynaml_stream << " " << setprecision(4) << m_dZ << "" << endl; + *dynaml_stream << " " << std::setprecision(4) << m_dZ << "" << std::endl; if (m_msr_db_map.is_msr_id_set) - *dynaml_stream << " " << m_msr_db_map.msr_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.msr_id << "" << std::endl; - *dynaml_stream << " " << scientific << setprecision(13) << m_dSigmaXX << "" << endl; - *dynaml_stream << " " << m_dSigmaXY << "" << endl; - *dynaml_stream << " " << m_dSigmaXZ << "" << endl; - *dynaml_stream << " " << m_dSigmaYY << "" << endl; - *dynaml_stream << " " << m_dSigmaYZ << "" << endl; - *dynaml_stream << " " << m_dSigmaZZ << "" << endl; + *dynaml_stream << " " << std::scientific << std::setprecision(13) << m_dSigmaXX << "" << std::endl; + *dynaml_stream << " " << m_dSigmaXY << "" << std::endl; + *dynaml_stream << " " << m_dSigmaXZ << "" << std::endl; + *dynaml_stream << " " << m_dSigmaYY << "" << std::endl; + *dynaml_stream << " " << m_dSigmaYZ << "" << std::endl; + *dynaml_stream << " " << m_dSigmaZZ << "" << std::endl; // write GPSPoint covariances - vector::const_iterator _it_cov = m_vPointCovariances.begin(); + std::vector::const_iterator _it_cov = m_vPointCovariances.begin(); for (; _it_cov!=m_vPointCovariances.end(); ++_it_cov) _it_cov->WriteDynaMLMsr(dynaml_stream); - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } void CDnaGpsPoint::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const { - *dna_stream << setw(dmw.msr_type) << m_strType; + *dna_stream << std::setw(dmw.msr_type) << m_strType; if (m_bIgnore) - *dna_stream << setw(dmw.msr_ignore) << "*"; + *dna_stream << std::setw(dmw.msr_ignore) << "*"; else - *dna_stream << setw(dmw.msr_ignore) << " "; + *dna_stream << std::setw(dmw.msr_ignore) << " "; - *dna_stream << left << setw(dmw.msr_inst) << m_strFirst; + *dna_stream << std::left << std::setw(dmw.msr_inst) << m_strFirst; // Print header for first cluster point if (m_lRecordedTotal == m_vPointCovariances.size() + 1) { if (m_ctType == LLH_type_i) - *dna_stream << left << setw(dmw.msr_targ1) << LLH_type; + *dna_stream << std::left << std::setw(dmw.msr_targ1) << LLH_type; else if (m_ctType == LLh_type_i) - *dna_stream << left << setw(dmw.msr_targ1) << LLh_type; + *dna_stream << std::left << std::setw(dmw.msr_targ1) << LLh_type; else - *dna_stream << left << setw(dmw.msr_targ1) << XYZ_type; + *dna_stream << std::left << std::setw(dmw.msr_targ1) << XYZ_type; - *dna_stream << left << setw(dmw.msr_targ2) << m_lRecordedTotal; + *dna_stream << std::left << std::setw(dmw.msr_targ2) << m_lRecordedTotal; // print scaling *dna_stream << - fixed << setprecision(2) << - right << setw(dmw.msr_gps_vscale) << double_string_width(m_dVscale, dmw.msr_gps_vscale) << - right << setw(dmw.msr_gps_pscale) << double_string_width(m_dPscale, dmw.msr_gps_vscale) << - right << setw(dmw.msr_gps_lscale) << double_string_width(m_dLscale, dmw.msr_gps_vscale) << - right << setw(dmw.msr_gps_hscale) << double_string_width(m_dHscale, dmw.msr_gps_vscale); + std::fixed << std::setprecision(2) << + std::right << std::setw(dmw.msr_gps_vscale) << double_string_width(m_dVscale, dmw.msr_gps_vscale) << + std::right << std::setw(dmw.msr_gps_pscale) << double_string_width(m_dPscale, dmw.msr_gps_vscale) << + std::right << std::setw(dmw.msr_gps_lscale) << double_string_width(m_dLscale, dmw.msr_gps_vscale) << + std::right << std::setw(dmw.msr_gps_hscale) << double_string_width(m_dHscale, dmw.msr_gps_vscale); // print reference frame and epoch *dna_stream << - right << setw(dmw.msr_gps_reframe) << m_referenceFrame << - right << setw(dmw.msr_gps_epoch) << m_epoch; + std::right << std::setw(dmw.msr_gps_reframe) << m_referenceFrame << + std::right << std::setw(dmw.msr_gps_epoch) << m_epoch; // print database ids if (m_msr_db_map.is_msr_id_set) - *dna_stream << setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; + *dna_stream << std::setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; if (m_msr_db_map.is_cls_id_set) - *dna_stream << setw(dmw.msr_id_cluster) << m_msr_db_map.cluster_id; + *dna_stream << std::setw(dmw.msr_id_cluster) << m_msr_db_map.cluster_id; } else { // print database ids if (m_msr_db_map.is_msr_id_set) - *dna_stream << setw(dml.msr_id_msr - dml.msr_targ1) << " " << - right << setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; + *dna_stream << std::setw(dml.msr_id_msr - dml.msr_targ1) << " " << + std::right << std::setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; if (m_msr_db_map.is_cls_id_set) - *dna_stream << setw(dmw.msr_id_cluster) << m_msr_db_map.cluster_id; + *dna_stream << std::setw(dmw.msr_id_cluster) << m_msr_db_map.cluster_id; } - *dna_stream << endl; + *dna_stream << std::endl; UINT32 precision = 4; UINT32 pad(dmw.msr_type + dmw.msr_ignore + dmw.msr_inst + dmw.msr_targ1 + dmw.msr_targ2); // X - *dna_stream << setw(pad) << " "; + *dna_stream << std::setw(pad) << " "; if (m_ctType == LLH_type_i || m_ctType == LLh_type_i) { precision = 13; - *dna_stream << right << setw(dmw.msr_gps) << fixed << setprecision(precision) << RadtoDms(m_dX); + *dna_stream << std::right << std::setw(dmw.msr_gps) << std::fixed << std::setprecision(precision) << RadtoDms(m_dX); } else - *dna_stream << right << setw(dmw.msr_gps) << fixed << setprecision(precision) << m_dX; + *dna_stream << std::right << std::setw(dmw.msr_gps) << std::fixed << std::setprecision(precision) << m_dX; - *dna_stream << right << setw(dmw.msr_gps_vcv_1) << scientific << setprecision(13) << m_dSigmaXX; - *dna_stream << endl; + *dna_stream << std::right << std::setw(dmw.msr_gps_vcv_1) << std::scientific << std::setprecision(13) << m_dSigmaXX; + *dna_stream << std::endl; // Y - *dna_stream << setw(pad) << " "; + *dna_stream << std::setw(pad) << " "; if (m_ctType == LLH_type_i || m_ctType == LLh_type_i) - *dna_stream << right << setw(dmw.msr_gps) << fixed << setprecision(precision) << RadtoDmsL(m_dY); + *dna_stream << std::right << std::setw(dmw.msr_gps) << std::fixed << std::setprecision(precision) << RadtoDmsL(m_dY); else - *dna_stream << right << setw(dmw.msr_gps) << fixed << setprecision(precision) << m_dY; + *dna_stream << std::right << std::setw(dmw.msr_gps) << std::fixed << std::setprecision(precision) << m_dY; *dna_stream << - right << setw(dmw.msr_gps_vcv_1) << scientific << setprecision(13) << m_dSigmaXY << - right << setw(dmw.msr_gps_vcv_2) << m_dSigmaYY; - *dna_stream << endl; + std::right << std::setw(dmw.msr_gps_vcv_1) << std::scientific << std::setprecision(13) << m_dSigmaXY << + std::right << std::setw(dmw.msr_gps_vcv_2) << m_dSigmaYY; + *dna_stream << std::endl; // Z precision = 4; // whether XYZ or LLH, precision only needs to be at 4 - *dna_stream << setw(pad) << " "; - *dna_stream << right << setw(dmw.msr_gps) << fixed << setprecision(precision) << m_dZ; + *dna_stream << std::setw(pad) << " "; + *dna_stream << std::right << std::setw(dmw.msr_gps) << std::fixed << std::setprecision(precision) << m_dZ; *dna_stream << - right << setw(dmw.msr_gps_vcv_1) << scientific << setprecision(13) << m_dSigmaXZ << - right << setw(dmw.msr_gps_vcv_2) << m_dSigmaYZ << - right << setw(dmw.msr_gps_vcv_3) << m_dSigmaZZ; - *dna_stream << endl; + std::right << std::setw(dmw.msr_gps_vcv_1) << std::scientific << std::setprecision(13) << m_dSigmaXZ << + std::right << std::setw(dmw.msr_gps_vcv_2) << m_dSigmaYZ << + std::right << std::setw(dmw.msr_gps_vcv_3) << m_dSigmaZZ; + *dna_stream << std::endl; // write GPSPoint covariances (not supported by DNA format) - vector::const_iterator _it_cov = m_vPointCovariances.begin(); + std::vector::const_iterator _it_cov = m_vPointCovariances.begin(); for (_it_cov=m_vPointCovariances.begin(); _it_cov!=m_vPointCovariances.end(); ++_it_cov) _it_cov->WriteDNAMsr(dna_stream, dmw, dml); } @@ -395,7 +395,7 @@ void CDnaGpsPoint::SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellip m_dSigmaZZ = 6.803E-04; } - vector::iterator _it_cov = m_vPointCovariances.begin(); + std::vector::iterator _it_cov = m_vPointCovariances.begin(); for (_it_cov=m_vPointCovariances.begin(); _it_cov!=m_vPointCovariances.end(); ++_it_cov) _it_cov->SimulateMsr(vStations, ellipsoid); } @@ -439,7 +439,7 @@ void CDnaGpsPoint::PopulateMsr(pvstn_t bstRecords, uint32_uint32_map* blockStati m_vPointCovariances.clear(); m_vPointCovariances.resize(covariance_count); - vector::iterator _it_cov = m_vPointCovariances.begin(); + std::vector::iterator _it_cov = m_vPointCovariances.begin(); matrix_2d variances_cart(3, 3); UINT32 ic, jc; @@ -478,7 +478,7 @@ UINT32 CDnaGpsPoint::SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_ms m_epoch = it_msr->epoch; m_epsgCode = it_msr->epsgCode; - m_referenceFrame = datumFromEpsgCode(LongFromString(it_msr->epsgCode)); + m_referenceFrame = datumFromEpsgCode(LongFromString(it_msr->epsgCode)); m_lclusterID = it_msr->clusterID; m_MSmeasurementStations = (MEASUREMENT_STATIONS)it_msr->measurementStations; @@ -514,7 +514,7 @@ UINT32 CDnaGpsPoint::SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_ms dbidmap += (it_msr->vectorCount2 * 3); // now covariances - vector::iterator _it_cov = m_vPointCovariances.begin(); + std::vector::iterator _it_cov = m_vPointCovariances.begin(); for (; _it_cov!=m_vPointCovariances.end(); ++_it_cov) _it_cov->SetMeasurementRec(binaryStn, it_msr); @@ -591,7 +591,7 @@ void CDnaGpsPoint::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex binary_stream->write(reinterpret_cast(&measRecord), sizeof(measurement_t)); // now write covariance elements - vector::const_iterator _it_cov; + std::vector::const_iterator _it_cov; for (_it_cov=m_vPointCovariances.begin(); _it_cov!=m_vPointCovariances.end(); ++_it_cov) _it_cov->WriteBinaryMsr(binary_stream, msrIndex, m_epsgCode, m_epoch); } @@ -615,20 +615,20 @@ void CDnaGpsPoint::SerialiseDatabaseMap(std::ofstream* os) } -void CDnaGpsPoint::SetEpsg(const string& epsg) +void CDnaGpsPoint::SetEpsg(const std::string& epsg) { m_epsgCode = epsg; } -void CDnaGpsPoint::SetReferenceFrame(const string& refFrame) +void CDnaGpsPoint::SetReferenceFrame(const std::string& refFrame) { m_referenceFrame = refFrame; - SetEpsg(epsgStringFromName(refFrame)); + SetEpsg(epsgStringFromName(refFrame)); } -void CDnaGpsPoint::SetX(const string& str) +void CDnaGpsPoint::SetX(const std::string& str) { if (m_ctType == LLH_type_i || m_ctType == LLh_type_i) { @@ -640,7 +640,7 @@ void CDnaGpsPoint::SetX(const string& str) DoubleFromString(m_dX, trimstr(str)); } -void CDnaGpsPoint::SetY(const string& str) +void CDnaGpsPoint::SetY(const std::string& str) { if (m_ctType == LLH_type_i || m_ctType == LLh_type_i) { @@ -652,14 +652,14 @@ void CDnaGpsPoint::SetY(const string& str) DoubleFromString(m_dY, trimstr(str)); } -void CDnaGpsPoint::SetZ(const string& str) +void CDnaGpsPoint::SetZ(const std::string& str) { // if (m_ctType == LLH_type_i) // then height should be ellipsoid height (but input files show height to be orthometric!) DoubleFromString(m_dZ, trimstr(str)); } -void CDnaGpsPoint::SetSigmaXX(const string& str) +void CDnaGpsPoint::SetSigmaXX(const std::string& str) { // if LLH, then SigmaXX is in radians^2 // if XYZ, then SigmaXX is in metres^2 @@ -667,17 +667,17 @@ void CDnaGpsPoint::SetSigmaXX(const string& str) throw XMLInteropException("SetSigmaXX(): Variances cannot be zero.", 0); } -void CDnaGpsPoint::SetSigmaXY(const string& str) +void CDnaGpsPoint::SetSigmaXY(const std::string& str) { DoubleFromString(m_dSigmaXY, trimstr(str)); } -void CDnaGpsPoint::SetSigmaXZ(const string& str) +void CDnaGpsPoint::SetSigmaXZ(const std::string& str) { DoubleFromString(m_dSigmaXZ, trimstr(str)); } -void CDnaGpsPoint::SetSigmaYY(const string& str) +void CDnaGpsPoint::SetSigmaYY(const std::string& str) { // if LLH, then SigmaYY is in radians^2 // if XYZ, then SigmaYY is in metres^2 @@ -685,12 +685,12 @@ void CDnaGpsPoint::SetSigmaYY(const string& str) throw XMLInteropException("SetSigmaYY(): Variances cannot be zero.", 0); } -void CDnaGpsPoint::SetSigmaYZ(const string& str) +void CDnaGpsPoint::SetSigmaYZ(const std::string& str) { DoubleFromString(m_dSigmaYZ, trimstr(str)); } -void CDnaGpsPoint::SetSigmaZZ(const string& str) +void CDnaGpsPoint::SetSigmaZZ(const std::string& str) { // if LLH, then SigmaZZ is in radians^2 // if XYZ, then SigmaZZ is in metres^2 @@ -722,7 +722,7 @@ CDnaGpsPointCluster::CDnaGpsPointCluster(void) , m_lclusterID(0) { SetEpoch(DEFAULT_EPOCH); - SetEpsg(epsgStringFromName(m_referenceFrame)); + SetEpsg(epsgStringFromName(m_referenceFrame)); m_strType = "Y"; m_MSmeasurementStations = ONE_STATION; @@ -793,7 +793,7 @@ CDnaGpsPointCluster& CDnaGpsPointCluster::operator= (CDnaGpsPointCluster&& rhs) } -CDnaGpsPointCluster::CDnaGpsPointCluster(const UINT32 lclusterID, const string& referenceframe, const string& epoch) +CDnaGpsPointCluster::CDnaGpsPointCluster(const UINT32 lclusterID, const std::string& referenceframe, const std::string& epoch) : m_lRecordedTotal(0) , m_dPscale(1.) , m_dLscale(1.) @@ -805,7 +805,7 @@ CDnaGpsPointCluster::CDnaGpsPointCluster(const UINT32 lclusterID, const string& , m_lclusterID(lclusterID) { SetEpoch(epoch); - SetEpsg(epsgStringFromName(referenceframe)); + SetEpsg(epsgStringFromName(referenceframe)); m_strType = "Y"; m_MSmeasurementStations = ONE_STATION; @@ -851,7 +851,7 @@ bool CDnaGpsPointCluster::operator< (const CDnaGpsPointCluster& rhs) const return m_strFirst < rhs.m_strFirst; } -void CDnaGpsPointCluster::SetCoordType(const string& sType) { +void CDnaGpsPointCluster::SetCoordType(const std::string& sType) { m_strCoordType = trimstr(sType); m_ctType = GetMyCoordTypeC(); } @@ -903,67 +903,67 @@ UINT32 CDnaGpsPointCluster::CalcBinaryRecordCount() const } -void CDnaGpsPointCluster::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const +void CDnaGpsPointCluster::WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const { const size_t pntCount = m_vGpsPoints.size(); if (comment.empty()) { - *dynaml_stream << " " << endl; + *dynaml_stream << " -->" << std::endl; } else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; - *dynaml_stream << " " << endl; - *dynaml_stream << " " << m_strType << "" << endl; + *dynaml_stream << " " << std::endl; + *dynaml_stream << " " << m_strType << "" << std::endl; // Source file from which the measurement came - *dynaml_stream << " " << m_sourceFile << "" << endl; + *dynaml_stream << " " << m_sourceFile << "" << std::endl; if (m_bIgnore) - *dynaml_stream << " *" << endl; + *dynaml_stream << " *" << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; // Reference frame and epoch - *dynaml_stream << " " << m_referenceFrame << "" << endl; - *dynaml_stream << " " << m_epoch << "" << endl; + *dynaml_stream << " " << m_referenceFrame << "" << std::endl; + *dynaml_stream << " " << m_epoch << "" << std::endl; // Scalars - *dynaml_stream << " " << fixed << setprecision(3) << m_dVscale << "" << endl; - *dynaml_stream << " " << m_dPscale << "" << endl; - *dynaml_stream << " " << m_dLscale << "" << endl; - *dynaml_stream << " " << m_dHscale << "" << endl; + *dynaml_stream << " " << std::fixed << std::setprecision(3) << m_dVscale << "" << std::endl; + *dynaml_stream << " " << m_dPscale << "" << std::endl; + *dynaml_stream << " " << m_dLscale << "" << std::endl; + *dynaml_stream << " " << m_dHscale << "" << std::endl; if (m_msr_db_map.is_cls_id_set) - *dynaml_stream << " " << m_msr_db_map.cluster_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.cluster_id << "" << std::endl; - *dynaml_stream << " " << m_strCoordType << "" << endl; - *dynaml_stream << " " << pntCount << "" << endl; + *dynaml_stream << " " << m_strCoordType << "" << std::endl; + *dynaml_stream << " " << pntCount << "" << std::endl; // write GpsPoints - vector::const_iterator _it_pnt; + std::vector::const_iterator _it_pnt; for (_it_pnt=m_vGpsPoints.begin(); _it_pnt!=m_vGpsPoints.end(); ++_it_pnt) _it_pnt->WriteDynaMLMsr(dynaml_stream, comment, true); - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } void CDnaGpsPointCluster::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const { // write GpsPoints - vector::const_iterator _it_pnt; + std::vector::const_iterator _it_pnt; for (_it_pnt=m_vGpsPoints.begin(); _it_pnt!=m_vGpsPoints.end(); ++_it_pnt) _it_pnt->WriteDNAMsr(dna_stream, dmw, dml, true); } void CDnaGpsPointCluster::SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid) { - vector::iterator _it_pnt = m_vGpsPoints.begin(); + std::vector::iterator _it_pnt = m_vGpsPoints.begin(); for (_it_pnt=m_vGpsPoints.begin(); _it_pnt!=m_vGpsPoints.end(); ++_it_pnt) _it_pnt->SimulateMsr(vStations, ellipsoid); } @@ -990,7 +990,7 @@ void CDnaGpsPointCluster::PopulateMsr(pvstn_t bstRecords, uint32_uint32_map* blo m_dHscale = 1.0; m_dVscale = 1.0; - vector::iterator _it_pnt = m_vGpsPoints.begin(); + std::vector::iterator _it_pnt = m_vGpsPoints.begin(); for (UINT32 i(0); iSetClusterID(block); @@ -1010,7 +1010,7 @@ UINT32 CDnaGpsPointCluster::SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t m_vGpsPoints.clear(); m_vGpsPoints.resize(m_lRecordedTotal); - m_referenceFrame = datumFromEpsgCode(LongFromString(it_msr->epsgCode)); + m_referenceFrame = datumFromEpsgCode(LongFromString(it_msr->epsgCode)); m_epoch = it_msr->epoch; m_epsgCode = it_msr->epsgCode; @@ -1043,7 +1043,7 @@ UINT32 CDnaGpsPointCluster::SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t void CDnaGpsPointCluster::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const { - vector< CDnaGpsPoint >::const_iterator _it_pnt; + std::vector< CDnaGpsPoint >::const_iterator _it_pnt; for (_it_pnt=m_vGpsPoints.begin(); _it_pnt!=m_vGpsPoints.end(); ++_it_pnt) _it_pnt->WriteBinaryMsr(binary_stream, msrIndex); @@ -1054,42 +1054,42 @@ void CDnaGpsPointCluster::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 m } -void CDnaGpsPointCluster::SetEpsg(const string& epsg) +void CDnaGpsPointCluster::SetEpsg(const std::string& epsg) { m_epsgCode = epsg; } -void CDnaGpsPointCluster::SetReferenceFrame(const string& refFrame) +void CDnaGpsPointCluster::SetReferenceFrame(const std::string& refFrame) { m_referenceFrame = refFrame; - SetEpsg(epsgStringFromName(refFrame)); + SetEpsg(epsgStringFromName(refFrame)); } -void CDnaGpsPointCluster::SetTotal(const string& str) +void CDnaGpsPointCluster::SetTotal(const std::string& str) { m_lRecordedTotal = LongFromString(trimstr(str)); m_vGpsPoints.reserve(m_lRecordedTotal); } -void CDnaGpsPointCluster::SetPscale(const string& str) +void CDnaGpsPointCluster::SetPscale(const std::string& str) { DoubleFromString(m_dPscale, trimstr(str)); } -void CDnaGpsPointCluster::SetLscale(const string& str) +void CDnaGpsPointCluster::SetLscale(const std::string& str) { DoubleFromString(m_dLscale, trimstr(str)); } -void CDnaGpsPointCluster::SetHscale(const string& str) +void CDnaGpsPointCluster::SetHscale(const std::string& str) { DoubleFromString(m_dHscale, trimstr(str)); } -void CDnaGpsPointCluster::SetVscale(const string& str) +void CDnaGpsPointCluster::SetVscale(const std::string& str) { DoubleFromString(m_dVscale, trimstr(str)); } diff --git a/dynadjust/include/measurement_types/dnagpspoint.hpp b/dynadjust/include/measurement_types/dnagpspoint.hpp index 9bd16036..810ef832 100644 --- a/dynadjust/include/measurement_types/dnagpspoint.hpp +++ b/dynadjust/include/measurement_types/dnagpspoint.hpp @@ -32,8 +32,6 @@ #include #include -using namespace std; - namespace dynadjust { namespace measurements { @@ -53,7 +51,7 @@ class CDnaGpsPoint : public CDnaMeasurement //CDnaGpsPoint& operator=(const CDnaGpsPoint& rhs); public: - //CDnaGpsPoint(const bool bIgnore, const string& strType, const string& strFirstStation); + //CDnaGpsPoint(const bool bIgnore, const std::string& strType, const std::string& strFirstStation); //virtual inline CDnaGpsPoint* clone() const { return new CDnaGpsPoint(*this); } bool operator==(const CDnaGpsPoint& rhs) const; @@ -64,31 +62,31 @@ class CDnaGpsPoint : public CDnaMeasurement void AddPointCovariance(const CDnaCovariance* pGpsCovariance); inline UINT32 GetClusterID() const { return m_lclusterID; } - inline string GetCoordType() const { return m_strCoordType; } + inline std::string GetCoordType() const { return m_strCoordType; } - inline vector* GetCovariances_ptr() { return &m_vPointCovariances; } + inline std::vector* GetCovariances_ptr() { return &m_vPointCovariances; } inline void SetClusterID(const UINT32& id) { m_lclusterID = id; } - void SetX(const string& str); - void SetY(const string& str); - void SetZ(const string& str); - void SetSigmaXX(const string& str); - void SetSigmaXY(const string& str); - void SetSigmaXZ(const string& str); - void SetSigmaYY(const string& str); - void SetSigmaYZ(const string& str); - void SetSigmaZZ(const string& str); + void SetX(const std::string& str); + void SetY(const std::string& str); + void SetZ(const std::string& str); + void SetSigmaXX(const std::string& str); + void SetSigmaXY(const std::string& str); + void SetSigmaXZ(const std::string& str); + void SetSigmaYY(const std::string& str); + void SetSigmaYZ(const std::string& str); + void SetSigmaZZ(const std::string& str); - void SetReferenceFrame(const string& refFrame); - //void SetEpoch(const string& epoch); - void SetEpsg(const string& epsg); - inline string GetReferenceFrame() const { return m_referenceFrame; } - //inline string GetEpoch() const { return m_epoch; } + void SetReferenceFrame(const std::string& refFrame); + //void SetEpoch(const std::string& epoch); + void SetEpsg(const std::string& epsg); + inline std::string GetReferenceFrame() const { return m_referenceFrame; } + //inline std::string GetEpoch() const { return m_epoch; } - //void SetPscale(const string& str); - //void SetLscale(const string& str); - //void SetHscale(const string& str); - //void SetVscale(const string& str); + //void SetPscale(const std::string& str); + //void SetLscale(const std::string& str); + //void SetHscale(const std::string& str); + //void SetVscale(const std::string& str); inline void SetTotal(const UINT32& l) { m_lRecordedTotal = l; } @@ -107,7 +105,7 @@ class CDnaGpsPoint : public CDnaMeasurement inline void SetLscale(const double& dbl) { m_dLscale = dbl; } inline void SetHscale(const double& dbl) { m_dHscale = dbl; } inline void SetVscale(const double& dbl) { m_dVscale = dbl; } - void SetCoordType(const string& str); + void SetCoordType(const std::string& str); inline void SetRecordedTotal(const UINT32& total) { m_lRecordedTotal = total; } @@ -117,10 +115,10 @@ class CDnaGpsPoint : public CDnaMeasurement void ResizeGpsCovariancesCount(const UINT32& size = 0); virtual UINT32 CalcBinaryRecordCount() const; - //void coutPointData(ostream &os) const; + //void coutPointData(std::ostream &os) const; virtual void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const; virtual UINT32 SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_msr, it_vdbid_t& dbidmap); - virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const; + virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const; virtual void WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const; virtual void SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid); virtual void PopulateMsr(pvstn_t bstRecords, uint32_uint32_map* blockStationsMap, vUINT32* blockStations, @@ -155,16 +153,16 @@ class CDnaGpsPoint : public CDnaMeasurement double m_dLscale; double m_dHscale; double m_dVscale; - string m_strCoordType; + std::string m_strCoordType; COORD_TYPE m_ctType; - string m_referenceFrame; + std::string m_referenceFrame; //string m_epoch; UINT32 m_lclusterID; - vector m_vPointCovariances; + std::vector m_vPointCovariances; }; @@ -184,8 +182,8 @@ class CDnaGpsPointCluster : public CDnaMeasurement CDnaGpsPointCluster& operator=(const CDnaGpsPointCluster& rhs); public: - //CDnaGpsPointCluster(const bool bIgnore, const string& strType, const string& strFirstStation); - CDnaGpsPointCluster(const UINT32 lclusterID, const string& referenceframe, const string& epoch); + //CDnaGpsPointCluster(const bool bIgnore, const std::string& strType, const std::string& strFirstStation); + CDnaGpsPointCluster(const UINT32 lclusterID, const std::string& referenceframe, const std::string& epoch); //virtual inline CDnaGpsPointCluster* clone() const { return new CDnaGpsPointCluster(*this); } bool operator==(const CDnaGpsPointCluster& rhs) const; @@ -194,33 +192,33 @@ class CDnaGpsPointCluster : public CDnaMeasurement //inline CDnaGpsPointCluster& operator[](int iIndex) { return this[iIndex]; } //inline UINT32 GetNumPoints() { return m_vGpsPoints.size(); } - inline vector& GetPoints() { return m_vGpsPoints; } - inline vector* GetPoints_ptr() { return &m_vGpsPoints; } + inline std::vector& GetPoints() { return m_vGpsPoints; } + inline std::vector* GetPoints_ptr() { return &m_vGpsPoints; } inline UINT32 GetClusterID() const { return m_lclusterID; } - inline string GetCoordType() const { return m_strCoordType; } + inline std::string GetCoordType() const { return m_strCoordType; } inline UINT32 GetTotal() const { return m_lRecordedTotal; } inline double GetPscale() const { return m_dPscale; } inline double GetLscale() const { return m_dLscale; } inline double GetHscale() const { return m_dHscale; } inline double GetVscale() const { return m_dVscale; } - void SetCoordType(const string& str); + void SetCoordType(const std::string& str); _COORD_TYPE_ GetMyCoordTypeC(); - void SetReferenceFrame(const string& refFrame); - //void SetEpoch(const string& epoch); - void SetEpsg(const string& epsg); - inline string GetReferenceFrame() const { return m_referenceFrame; } - //inline string GetEpoch() const { return m_epoch; } + void SetReferenceFrame(const std::string& refFrame); + //void SetEpoch(const std::string& epoch); + void SetEpsg(const std::string& epsg); + inline std::string GetReferenceFrame() const { return m_referenceFrame; } + //inline std::string GetEpoch() const { return m_epoch; } - //inline void SetPoints(const vector& d) { m_vGpsPoints = d; } - void SetTotal(const string& str); - void SetPscale(const string& str); - void SetLscale(const string& str); - void SetHscale(const string& str); - void SetVscale(const string& str); + //inline void SetPoints(const std::vector& d) { m_vGpsPoints = d; } + void SetTotal(const std::string& str); + void SetPscale(const std::string& str); + void SetLscale(const std::string& str); + void SetHscale(const std::string& str); + void SetVscale(const std::string& str); inline void SetTotal(const UINT32& u) { m_lRecordedTotal = u; } @@ -235,7 +233,7 @@ class CDnaGpsPointCluster : public CDnaMeasurement virtual UINT32 CalcBinaryRecordCount() const; virtual void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const; virtual UINT32 SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_msr, it_vdbid_t& dbidmap); - virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const; + virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const; virtual void WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const; virtual void SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid); virtual void PopulateMsr(pvstn_t bstRecords, uint32_uint32_map* blockStationsMap, vUINT32* blockStations, @@ -252,13 +250,13 @@ class CDnaGpsPointCluster : public CDnaMeasurement double m_dLscale; double m_dHscale; double m_dVscale; - string m_strCoordType; + std::string m_strCoordType; COORD_TYPE m_ctType; - vector m_vGpsPoints; + std::vector m_vGpsPoints; - string m_referenceFrame; + std::string m_referenceFrame; //string m_epoch; UINT32 m_lclusterID; diff --git a/dynadjust/include/measurement_types/dnaheight.cpp b/dynadjust/include/measurement_types/dnaheight.cpp index 4f8cbfed..19b3d966 100644 --- a/dynadjust/include/measurement_types/dnaheight.cpp +++ b/dynadjust/include/measurement_types/dnaheight.cpp @@ -73,63 +73,63 @@ bool CDnaHeight::operator< (const CDnaHeight& rhs) const } -void CDnaHeight::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const +void CDnaHeight::WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const { if (comment.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; - *dynaml_stream << " " << endl; - *dynaml_stream << " " << m_strType << "" << endl; + *dynaml_stream << " " << std::endl; + *dynaml_stream << " " << m_strType << "" << std::endl; // Source file from which the measurement came - *dynaml_stream << " " << m_sourceFile << "" << endl; + *dynaml_stream << " " << m_sourceFile << "" << std::endl; if (m_bIgnore) - *dynaml_stream << " *" << endl; + *dynaml_stream << " *" << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; if (m_epoch.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << m_epoch << "" << endl; + *dynaml_stream << " " << m_epoch << "" << std::endl; - *dynaml_stream << " " << m_strFirst << "" << endl; - *dynaml_stream << " " << fixed << setprecision(4) << m_dValue << "" << endl; - *dynaml_stream << " " << scientific << setprecision(6) << m_dStdDev << "" << endl; + *dynaml_stream << " " << m_strFirst << "" << std::endl; + *dynaml_stream << " " << std::fixed << std::setprecision(4) << m_dValue << "" << std::endl; + *dynaml_stream << " " << std::scientific << std::setprecision(6) << m_dStdDev << "" << std::endl; if (m_msr_db_map.is_msr_id_set) - *dynaml_stream << " " << m_msr_db_map.msr_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.msr_id << "" << std::endl; - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } void CDnaHeight::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const { - *dna_stream << setw(dmw.msr_type) << m_strType; + *dna_stream << std::setw(dmw.msr_type) << m_strType; if (m_bIgnore) - *dna_stream << setw(dmw.msr_ignore) << "*"; + *dna_stream << std::setw(dmw.msr_ignore) << "*"; else - *dna_stream << setw(dmw.msr_ignore) << " "; + *dna_stream << std::setw(dmw.msr_ignore) << " "; - *dna_stream << left << setw(dmw.msr_inst) << m_strFirst; - *dna_stream << setw(dmw.msr_targ1) << " "; - *dna_stream << setw(dmw.msr_targ2) << " "; - *dna_stream << right << setw(dmw.msr_linear) << fixed << setprecision(4) << m_dValue; // linear measurement value - *dna_stream << setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << " "; + *dna_stream << std::left << std::setw(dmw.msr_inst) << m_strFirst; + *dna_stream << std::setw(dmw.msr_targ1) << " "; + *dna_stream << std::setw(dmw.msr_targ2) << " "; + *dna_stream << std::right << std::setw(dmw.msr_linear) << std::fixed << std::setprecision(4) << m_dValue; // linear measurement value + *dna_stream << std::setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << " "; UINT32 m_stdDevPrec(3); // note change from 6 decimal places to 3 - *dna_stream << setw(dmw.msr_stddev) << StringFromTW(m_dStdDev, dmw.msr_stddev, m_stdDevPrec); - //*dna_stream << setw(dmw.msr_stddev) << fixed << setprecision(6) << m_dStdDev; + *dna_stream << std::setw(dmw.msr_stddev) << StringFromTW(m_dStdDev, dmw.msr_stddev, m_stdDevPrec); + //*dna_stream << std::setw(dmw.msr_stddev) << std::fixed << std::setprecision(6) << m_dStdDev; - *dna_stream << setw(dml.msr_gps_epoch - dml.msr_inst_ht) << " "; - *dna_stream << setw(dmw.msr_gps_epoch) << m_epoch; + *dna_stream << std::setw(dml.msr_gps_epoch - dml.msr_inst_ht) << " "; + *dna_stream << std::setw(dmw.msr_gps_epoch) << m_epoch; if (m_msr_db_map.is_msr_id_set) - *dna_stream << setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; + *dna_stream << std::setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; - *dna_stream << endl; + *dna_stream << std::endl; } @@ -216,12 +216,12 @@ void CDnaHeight::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) } -void CDnaHeight::SetValue(const string& str) +void CDnaHeight::SetValue(const std::string& str) { DoubleFromString(m_dValue, trimstr(str)); } -void CDnaHeight::SetStdDev(const string& str) +void CDnaHeight::SetStdDev(const std::string& str) { DoubleFromString(m_dStdDev, trimstr(str)); } diff --git a/dynadjust/include/measurement_types/dnaheight.hpp b/dynadjust/include/measurement_types/dnaheight.hpp index 374c02ab..e52e9694 100644 --- a/dynadjust/include/measurement_types/dnaheight.hpp +++ b/dynadjust/include/measurement_types/dnaheight.hpp @@ -31,8 +31,6 @@ #include -using namespace std; - namespace dynadjust { namespace measurements { @@ -48,7 +46,7 @@ class CDnaHeight : public CDnaMeasurement //CDnaHeight& operator=(const CDnaHeight& rhs); public: - //CDnaHeight(const bool bIgnore, const string& strType, const string& strFirst, const double& dValue, const double& dStdDev); + //CDnaHeight(const bool bIgnore, const std::string& strType, const std::string& strFirst, const double& dValue, const double& dStdDev); bool operator==(const CDnaHeight& rhs) const; bool operator<(const CDnaHeight& rhs) const; @@ -58,14 +56,14 @@ class CDnaHeight : public CDnaMeasurement inline double GetValue() const { return m_dValue; } inline double GetStdDev() const { return m_dStdDev; } - void SetValue(const string& str); - void SetStdDev(const string& str); + void SetValue(const std::string& str); + void SetStdDev(const std::string& str); inline virtual UINT32 CalcBinaryRecordCount() const { return 1; } virtual void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const; virtual UINT32 SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_msr, it_vdbid_t& dbidmap); - virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const; + virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const; virtual void WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const; virtual void SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid); diff --git a/dynadjust/include/measurement_types/dnaheightdifference.cpp b/dynadjust/include/measurement_types/dnaheightdifference.cpp index d0157bd6..76833c5c 100644 --- a/dynadjust/include/measurement_types/dnaheightdifference.cpp +++ b/dynadjust/include/measurement_types/dnaheightdifference.cpp @@ -83,64 +83,64 @@ bool CDnaHeightDifference::operator< (const CDnaHeightDifference& rhs) const } -void CDnaHeightDifference::WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const +void CDnaHeightDifference::WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const { if (comment.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; - *dynaml_stream << " " << endl; - *dynaml_stream << " " << m_strType << "" << endl; + *dynaml_stream << " " << std::endl; + *dynaml_stream << " " << m_strType << "" << std::endl; // Source file from which the measurement came - *dynaml_stream << " " << m_sourceFile << "" << endl; + *dynaml_stream << " " << m_sourceFile << "" << std::endl; if (m_bIgnore) - *dynaml_stream << " *" << endl; + *dynaml_stream << " *" << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; if (m_epoch.empty()) - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << m_epoch << "" << endl; + *dynaml_stream << " " << m_epoch << "" << std::endl; - *dynaml_stream << " " << m_strFirst << "" << endl; - *dynaml_stream << " " << m_strTarget << "" << endl; - *dynaml_stream << " " << fixed << setprecision(4) << m_dValue << "" << endl; - *dynaml_stream << " " << fixed << setprecision(6) << m_dStdDev << "" << endl; + *dynaml_stream << " " << m_strFirst << "" << std::endl; + *dynaml_stream << " " << m_strTarget << "" << std::endl; + *dynaml_stream << " " << std::fixed << std::setprecision(4) << m_dValue << "" << std::endl; + *dynaml_stream << " " << std::fixed << std::setprecision(6) << m_dStdDev << "" << std::endl; if (m_msr_db_map.is_msr_id_set) - *dynaml_stream << " " << m_msr_db_map.msr_id << "" << endl; + *dynaml_stream << " " << m_msr_db_map.msr_id << "" << std::endl; - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } void CDnaHeightDifference::WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const { - *dna_stream << setw(dmw.msr_type) << m_strType; + *dna_stream << std::setw(dmw.msr_type) << m_strType; if (m_bIgnore) - *dna_stream << setw(dmw.msr_ignore) << "*"; + *dna_stream << std::setw(dmw.msr_ignore) << "*"; else - *dna_stream << setw(dmw.msr_ignore) << " "; + *dna_stream << std::setw(dmw.msr_ignore) << " "; - *dna_stream << left << setw(dmw.msr_inst) << m_strFirst; - *dna_stream << left << setw(dmw.msr_targ1) << m_strTarget; - *dna_stream << setw(dmw.msr_targ2) << " "; - *dna_stream << right << setw(dmw.msr_linear) << fixed << setprecision(4) << m_dValue; // linear measurement value - *dna_stream << setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << " "; + *dna_stream << std::left << std::setw(dmw.msr_inst) << m_strFirst; + *dna_stream << std::left << std::setw(dmw.msr_targ1) << m_strTarget; + *dna_stream << std::setw(dmw.msr_targ2) << " "; + *dna_stream << std::right << std::setw(dmw.msr_linear) << std::fixed << std::setprecision(4) << m_dValue; // linear measurement value + *dna_stream << std::setw(dmw.msr_ang_d + dmw.msr_ang_m + dmw.msr_ang_s) << " "; UINT32 m_stdDevPrec(3); // note change from 6 decimal places to 3 - *dna_stream << setw(dmw.msr_stddev) << StringFromTW(m_dStdDev, dmw.msr_stddev, m_stdDevPrec); - //*dna_stream << setw(dmw.msr_stddev) << fixed << setprecision(6) << m_dStdDev; + *dna_stream << std::setw(dmw.msr_stddev) << StringFromTW(m_dStdDev, dmw.msr_stddev, m_stdDevPrec); + //*dna_stream << std::setw(dmw.msr_stddev) << std::fixed << std::setprecision(6) << m_dStdDev; - *dna_stream << setw(dml.msr_gps_epoch - dml.msr_inst_ht) << " "; - *dna_stream << setw(dmw.msr_gps_epoch) << m_epoch; + *dna_stream << std::setw(dml.msr_gps_epoch - dml.msr_inst_ht) << " "; + *dna_stream << std::setw(dmw.msr_gps_epoch) << m_epoch; if (m_msr_db_map.is_msr_id_set) - *dna_stream << setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; + *dna_stream << std::setw(dmw.msr_id_msr) << m_msr_db_map.msr_id; - *dna_stream << endl; + *dna_stream << std::endl; } @@ -251,12 +251,12 @@ void CDnaHeightDifference::WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 } -void CDnaHeightDifference::SetValue(const string& str) +void CDnaHeightDifference::SetValue(const std::string& str) { DoubleFromString(m_dValue, trimstr(str)); } -void CDnaHeightDifference::SetStdDev(const string& str) +void CDnaHeightDifference::SetStdDev(const std::string& str) { DoubleFromString(m_dStdDev, trimstr(str)); } diff --git a/dynadjust/include/measurement_types/dnaheightdifference.hpp b/dynadjust/include/measurement_types/dnaheightdifference.hpp index 33f311de..2518cfbf 100644 --- a/dynadjust/include/measurement_types/dnaheightdifference.hpp +++ b/dynadjust/include/measurement_types/dnaheightdifference.hpp @@ -31,8 +31,6 @@ #include -using namespace std; - namespace dynadjust { namespace measurements { @@ -48,7 +46,7 @@ class CDnaHeightDifference : public CDnaHeight //CDnaHeightDifference& operator=(const CDnaHeightDifference& rhs); public: - //CDnaHeightDifference(const bool bIgnore, const string& strType, const string& strFirst, const string& strTarget, const double& dValue, const double& dStdDev); + //CDnaHeightDifference(const bool bIgnore, const std::string& strType, const std::string& strFirst, const std::string& strTarget, const double& dValue, const double& dStdDev); //virtual inline CDnaHeightDifference* clone() const { return new CDnaHeightDifference(*this); } bool operator==(const CDnaHeightDifference& rhs) const; @@ -56,24 +54,24 @@ class CDnaHeightDifference : public CDnaHeight //inline CDnaHeightDifference& operator[](int iIndex) { return this[iIndex]; } - inline string GetTarget() const { return m_strTarget; } + inline std::string GetTarget() const { return m_strTarget; } inline double GetValue() const { return m_dValue; } inline double GetStdDev() const { return m_dStdDev; } - inline void SetTarget(const string& str) { m_strTarget = trimstr(str); } + inline void SetTarget(const std::string& str) { m_strTarget = trimstr(str); } - void SetValue(const string& str); - void SetStdDev(const string& str); + void SetValue(const std::string& str); + void SetStdDev(const std::string& str); inline virtual UINT32 CalcBinaryRecordCount() const { return 1; } virtual void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const; virtual UINT32 SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_msr, it_vdbid_t& dbidmap); - virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool) const; + virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool) const; virtual void WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool) const; virtual void SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid); public: - string m_strTarget; + std::string m_strTarget; double m_dValue; double m_dStdDev; }; diff --git a/dynadjust/include/measurement_types/dnameasurement.cpp b/dynadjust/include/measurement_types/dnameasurement.cpp index f97fc00a..b455dcd6 100644 --- a/dynadjust/include/measurement_types/dnameasurement.cpp +++ b/dynadjust/include/measurement_types/dnameasurement.cpp @@ -121,24 +121,24 @@ bool CDnaCovariance::operator== (const CDnaCovariance& rhs) const void CDnaCovariance::WriteDynaMLMsr(std::ofstream* dynaml_stream) const { if (GetTypeC() == 'X') - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; - *dynaml_stream << " " << scientific << setprecision(13) << m_dM11 << "" << endl; - *dynaml_stream << " " << m_dM12 << "" << endl; - *dynaml_stream << " " << m_dM13 << "" << endl; - *dynaml_stream << " " << m_dM21 << "" << endl; - *dynaml_stream << " " << m_dM22 << "" << endl; - *dynaml_stream << " " << m_dM23 << "" << endl; - *dynaml_stream << " " << m_dM31 << "" << endl; - *dynaml_stream << " " << m_dM32 << "" << endl; - *dynaml_stream << " " << m_dM33 << "" << endl; + *dynaml_stream << " " << std::scientific << std::setprecision(13) << m_dM11 << "" << std::endl; + *dynaml_stream << " " << m_dM12 << "" << std::endl; + *dynaml_stream << " " << m_dM13 << "" << std::endl; + *dynaml_stream << " " << m_dM21 << "" << std::endl; + *dynaml_stream << " " << m_dM22 << "" << std::endl; + *dynaml_stream << " " << m_dM23 << "" << std::endl; + *dynaml_stream << " " << m_dM31 << "" << std::endl; + *dynaml_stream << " " << m_dM32 << "" << std::endl; + *dynaml_stream << " " << m_dM33 << "" << std::endl; if (GetTypeC() == 'X') - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; else - *dynaml_stream << " " << endl; + *dynaml_stream << " " << std::endl; } @@ -147,28 +147,28 @@ void CDnaCovariance::WriteDNAMsr(std::ofstream* dna_stream, { UINT32 pad(dmw.msr_type + dmw.msr_ignore + dmw.msr_inst + dmw.msr_targ1 + dmw.msr_targ2 + dmw.msr_gps); // X - *dna_stream << setw(pad) << " "; + *dna_stream << std::setw(pad) << " "; *dna_stream << - right << setw(dmw.msr_gps_vcv_1) << scientific << setprecision(13) << m_dM11 << - right << setw(dmw.msr_gps_vcv_2) << m_dM12 << - right << setw(dmw.msr_gps_vcv_3) << m_dM13; - *dna_stream << endl; + std::right << std::setw(dmw.msr_gps_vcv_1) << std::scientific << std::setprecision(13) << m_dM11 << + std::right << std::setw(dmw.msr_gps_vcv_2) << m_dM12 << + std::right << std::setw(dmw.msr_gps_vcv_3) << m_dM13; + *dna_stream << std::endl; // Y - *dna_stream << setw(pad) << " "; + *dna_stream << std::setw(pad) << " "; *dna_stream << - right << setw(dmw.msr_gps_vcv_1) << scientific << setprecision(13) << m_dM21 << - right << setw(dmw.msr_gps_vcv_2) << m_dM22 << - right << setw(dmw.msr_gps_vcv_3) << m_dM23; - *dna_stream << endl; + std::right << std::setw(dmw.msr_gps_vcv_1) << std::scientific << std::setprecision(13) << m_dM21 << + std::right << std::setw(dmw.msr_gps_vcv_2) << m_dM22 << + std::right << std::setw(dmw.msr_gps_vcv_3) << m_dM23; + *dna_stream << std::endl; // Z - *dna_stream << setw(pad) << " "; + *dna_stream << std::setw(pad) << " "; *dna_stream << - right << setw(dmw.msr_gps_vcv_1) << scientific << setprecision(13) << m_dM31 << - right << setw(dmw.msr_gps_vcv_2) << m_dM32 << - right << setw(dmw.msr_gps_vcv_3) << m_dM33; - *dna_stream << endl; + std::right << std::setw(dmw.msr_gps_vcv_1) << std::scientific << std::setprecision(13) << m_dM31 << + std::right << std::setw(dmw.msr_gps_vcv_2) << m_dM32 << + std::right << std::setw(dmw.msr_gps_vcv_3) << m_dM33; + *dna_stream << std::endl; } @@ -221,7 +221,7 @@ UINT32 CDnaCovariance::SetMeasurementRec(const vstn_t&, it_vmsr_t& it_msr) } -void CDnaCovariance::WriteBinaryMsr(std::ofstream *binary_stream, PUINT32 msrIndex, const string& epsgCode, const string& epoch) const +void CDnaCovariance::WriteBinaryMsr(std::ofstream *binary_stream, PUINT32 msrIndex, const std::string& epsgCode, const std::string& epoch) const { *msrIndex += 3; measurement_t measRecord; @@ -283,47 +283,47 @@ void CDnaCovariance::SerialiseDatabaseMap(std::ofstream* os, const msr_database_ os->write(reinterpret_cast(&cls), sizeof(UINT16)); } -void CDnaCovariance::SetM11(const string& str) +void CDnaCovariance::SetM11(const std::string& str) { DoubleFromString(m_dM11, trimstr(str)); } -void CDnaCovariance::SetM12(const string& str) +void CDnaCovariance::SetM12(const std::string& str) { DoubleFromString(m_dM12, trimstr(str)); } -void CDnaCovariance::SetM13(const string& str) +void CDnaCovariance::SetM13(const std::string& str) { DoubleFromString(m_dM13, trimstr(str)); } -void CDnaCovariance::SetM21(const string& str) +void CDnaCovariance::SetM21(const std::string& str) { DoubleFromString(m_dM21, trimstr(str)); } -void CDnaCovariance::SetM22(const string& str) +void CDnaCovariance::SetM22(const std::string& str) { DoubleFromString(m_dM22, trimstr(str)); } -void CDnaCovariance::SetM23(const string& str) +void CDnaCovariance::SetM23(const std::string& str) { DoubleFromString(m_dM23, trimstr(str)); } -void CDnaCovariance::SetM31(const string& str) +void CDnaCovariance::SetM31(const std::string& str) { DoubleFromString(m_dM31, trimstr(str)); } -void CDnaCovariance::SetM32(const string& str) +void CDnaCovariance::SetM32(const std::string& str) { DoubleFromString(m_dM32, trimstr(str)); } -void CDnaCovariance::SetM33(const string& str) +void CDnaCovariance::SetM33(const std::string& str) { DoubleFromString(m_dM33, trimstr(str)); } @@ -427,12 +427,12 @@ CDnaMeasurement& CDnaMeasurement::operator= (CDnaMeasurement&& rhs) } -void CDnaMeasurement::coutMeasurement(ostream& os) const +void CDnaMeasurement::coutMeasurement(std::ostream& os) const { - os << setw(2) << left << "+ " << setw(2) << m_strType; + os << std::setw(2) << std::left << "+ " << std::setw(2) << m_strType; } -void CDnaMeasurement::SetMeasurementDBID(const string& str) +void CDnaMeasurement::SetMeasurementDBID(const std::string& str) { if (str.empty()) { @@ -446,7 +446,7 @@ void CDnaMeasurement::SetMeasurementDBID(const string& str) } } -void CDnaMeasurement::SetClusterDBID(const string& str) +void CDnaMeasurement::SetClusterDBID(const std::string& str) { if (str.empty()) { @@ -466,7 +466,7 @@ void CDnaMeasurement::SetClusterDBID(const UINT32& u, bool s) m_msr_db_map.is_cls_id_set = s; } -void CDnaMeasurement::SetType(const string& str) +void CDnaMeasurement::SetType(const std::string& str) { m_strType = trimstr(str); str_toupper(m_strType); @@ -495,7 +495,7 @@ void CDnaMeasurement::SerialiseDatabaseMap(std::ofstream* os) os->write(reinterpret_cast(&val), sizeof(UINT16)); } -void CDnaMeasurement::SetEpoch(const string& epoch) +void CDnaMeasurement::SetEpoch(const std::string& epoch) { m_epoch = epoch; } diff --git a/dynadjust/include/measurement_types/dnameasurement.hpp b/dynadjust/include/measurement_types/dnameasurement.hpp index 0f251eac..a388ada6 100644 --- a/dynadjust/include/measurement_types/dnameasurement.hpp +++ b/dynadjust/include/measurement_types/dnameasurement.hpp @@ -49,9 +49,6 @@ //#include -using namespace std; -using namespace boost; - enum { INST_WIDTH = 12, TARG_WIDTH = 12, @@ -123,12 +120,12 @@ class CDnaCovariance; // measurement types typedef boost::shared_ptr dnaMsrPtr; -typedef vector vdnaMsrPtr, *pvdnaMsrPtr; // vector of dnaMsrPtr +typedef std::vector vdnaMsrPtr, *pvdnaMsrPtr; // vector of dnaMsrPtr typedef vdnaMsrPtr::iterator _it_vdnamsrptr; typedef vdnaMsrPtr::const_iterator _it_vdnamsrptr_const; typedef boost::shared_ptr dnaCovariancePtr; -typedef boost::shared_ptr< vector > vecCovariancePtr; +typedef boost::shared_ptr< std::vector > vecCovariancePtr; // data struct for storing measurement information to binary measurement file typedef struct msr_t { @@ -188,7 +185,7 @@ typedef struct msr_t { double preAdjMeas; } measurement_t; -typedef vector vmsr_t, *pvmsr_t; +typedef std::vector vmsr_t, *pvmsr_t; typedef vmsr_t::iterator it_vmsr_t, *pit_vmsr_t; typedef vmsr_t::const_iterator it_vmsr_t_const; @@ -198,15 +195,15 @@ typedef struct scl_t { , v_scale(1.), p_scale(1.), l_scale(1.), h_scale(1.) {} - string station1; - string station2; + std::string station1; + std::string station2; double v_scale; // phi, n or X scalar double p_scale; // lambda, e or Y scalar double l_scale; // height, up or Z scalar double h_scale; // matrix scalar } scalar_t; -typedef vector vscl_t, *pvscl_t; +typedef std::vector vscl_t, *pvscl_t; typedef vscl_t::iterator it_vscl_t, *pit_vscl_t; typedef vscl_t::const_iterator it_vscl_t_const; @@ -232,7 +229,7 @@ class CDnaCovariance //inline CDnaCovariance& operator[](int iIndex) { return this[iIndex]; } - inline void SetType(const string& str) { m_strType = trimstr(str); } + inline void SetType(const std::string& str) { m_strType = trimstr(str); } inline char GetTypeC() const { return (m_strType.c_str())[0]; } // m_bIgnore used only to 'split' cluster measurements @@ -240,7 +237,7 @@ class CDnaCovariance inline bool GetIgnore() const { return m_bIgnore; } inline virtual UINT32 CalcBinaryRecordCount() const { return 3; } - void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex, const string& epsgCode, const string& epoch) const; + void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex, const std::string& epsgCode, const std::string& epoch) const; virtual UINT32 SetMeasurementRec(const vstn_t& binaryStn, it_vmsr_t& it_msr); virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream) const; virtual void WriteDNAMsr(std::ofstream* dna_stream, @@ -252,15 +249,15 @@ class CDnaCovariance inline void SetClusterID(const UINT32& id) { m_lclusterID = id; } inline void SetStn1Index(const UINT32& stn) { m_lstn1Index = stn; } inline void SetStn2Index(const UINT32& stn) { m_lstn2Index = stn; } - void SetM11(const string& str); - void SetM12(const string& str); - void SetM13(const string& str); - void SetM21(const string& str); - void SetM22(const string& str); - void SetM23(const string& str); - void SetM31(const string& str); - void SetM32(const string& str); - void SetM33(const string& str); + void SetM11(const std::string& str); + void SetM12(const std::string& str); + void SetM13(const std::string& str); + void SetM21(const std::string& str); + void SetM22(const std::string& str); + void SetM23(const std::string& str); + void SetM31(const std::string& str); + void SetM32(const std::string& str); + void SetM33(const std::string& str); inline void SetM11(const double& dbl) { m_dM11 = dbl; } inline void SetM12(const double& dbl) { m_dM12 = dbl; } @@ -289,7 +286,7 @@ class CDnaCovariance bool m_bIgnore; UINT32 m_lstn1Index; // This is an index to the record number in the station file UINT32 m_lstn2Index; - string m_strType; + std::string m_strType; double m_dM11; double m_dM12; double m_dM13; @@ -323,24 +320,24 @@ class CDnaMeasurement public: //virtual CDnaMeasurement* clone() const = 0; // The Virtual (Copy) Constructor - inline string GetType() const { return m_strType; } + inline std::string GetType() const { return m_strType; } inline char GetTypeC() const { return (m_strType.c_str())[0]; } inline bool GetIgnore() const { return m_bIgnore; } inline bool NotIgnored() const { return m_bIgnore == false; } - inline string GetFirst() const { return m_strFirst; } + inline std::string GetFirst() const { return m_strFirst; } inline MEASUREMENT_STATIONS GetMsrStnCount() const { return m_MSmeasurementStations; } - inline string GetEpsg() const { return m_epsgCode; } - inline string GetSource() const { return m_sourceFile; } + inline std::string GetEpsg() const { return m_epsgCode; } + inline std::string GetSource() const { return m_sourceFile; } inline bool GetInsufficient() const { return m_bInsufficient; } - void SetType(const string& str); + void SetType(const std::string& str); inline void SetIgnore(const bool bval) { m_bIgnore = bval; } - inline void SetFirst(const string& str) { m_strFirst = trimstr(str); } + inline void SetFirst(const std::string& str) { m_strFirst = trimstr(str); } - inline void SetEpsg(const string& e) { m_epsgCode = trimstr(e); } - inline void SetSource(const string& source) { m_sourceFile = source; } + inline void SetEpsg(const std::string& e) { m_epsgCode = trimstr(e); } + inline void SetSource(const std::string& source) { m_sourceFile = source; } inline void SetInsufficient(const bool bval) { m_bInsufficient = bval; } @@ -365,7 +362,7 @@ class CDnaMeasurement virtual UINT32 CalcBinaryRecordCount() const = 0; virtual void WriteBinaryMsr(std::ofstream* binary_stream, PUINT32 msrIndex) const = 0; virtual UINT32 SetMeasurementRec(const vstn_t&, it_vmsr_t& it_msr, it_vdbid_t& dbidmap) = 0; - virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const string& comment, bool bSubMeasurement = false) const = 0; + virtual void WriteDynaMLMsr(std::ofstream* dynaml_stream, const std::string& comment, bool bSubMeasurement = false) const = 0; virtual void WriteDNAMsr(std::ofstream* dna_stream, const dna_msr_fields& dmw, const dna_msr_fields& dml, bool bSubMeasurement = false) const = 0; virtual void SimulateMsr(vdnaStnPtr* vStations, const CDnaEllipsoid* ellipsoid) = 0; @@ -376,26 +373,26 @@ class CDnaMeasurement // virtual functions overridden by specialised classes virtual inline UINT32 GetClusterID() const { return 0; } - virtual inline string GetCoordType() const { return m_strType; } + virtual inline std::string GetCoordType() const { return m_strType; } virtual inline float GetInstrHeight() const { return 0; } virtual inline double GetVscale() const { return 0; } virtual inline double GetPscale() const { return 0; } virtual inline double GetLscale() const { return 0; } virtual inline double GetHscale() const { return 0; } virtual inline double GetStdDev() const { return 0; } - virtual inline string GetTarget() const { return ""; } - virtual inline string GetTarget2() const { return ""; } + virtual inline std::string GetTarget() const { return ""; } + virtual inline std::string GetTarget2() const { return ""; } virtual inline float GetTargetHeight() const { return 0; } virtual inline UINT32 GetTotal() const { return 0; } virtual inline double GetValue() const { return 0; } - virtual inline string GetReferenceFrame() const { return ""; } - inline string GetEpoch() const { return m_epoch; } + virtual inline std::string GetReferenceFrame() const { return ""; } + inline std::string GetEpoch() const { return m_epoch; } - virtual inline vector* GetBaselines_ptr() { return 0; } - virtual inline vector* GetDirections_ptr() { return 0; } - virtual inline vector* GetPoints_ptr() { return 0; } - virtual inline vector* GetCovariances_ptr() { return 0; } + virtual inline std::vector* GetBaselines_ptr() { return 0; } + virtual inline std::vector* GetDirections_ptr() { return 0; } + virtual inline std::vector* GetPoints_ptr() { return 0; } + virtual inline std::vector* GetCovariances_ptr() { return 0; } virtual void AddDirection(const CDnaMeasurement*) {} virtual void AddGpsBaseline(const CDnaMeasurement*) {} @@ -412,35 +409,35 @@ class CDnaMeasurement virtual void SetRecordedTotal(const UINT32&) {} virtual void SetNonIgnoredDirns(const UINT32&) {} virtual void SetClusterID(const UINT32&) {} - virtual void SetCoordType(const string&) {} - virtual void SetHscale(const string&) {} + virtual void SetCoordType(const std::string&) {} + virtual void SetHscale(const std::string&) {} virtual void SetHscale(const double&) {} - virtual void SetInstrumentHeight(const string&) {} + virtual void SetInstrumentHeight(const std::string&) {} - virtual void SetReferenceFrame(const string&) {} - void SetEpoch(const string& epoch); + virtual void SetReferenceFrame(const std::string&) {} + void SetEpoch(const std::string& epoch); - virtual void SetLscale(const string&) {} + virtual void SetLscale(const std::string&) {} virtual void SetLscale(const double&) {} - virtual void SetPscale(const string&) {} + virtual void SetPscale(const std::string&) {} virtual void SetPscale(const double&) {} - virtual void SetSigmaXX(const string&) {} - virtual void SetSigmaXY(const string&) {} - virtual void SetSigmaXZ(const string&) {} - virtual void SetSigmaYY(const string&) {} - virtual void SetSigmaYZ(const string&) {} - virtual void SetSigmaZZ(const string&) {} - virtual void SetStdDev(const string&) {} - virtual void SetTarget(const string&) {} - virtual void SetTarget2(const string&) {} - virtual void SetTargetHeight(const string&) {} - virtual void SetTotal(const string&) {} - virtual void SetValue(const string&) {} - virtual void SetVscale(const string&) {} + virtual void SetSigmaXX(const std::string&) {} + virtual void SetSigmaXY(const std::string&) {} + virtual void SetSigmaXZ(const std::string&) {} + virtual void SetSigmaYY(const std::string&) {} + virtual void SetSigmaYZ(const std::string&) {} + virtual void SetSigmaZZ(const std::string&) {} + virtual void SetStdDev(const std::string&) {} + virtual void SetTarget(const std::string&) {} + virtual void SetTarget2(const std::string&) {} + virtual void SetTargetHeight(const std::string&) {} + virtual void SetTotal(const std::string&) {} + virtual void SetValue(const std::string&) {} + virtual void SetVscale(const std::string&) {} virtual void SetVscale(const double&) {} - virtual void SetX(const string&) {} - virtual void SetY(const string&) {} - virtual void SetZ(const string&) {} + virtual void SetX(const std::string&) {} + virtual void SetY(const std::string&) {} + virtual void SetZ(const std::string&) {} virtual void SetXAxis(const double&) {} virtual void SetYAxis(const double&) {} @@ -455,10 +452,10 @@ class CDnaMeasurement virtual void PreferGMeasurements() {} - //virtual void coutBaselineData(ostream &os, const int& pad, const UINT16& uType = 0) {} + //virtual void coutBaselineData(std::ostream &os, const int& pad, const UINT16& uType = 0) {} - void SetMeasurementDBID(const string& str); - void SetClusterDBID(const string& str); + void SetMeasurementDBID(const std::string& str); + void SetClusterDBID(const std::string& str); void SetClusterDBID(const UINT32& u, bool s); @@ -471,14 +468,14 @@ class CDnaMeasurement virtual void SerialiseDatabaseMap(std::ofstream* os); protected: - void coutMeasurement(ostream &os) const; + void coutMeasurement(std::ostream &os) const; public: - string m_strFirst; + std::string m_strFirst; MEASUREMENT_STATIONS m_MSmeasurementStations; protected: - string m_strType; + std::string m_strType; bool m_bIgnore; UINT32 m_lmeasurementIndex; @@ -492,10 +489,10 @@ class CDnaMeasurement double m_residualPrec; double m_preAdjCorr; - string m_epsgCode; - string m_sourceFile; + std::string m_epsgCode; + std::string m_sourceFile; - string m_epoch; + std::string m_epoch; msr_database_id_map m_msr_db_map; @@ -514,7 +511,7 @@ class MsrTally } static void FillMsrList(vchar& msr_list); - static string GetMsrName(const char& c); + static std::string GetMsrName(const char& c); void initialise(); @@ -523,7 +520,7 @@ class MsrTally MsrTally operator+(const MsrTally& rhs) const; //MsrTally operator-(const MsrTally& rhs) const; UINT32 TotalCount(); - void coutSummary(ostream &os, const string& title); + void coutSummary(std::ostream &os, const std::string& title); UINT32 MeasurementCount(const char& msrType); void CreateTally(const vdnaMsrPtr& vMeasurements); @@ -532,8 +529,8 @@ class MsrTally void IncrementMsrType(const char& msrType, const UINT32& count=1); - void coutSummaryMsrToStn(ostream &os, const string& station); - void coutSummaryMsrToStn_Compressed(ostream &os, const string& station); + void coutSummaryMsrToStn(std::ostream &os, const std::string& station); + void coutSummaryMsrToStn_Compressed(std::ostream &os, const std::string& station); //bool GPSOnly(); inline bool ContainsNonGPS() { return containsNonGPS; } @@ -548,7 +545,7 @@ class MsrTally UINT32 totalCount; }; -typedef vector vmsrtally; +typedef std::vector vmsrtally; typedef vmsrtally::iterator _it_vmsrtally; template @@ -559,40 +556,40 @@ void MsrToStnSummaryHeaderLine( for (i=0; i void MsrToStnSummaryHeader( - T& stream, string& header) + T& stream, std::string& header) { - stream << endl << header << endl; - stream << "------------------------------------------" << endl << endl; - - stream << setw(STATION) << left << "Station" << - setw(NUMERIC_WIDTH) << right << "A" << - setw(NUMERIC_WIDTH) << right << "B" << - setw(NUMERIC_WIDTH) << right << "C" << - setw(NUMERIC_WIDTH) << right << "D" << - setw(NUMERIC_WIDTH) << right << "E" << - setw(NUMERIC_WIDTH) << right << "G" << - setw(NUMERIC_WIDTH) << right << "H" << - setw(NUMERIC_WIDTH) << right << "I" << - setw(NUMERIC_WIDTH) << right << "J" << - setw(NUMERIC_WIDTH) << right << "K" << - setw(NUMERIC_WIDTH) << right << "L" << - setw(NUMERIC_WIDTH) << right << "M" << - setw(NUMERIC_WIDTH) << right << "P" << - setw(NUMERIC_WIDTH) << right << "Q" << - setw(NUMERIC_WIDTH) << right << "R" << - setw(NUMERIC_WIDTH) << right << "S" << - setw(NUMERIC_WIDTH) << right << "V" << - setw(NUMERIC_WIDTH) << right << "X" << - setw(NUMERIC_WIDTH) << right << "Y" << - setw(NUMERIC_WIDTH) << right << "Z" << + stream << std::endl << header << std::endl; + stream << "------------------------------------------" << std::endl << std::endl; + + stream << std::setw(STATION) << std::left << "Station" << + std::setw(NUMERIC_WIDTH) << std::right << "A" << + std::setw(NUMERIC_WIDTH) << std::right << "B" << + std::setw(NUMERIC_WIDTH) << std::right << "C" << + std::setw(NUMERIC_WIDTH) << std::right << "D" << + std::setw(NUMERIC_WIDTH) << std::right << "E" << + std::setw(NUMERIC_WIDTH) << std::right << "G" << + std::setw(NUMERIC_WIDTH) << std::right << "H" << + std::setw(NUMERIC_WIDTH) << std::right << "I" << + std::setw(NUMERIC_WIDTH) << std::right << "J" << + std::setw(NUMERIC_WIDTH) << std::right << "K" << + std::setw(NUMERIC_WIDTH) << std::right << "L" << + std::setw(NUMERIC_WIDTH) << std::right << "M" << + std::setw(NUMERIC_WIDTH) << std::right << "P" << + std::setw(NUMERIC_WIDTH) << std::right << "Q" << + std::setw(NUMERIC_WIDTH) << std::right << "R" << + std::setw(NUMERIC_WIDTH) << std::right << "S" << + std::setw(NUMERIC_WIDTH) << std::right << "V" << + std::setw(NUMERIC_WIDTH) << std::right << "X" << + std::setw(NUMERIC_WIDTH) << std::right << "Y" << + std::setw(NUMERIC_WIDTH) << std::right << "Z" << // Total - setw(STAT) << right << "Total" << - endl; + std::setw(STAT) << std::right << "Total" << + std::endl; MsrToStnSummaryHeaderLine(stream); diff --git a/dynadjust/include/measurement_types/dnamsrtally.cpp b/dynadjust/include/measurement_types/dnamsrtally.cpp index e630769d..793c0c43 100644 --- a/dynadjust/include/measurement_types/dnamsrtally.cpp +++ b/dynadjust/include/measurement_types/dnamsrtally.cpp @@ -61,9 +61,9 @@ void MsrTally::FillMsrList(vchar& msr_list) msr_list.push_back('Z'); // Vertical angle } -string MsrTally::GetMsrName(const char& c) +std::string MsrTally::GetMsrName(const char& c) { - return measurement_name(c); + return measurement_name(c); } @@ -173,169 +173,169 @@ UINT32 MsrTally::TotalCount() { return totalCount=A+B+C+D+E+G+H+I+J+K+L+M+P+Q+R+S+V+X+Y+Z; } -void MsrTally::coutSummary(ostream &os, const string& title) +void MsrTally::coutSummary(std::ostream &os, const std::string& title) { // Print title - os << title << " " << TotalCount() << " measurements:" << endl; + os << title << " " << TotalCount() << " measurements:" << std::endl; UINT32 i, w(PRINT_VAR_PAD+NUMERIC_WIDTH); // Print line os << " "; for (i=0; i > +// std::vector< boost::shared_ptr > void MsrTally::CreateTally(const vdnaMsrPtr& vMeasurements) { initialise(); @@ -579,7 +579,7 @@ void MsrTally::IncrementMsrType(const char& msrType, const UINT32& count) } -// vector +// std::vector void MsrTally::CreateTally(const vmsr_t& vMeasurements, const vUINT32& CML) { initialise(); @@ -656,7 +656,7 @@ void MsrTally::CreateTally(const vmsr_t& vMeasurements, const vUINT32& CML) TotalCount(); } -// vector +// std::vector UINT32 MsrTally::CreateTally(const vmsr_t& vMeasurements, bool countValidOnly) { initialise(); diff --git a/dynadjust/include/measurement_types/dnastation.cpp b/dynadjust/include/measurement_types/dnastation.cpp index 4c5e052b..8a4eb2de 100644 --- a/dynadjust/include/measurement_types/dnastation.cpp +++ b/dynadjust/include/measurement_types/dnastation.cpp @@ -24,7 +24,6 @@ #include #include -using namespace std; using namespace dynadjust::epsg; using namespace dynadjust::datum_parameters; using namespace dynadjust::exception; @@ -105,7 +104,7 @@ CAStationList& CAStationList::operator =(CAStationList&& rhs) //// -CDnaStation::CDnaStation(const string& referenceframe, const string& epoch) +CDnaStation::CDnaStation(const std::string& referenceframe, const std::string& epoch) : m_strName(""), m_strOriginalName("") , m_dXAxis(0.), m_dYAxis(0.), m_dZAxis(0.), m_dHeight(0.) , m_dStdDevX(0.), m_dStdDevY(0.), m_dStdDevZ(0.), m_dStdDevHt(0.) @@ -119,7 +118,7 @@ CDnaStation::CDnaStation(const string& referenceframe, const string& epoch) , m_referenceFrame(referenceframe), m_epoch(epoch) , m_constraintType(free_3D) { - m_epsgCode = epsgStringFromName(referenceframe); + m_epsgCode = epsgStringFromName(referenceframe); } CDnaStation::~CDnaStation() @@ -170,10 +169,10 @@ CDnaStation::CDnaStation(const CDnaStation& newStation) m_constraintType = newStation.m_constraintType; } -CDnaStation::CDnaStation(const string& strName, const string& strConstraints, - const string& strType, const double& dXAxis, const double& dYAxis, const double& dZAxis, - const double& dHeight, const string& strHemisphereZone, const string& strDescription, - const string& strComment) +CDnaStation::CDnaStation(const std::string& strName, const std::string& strConstraints, + const std::string& strType, const double& dXAxis, const double& dYAxis, const double& dZAxis, + const double& dHeight, const std::string& strHemisphereZone, const std::string& strDescription, + const std::string& strComment) { m_strName = strName; @@ -264,7 +263,7 @@ CDnaStation& CDnaStation::operator =(const CDnaStation& rhs) } -void CDnaStation::SetConstraints(const string& sConstraints) +void CDnaStation::SetConstraints(const std::string& sConstraints) { // capture string, trim whitespace m_strConstraints = trimstr(sConstraints); @@ -286,29 +285,29 @@ void CDnaStation::SetConstraints(const string& sConstraints) m_cHtConstraint = (char)(*m_strConstraints.substr(2, 1).c_str()); // Free in all 3 dimensions - if (iequals(m_strConstraints, "FFF")) + if (boost::iequals(m_strConstraints, "FFF")) m_constraintType = free_3D; // Constrained in all 3 dimensions - else if (iequals(m_strConstraints, "CCC")) + else if (boost::iequals(m_strConstraints, "CCC")) m_constraintType = constrained_3D; // Horizontal or 2D adjustment - else if (iequals(m_strConstraints, "FFC")) + else if (boost::iequals(m_strConstraints, "FFC")) m_constraintType = free_2D; // Vertical or 1D adjustment - else if (iequals(m_strConstraints, "CCF")) + else if (boost::iequals(m_strConstraints, "CCF")) m_constraintType = free_1D; else m_constraintType = custom_constraint; } -void CDnaStation::SetCoordType(const string& sType) { +void CDnaStation::SetCoordType(const std::string& sType) { m_strType = trimstr(sType); m_ctTypeSupplied = m_ctType = GetMyCoordTypeC(); } // X, Easting, Latitude -void CDnaStation::SetXAxis(const string& str) +void CDnaStation::SetXAxis(const std::string& str) { switch (m_ctType) { @@ -325,7 +324,7 @@ void CDnaStation::SetXAxis(const string& str) // Y, Northing, Longitude -void CDnaStation::SetYAxis(const string& str) +void CDnaStation::SetYAxis(const std::string& str) { switch (m_ctType) { @@ -341,14 +340,14 @@ void CDnaStation::SetYAxis(const string& str) // Z -void CDnaStation::SetZAxis(const string& str) +void CDnaStation::SetZAxis(const std::string& str) { DoubleFromString(m_dZAxis, trimstr(str)); } // Height -void CDnaStation::SetHeight(const string& str) +void CDnaStation::SetHeight(const std::string& str) { if (GetMyCoordTypeC() == XYZ_type_i) SetZAxis(str); @@ -357,7 +356,7 @@ void CDnaStation::SetHeight(const string& str) } // Hemisphere zone -void CDnaStation::SetHemisphereZone(const string& sHemisphereZone) +void CDnaStation::SetHemisphereZone(const std::string& sHemisphereZone) { m_strHemisphereZone = trimstr(sHemisphereZone); if (m_strHemisphereZone.empty()) @@ -439,36 +438,36 @@ void CDnaStation::ReduceStations_XYZ(const CDnaEllipsoid* m_eEllipsoid, const CD m_strType = XYZ_type; } -bool CDnaStation::IsValidConstraint(const string& sConst) +bool CDnaStation::IsValidConstraint(const std::string& sConst) { - if (iequals(sConst, "CCC")) + if (boost::iequals(sConst, "CCC")) return true; - if (iequals(sConst, "CCF")) + if (boost::iequals(sConst, "CCF")) return true; - if (iequals(sConst, "CFF")) + if (boost::iequals(sConst, "CFF")) return true; - if (iequals(sConst, "FFF")) + if (boost::iequals(sConst, "FFF")) return true; - if (iequals(sConst, "FFC")) + if (boost::iequals(sConst, "FFC")) return true; - if (iequals(sConst, "FCC")) + if (boost::iequals(sConst, "FCC")) return true; - if (iequals(sConst, "FCF")) + if (boost::iequals(sConst, "FCF")) return true; - if (iequals(sConst, "CFC")) + if (boost::iequals(sConst, "CFC")) return true; return false; } -_COORD_TYPE_ CDnaStation::GetCoordTypeC(const string& sType) +_COORD_TYPE_ CDnaStation::GetCoordTypeC(const std::string& sType) { // case insensitive - if (iequals(sType, XYZ_type)) + if (boost::iequals(sType, XYZ_type)) return XYZ_type_i; - else if (iequals(sType, UTM_type)) + else if (boost::iequals(sType, UTM_type)) return UTM_type_i; // height is assumed to be orthometric - else if (iequals(sType, ENU_type)) + else if (boost::iequals(sType, ENU_type)) return ENU_type_i; // case sensitive @@ -480,9 +479,9 @@ _COORD_TYPE_ CDnaStation::GetCoordTypeC(const string& sType) return LLH_type_i; // orthometric height (default) // If this point is reached, sType is an unknown coordinate type, so throw! - stringstream ss; - ss << " '" << sType << "' is not a recognised coordinate type." << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << " '" << sType << "' is not a recognised coordinate type." << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); return LLH_type_i; } @@ -494,7 +493,7 @@ _COORD_TYPE_ CDnaStation::GetMyCoordTypeC() const } -_HEIGHT_SYSTEM_ CDnaStation::GetHeightSystemC(const string& sType) const +_HEIGHT_SYSTEM_ CDnaStation::GetHeightSystemC(const std::string& sType) const { if (sType.compare(ELLIPSOIDAL_type) == 0) return ELLIPSOIDAL_type_i; @@ -511,7 +510,7 @@ _HEIGHT_SYSTEM_ CDnaStation::GetMyHeightSystemC() const // SetHeightSystem called by void Height_pimpl::system(const ::std::string& system) // where system is an attribute of the element Height (either "ellipsoidal" or "orthometric") -void CDnaStation::SetHeightSystem(const string& sType) +void CDnaStation::SetHeightSystem(const std::string& sType) { SetHeightSystem(GetHeightSystemC(sType)); } @@ -539,13 +538,13 @@ void CDnaStation::SetHeightSystem(const HEIGHT_SYSTEM& type_i) } } -//void CDnaStation::coutStationData(ostream &os, ostream &os2, const UINT16& uType) const +//void CDnaStation::coutStationData(std::ostream &os, ostream &os2, const UINT16& uType) const //{ // UINT32 precision = 3; // if (m_ctType == LLH_type_i) // precision = 10; -// stringstream ss; -// string str; +// std::stringstream ss; +// std::string str; // size_t dot; // // switch (uType) @@ -553,27 +552,27 @@ void CDnaStation::SetHeightSystem(const HEIGHT_SYSTEM& type_i) // case DNA_COUT: // case GEOLAB_COUT: // -// os << "+ " << setw(16) << m_strName; -// os << setw(4) << m_strConstraints; -// os << setw(4) << m_strType; -// os << setw(20) << setprecision(precision) << fixed << (m_ctType == LLH_type_i ? RadtoDms(m_dXAxis): m_dXAxis); -// os << setw(20) << setprecision(precision) << fixed << (m_ctType == LLH_type_i ? RadtoDmsL(m_dYAxis): m_dYAxis); -// //os << setw(16) << vStations[s].GetZAxis(); -// os << setw(13) << setprecision(4) << fixed << m_dHeight; -// //os << setw(10) << vStations[s].GetRedHeight(); -// os << setw(5) << m_strHemisphereZone; -// os << setw(6) << m_lnameOrder; -// os << setw(19) << m_strDescription; -// //os << setw(10) << vStations[s].GetComment(); -// os << endl; +// os << "+ " << std::setw(16) << m_strName; +// os << std::setw(4) << m_strConstraints; +// os << std::setw(4) << m_strType; +// os << std::setw(20) << std::setprecision(precision) << std::fixed << (m_ctType == LLH_type_i ? RadtoDms(m_dXAxis): m_dXAxis); +// os << std::setw(20) << std::setprecision(precision) << std::fixed << (m_ctType == LLH_type_i ? RadtoDmsL(m_dYAxis): m_dYAxis); +// //os << std::setw(16) << vStations[s].GetZAxis(); +// os << std::setw(13) << std::setprecision(4) << std::fixed << m_dHeight; +// //os << std::setw(10) << vStations[s].GetRedHeight(); +// os << std::setw(5) << m_strHemisphereZone; +// os << std::setw(6) << m_lnameOrder; +// os << std::setw(19) << m_strDescription; +// //os << std::setw(10) << vStations[s].GetComment(); +// os << std::endl; // break; // case NEWGAN_COUT: -// os << setw(3) << "4"; -// os << right << setw(12) << m_strName; +// os << std::setw(3) << "4"; +// os << std::right << std::setw(12) << m_strName; // os << " "; -// os << left << setw(23) << m_strDescription.substr(0, 23); +// os << std::left << std::setw(23) << m_strDescription.substr(0, 23); // ss.str(""); -// ss << setprecision(precision) << fixed << (m_ctType == LLH_type_i ? RadtoDms(m_dXAxis): m_dXAxis); +// ss << std::setprecision(precision) << std::fixed << (m_ctType == LLH_type_i ? RadtoDms(m_dXAxis): m_dXAxis); // str = trimstr(ss.str()); // dot = str.find("."); // str.replace(dot, 1, " "); @@ -582,13 +581,13 @@ void CDnaStation::SetHeightSystem(const HEIGHT_SYSTEM& type_i) // { // str.replace(0, 1, " "); // replace negative sign // str = trimstr(str); -// os << left << "S" << setw(precision + 4) << right << str; +// os << std::left << "S" << std::setw(precision + 4) << std::right << str; // } // else -// os << left << "N" << setw(precision + 4) << right << str; +// os << std::left << "N" << std::setw(precision + 4) << std::right << str; // // ss.str(""); -// ss << setprecision(precision) << fixed << (m_ctType == LLH_type_i ? RadtoDmsL(m_dYAxis): m_dYAxis); +// ss << std::setprecision(precision) << std::fixed << (m_ctType == LLH_type_i ? RadtoDmsL(m_dYAxis): m_dYAxis); // str = trimstr(ss.str()); // dot = str.find("."); // str.replace(dot, 1, " "); @@ -597,25 +596,25 @@ void CDnaStation::SetHeightSystem(const HEIGHT_SYSTEM& type_i) // { // str.replace(0, 1, " "); // replace negative sign // str = trimstr(str); -// os << left << "W" << setw(precision + 5) << right << str; +// os << std::left << "W" << std::setw(precision + 5) << std::right << str; // } // else -// os << left << "E" << setw(precision + 5) << right << str; +// os << std::left << "E" << std::setw(precision + 5) << std::right << str; // // -// os << right << setw(9) << setprecision(3) << fixed << m_dHeight; -// os << endl; +// os << std::right << std::setw(9) << std::setprecision(3) << std::fixed << m_dHeight; +// os << std::endl; // break; // case GMT_OUT: -// os << setprecision(precision) << fixed << (m_ctType == LLH_type_i ? DegreesL(m_dYAxis): m_dYAxis); +// os << std::setprecision(precision) << std::fixed << (m_ctType == LLH_type_i ? DegreesL(m_dYAxis): m_dYAxis); // os << " "; -// os << setprecision(precision) << fixed << (m_ctType == LLH_type_i ? Degrees(m_dXAxis): m_dXAxis); -// os << endl; +// os << std::setprecision(precision) << std::fixed << (m_ctType == LLH_type_i ? Degrees(m_dXAxis): m_dXAxis); +// os << std::endl; // -// os2 << setprecision(precision) << fixed << (m_ctType == LLH_type_i ? DegreesL(m_dYAxis): m_dYAxis); +// os2 << std::setprecision(precision) << std::fixed << (m_ctType == LLH_type_i ? DegreesL(m_dYAxis): m_dYAxis); // os2 << " "; -// os2 << setprecision(precision) << fixed << (m_ctType == LLH_type_i ? Degrees(m_dXAxis): m_dXAxis); -// os2 << " 6 0 0 LM " << m_strName << endl; +// os2 << std::setprecision(precision) << std::fixed << (m_ctType == LLH_type_i ? Degrees(m_dXAxis): m_dXAxis); +// os2 << " 6 0 0 LM " << m_strName << std::endl; // break; // } // @@ -713,8 +712,8 @@ void CDnaStation::WriteDNAXMLStn(std::ofstream* dna_ofstream, { //m_ctTypeSupplied = LLh_type_i; - string hemisphereZone(m_strHemisphereZone); - string coordinateType(LLH_type); + std::string hemisphereZone(m_strHemisphereZone); + std::string coordinateType(LLH_type); switch (m_ctTypeSupplied) { @@ -768,7 +767,7 @@ void CDnaStation::WriteDNAXMLStn(std::ofstream* dna_ofstream, // Convert coordinates to cartesian or utm? // Convert radians values to degrees, minutes and seconds? - stringstream ss; + std::stringstream ss; double zone; switch (m_ctTypeSupplied) { @@ -781,7 +780,7 @@ void CDnaStation::WriteDNAXMLStn(std::ofstream* dna_ofstream, GeoToGrid(lat_east_x, lon_north_y, &lat_east_x_mod, &lon_north_y_mod, &zone, ellipsoid, projection, true); - ss << fixed << setprecision(0) << zone; + ss << std::fixed << std::setprecision(0) << zone; hemisphereZone = ss.str(); break; @@ -816,9 +815,9 @@ void CDnaStation::WriteDNAXMLStn(std::ofstream* dna_ofstream, } } -void CDnaStation::WriteDNAStn(std::ofstream* dna_ofstream, const string& coordinateType, +void CDnaStation::WriteDNAStn(std::ofstream* dna_ofstream, const std::string& coordinateType, const double& lat_east_x, const double& lon_north_y, const double& ht_zone_z, - string& hemisphereZone, const dna_stn_fields& dsw) + std::string& hemisphereZone, const dna_stn_fields& dsw) { UINT32 LEX_precision(4), LNY_precision(4), HZ_precision(4); @@ -832,25 +831,25 @@ void CDnaStation::WriteDNAStn(std::ofstream* dna_ofstream, const string& coordin break; } - (*dna_ofstream) << left << setw(dsw.stn_name) << m_strName; - (*dna_ofstream) << left << setw(dsw.stn_const) << m_strConstraints; + (*dna_ofstream) << std::left << std::setw(dsw.stn_name) << m_strName; + (*dna_ofstream) << std::left << std::setw(dsw.stn_const) << m_strConstraints; (*dna_ofstream) << " "; - (*dna_ofstream) << left << setw(dsw.stn_type) << coordinateType; - (*dna_ofstream) << right << setw(dsw.stn_e_phi_x) << setprecision(LEX_precision) << fixed << lat_east_x; - (*dna_ofstream) << right << setw(dsw.stn_n_lam_y) << setprecision(LNY_precision) << fixed << lon_north_y; - (*dna_ofstream) << right << setw(dsw.stn_ht_z) << setprecision(HZ_precision) << fixed << ht_zone_z; + (*dna_ofstream) << std::left << std::setw(dsw.stn_type) << coordinateType; + (*dna_ofstream) << std::right << std::setw(dsw.stn_e_phi_x) << std::setprecision(LEX_precision) << std::fixed << lat_east_x; + (*dna_ofstream) << std::right << std::setw(dsw.stn_n_lam_y) << std::setprecision(LNY_precision) << std::fixed << lon_north_y; + (*dna_ofstream) << std::right << std::setw(dsw.stn_ht_z) << std::setprecision(HZ_precision) << std::fixed << ht_zone_z; if (m_ctTypeSupplied == UTM_type_i) - (*dna_ofstream) << right << setw(dsw.stn_hemi_zo) << hemisphereZone; + (*dna_ofstream) << std::right << std::setw(dsw.stn_hemi_zo) << hemisphereZone; else - (*dna_ofstream) << right << setw(dsw.stn_hemi_zo) << " "; + (*dna_ofstream) << std::right << std::setw(dsw.stn_hemi_zo) << " "; (*dna_ofstream) << " "; - (*dna_ofstream) << left << m_strDescription << endl; + (*dna_ofstream) << std::left << m_strDescription << std::endl; } -void CDnaStation::WriteDynaMLStn(std::ofstream* xml_ofstream, const string& coordinateType, +void CDnaStation::WriteDynaMLStn(std::ofstream* xml_ofstream, const std::string& coordinateType, const double& lat_east_x, const double& lon_north_y, const double& ht_zone_z, - string& hemisphereZone) + std::string& hemisphereZone) { UINT32 LEX_precision(4), LNY_precision(4), HZ_precision(4); @@ -865,32 +864,32 @@ void CDnaStation::WriteDynaMLStn(std::ofstream* xml_ofstream, const string& coor break; } - (*xml_ofstream) << " " << endl; - (*xml_ofstream) << " " << m_strName << "" << endl; - (*xml_ofstream) << " " << m_strConstraints << "" << endl; - (*xml_ofstream) << " " << coordinateType << "" << endl; - (*xml_ofstream) << " " << endl; - (*xml_ofstream) << " " << m_strName << "" << endl; - (*xml_ofstream) << " " << setprecision(LEX_precision) << fixed << lat_east_x << "" << endl; - (*xml_ofstream) << " " << setprecision(LNY_precision) << fixed << lon_north_y << "" << endl; - (*xml_ofstream) << " " << setprecision(HZ_precision) << fixed << ht_zone_z << "" << endl; + (*xml_ofstream) << " " << std::endl; + (*xml_ofstream) << " " << m_strName << "" << std::endl; + (*xml_ofstream) << " " << m_strConstraints << "" << std::endl; + (*xml_ofstream) << " " << coordinateType << "" << std::endl; + (*xml_ofstream) << " " << std::endl; + (*xml_ofstream) << " " << m_strName << "" << std::endl; + (*xml_ofstream) << " " << std::setprecision(LEX_precision) << std::fixed << lat_east_x << "" << std::endl; + (*xml_ofstream) << " " << std::setprecision(LNY_precision) << std::fixed << lon_north_y << "" << std::endl; + (*xml_ofstream) << " " << std::setprecision(HZ_precision) << std::fixed << ht_zone_z << "" << std::endl; // Convert radians values to degrees, minutes and seconds if (m_ctTypeSupplied == UTM_type_i) - (*xml_ofstream) << " " << hemisphereZone << "" << endl; + (*xml_ofstream) << " " << hemisphereZone << "" << std::endl; - (*xml_ofstream) << " " << endl; - (*xml_ofstream) << " " << m_strDescription << "" << endl; - (*xml_ofstream) << " " << endl; + (*xml_ofstream) << " " << std::endl; + (*xml_ofstream) << " " << m_strDescription << "" << std::endl; + (*xml_ofstream) << " " << std::endl; } void CDnaStation::WriteGeoidfile(std::ofstream* geo_ofstream) { - (*geo_ofstream) << setw(44) << left << m_strName << - setw(15) << setprecision(3) << fixed << left << m_fgeoidSep << - setw(10) << setprecision(3) << fixed << right << m_dmeridianDef << - setw(10) << setprecision(3) << fixed << right << m_dverticalDef << endl; + (*geo_ofstream) << std::setw(44) << std::left << m_strName << + std::setw(15) << std::setprecision(3) << std::fixed << std::left << m_fgeoidSep << + std::setw(10) << std::setprecision(3) << std::fixed << std::right << m_dmeridianDef << + std::setw(10) << std::setprecision(3) << std::fixed << std::right << m_dverticalDef << std::endl; } @@ -945,10 +944,10 @@ void CDnaStation::SetStationRec(const station_t& stationRecord) m_epoch = stationRecord.epoch; m_epsgCode = stationRecord.epsgCode; - m_referenceFrame = datumFromEpsgCode(LongFromString(m_epsgCode)); + m_referenceFrame = datumFromEpsgCode(LongFromString(m_epsgCode)); } -string CDnaStation::CoordinateName(const char& c) +std::string CDnaStation::CoordinateName(const char& c) { switch (c) { diff --git a/dynadjust/include/measurement_types/dnastation.hpp b/dynadjust/include/measurement_types/dnastation.hpp index 8b025073..b68fefb7 100644 --- a/dynadjust/include/measurement_types/dnastation.hpp +++ b/dynadjust/include/measurement_types/dnastation.hpp @@ -55,8 +55,6 @@ #include -using namespace std; -using namespace boost; using namespace dynadjust::datum_parameters; #define XML_INDENT_1 " " @@ -70,15 +68,15 @@ class CDnaStation; // station types typedef boost::shared_ptr dnaStnPtr; -typedef vector vdnaStnPtr, * pvdnaStnPtr; // vector of dnaStnPtr +typedef std::vector vdnaStnPtr, * pvdnaStnPtr; // vector of dnaStnPtr typedef vdnaStnPtr::iterator _it_vdnastnptr; typedef vdnaStnPtr::const_iterator _it_vdnastnptr_const; -typedef pair<_it_vdnastnptr, _it_vdnastnptr> it_pair_dnastnptr; +typedef std::pair<_it_vdnastnptr, _it_vdnastnptr> it_pair_dnastnptr; -typedef vector vASL, *pvASL; +typedef std::vector vASL, *pvASL; typedef vASL::iterator _it_vasl; typedef boost::shared_ptr ASLPtr; -typedef vector vASLPtr, *pvASLPtr; +typedef std::vector vASLPtr, *pvASLPtr; #ifdef _MSC_VER @@ -154,9 +152,9 @@ class CDnaStation #endif { public: - CDnaStation(const string& referenceframe, const string& epoch); + CDnaStation(const std::string& referenceframe, const std::string& epoch); CDnaStation(const CDnaStation&); - CDnaStation(const string& strName, const string& strConstraints, const string& strType, const double& dXAxis, const double& dYAxis, const double& dZAxis, const double& dHeight, const string& strHemisphereZone, const string& strDescription, const string& strComment); + CDnaStation(const std::string& strName, const std::string& strConstraints, const std::string& strType, const double& dXAxis, const double& dYAxis, const double& dZAxis, const double& dHeight, const std::string& strHemisphereZone, const std::string& strDescription, const std::string& strComment); virtual ~CDnaStation(); CDnaStation& operator=(const CDnaStation& rhs); @@ -167,12 +165,12 @@ class CDnaStation friend bool operator<(const CDnaStation& left, const CDnaStation& right); friend bool operator<(const boost::shared_ptr& left, const boost::shared_ptr& right); - inline int CompareStationName(const string& s) { return m_strName.compare(s); } - inline string GetName() const { return m_strName; } - inline string GetOriginalName() const { return m_strOriginalName; } - inline string GetConstraints() const { return m_strConstraints; } + inline int CompareStationName(const std::string& s) { return m_strName.compare(s); } + inline std::string GetName() const { return m_strName; } + inline std::string GetOriginalName() const { return m_strOriginalName; } + inline std::string GetConstraints() const { return m_strConstraints; } inline CONSTRAINT_TYPE GetConstraintType() const { return m_constraintType; } - inline string GetCoordType() const { return m_strType; } + inline std::string GetCoordType() const { return m_strType; } inline double GetXAxis() const { return m_dXAxis; } // X, Easting, Latitude inline double GetYAxis() const { return m_dYAxis; } // Y, Northing, Longitude @@ -182,9 +180,9 @@ class CDnaStation inline double GetEasting() const { return m_dXAxis; } inline double GetNorthing() const { return m_dYAxis; } inline double GetHeight() const { return m_dHeight; } - inline string GetHemisphereZone() const { return m_strHemisphereZone; } - inline string GetDescription() const { return m_strDescription; } - inline string GetComment() const { return m_strComment; } + inline std::string GetHemisphereZone() const { return m_strHemisphereZone; } + inline std::string GetDescription() const { return m_strDescription; } + inline std::string GetComment() const { return m_strComment; } inline double GetcurrentLatitude() const { return m_dcurrentLatitude; } inline double GetcurrentLongitude() const { return m_dcurrentLongitude; } @@ -201,23 +199,23 @@ class CDnaStation inline bool IsUnused() const { return m_unusedStation; } inline bool IsNotUnused() const { return m_unusedStation == false; } - static bool IsValidConstraint(const string& sConst); - static _COORD_TYPE_ GetCoordTypeC(const string& sType); + static bool IsValidConstraint(const std::string& sConst); + static _COORD_TYPE_ GetCoordTypeC(const std::string& sType); _COORD_TYPE_ GetMyCoordTypeC() const; - _HEIGHT_SYSTEM_ GetHeightSystemC(const string& sType) const; + _HEIGHT_SYSTEM_ GetHeightSystemC(const std::string& sType) const; _HEIGHT_SYSTEM_ GetMyHeightSystemC() const; inline _HEIGHT_SYSTEM_ GetMyHeightSystem() const { return m_htType; } - void SetHeightSystem(const string& sType); + void SetHeightSystem(const std::string& sType); void SetHeightSystem(const _HEIGHT_SYSTEM_& type_i); void SetStationRec(const station_t& stationRecord); - void SetXAxis(const string& str); - void SetYAxis(const string& str); - void SetZAxis(const string& str); - void SetHeight(const string& str); - void SetCoordType(const string& sType); + void SetXAxis(const std::string& str); + void SetYAxis(const std::string& str); + void SetZAxis(const std::string& str); + void SetHeight(const std::string& str); + void SetCoordType(const std::string& sType); void ReduceStations_LLH(const CDnaEllipsoid* m_eEllipsoid, const CDnaProjection* m_pProjection); void ReduceStations_XYZ(const CDnaEllipsoid* m_eEllipsoid, const CDnaProjection* m_pProjection); @@ -231,12 +229,12 @@ class CDnaStation inline void SetHeight_d(const double& dHeight) { m_dHeight = dHeight; } inline void SetcurrentHeight_d(const double& dHeight) { m_dcurrentHeight = dHeight; } - inline void SetName(const string& sName) { m_strName = trimstr(sName); } - inline void SetOriginalName(const string& sName) { m_strOriginalName = trimstr(sName); } + inline void SetName(const std::string& sName) { m_strName = trimstr(sName); } + inline void SetOriginalName(const std::string& sName) { m_strOriginalName = trimstr(sName); } inline void SetOriginalName() { m_strOriginalName = m_strName; } - void SetHemisphereZone(const string& sHemisphereZone); - inline void SetDescription(const string& sDescription) { m_strDescription = trimstr(sDescription); } - inline void SetComment(const string& sComment) { m_strComment = trimstr(sComment); } + void SetHemisphereZone(const std::string& sHemisphereZone); + inline void SetDescription(const std::string& sDescription) { m_strDescription = trimstr(sDescription); } + inline void SetComment(const std::string& sComment) { m_strComment = trimstr(sComment); } inline void SetfileOrder(const UINT32& order) { m_lfileOrder = order; } inline void SetnameOrder(const UINT32& order) { m_lnameOrder = order; } @@ -248,18 +246,18 @@ class CDnaStation inline void SetStationUnused() { m_unusedStation = true; } inline void SetStationUse(bool use) { m_unusedStation = use; } - void SetConstraints(const string& str); + void SetConstraints(const std::string& str); - void SetXAxisStdDev(const string& str); - void SetYAxisStdDev(const string& str); - void SetHeightStdDev(const string& str); + void SetXAxisStdDev(const std::string& str); + void SetYAxisStdDev(const std::string& str); + void SetHeightStdDev(const std::string& str); void PrepareStnData(double& lat_east_x, double& lon_north_y, double& ht_zone_z, - string& hemisphereZone, string& coordinateType, + std::string& hemisphereZone, std::string& coordinateType, UINT32& LEX_precision, UINT32& LNY_precision, UINT32& HZ_precision, const CDnaEllipsoid* ellipsoid, const CDnaProjection* projection, bool writeCurrentEstimates); - //void coutStationData(ostream &os, ostream &os2, const UINT16& uType = 0) const; + //void coutStationData(std::ostream &os, ostream &os2, const UINT16& uType = 0) const; void WriteBinaryStn(std::ofstream* binary_stream, const UINT16 bUnused=0); void WriteDNAXMLStnCurrentEstimates(std::ofstream* dna_ofstream, @@ -275,30 +273,30 @@ class CDnaStation const double& lat_east_x, const double& lon_north_y, const double& ht_zone_z, INPUT_FILE_TYPE t, const dna_stn_fields* dsw=0); - void WriteDNAStn(std::ofstream* dna_ofstream, const string& coordinateType, + void WriteDNAStn(std::ofstream* dna_ofstream, const std::string& coordinateType, const double& lat_east_x, const double& lon_north_y, const double& ht_zone_z, - string& hemisphereZone, const dna_stn_fields& dsw); + std::string& hemisphereZone, const dna_stn_fields& dsw); - void WriteDynaMLStn(std::ofstream* xml_ofstream, const string& coordinateType, + void WriteDynaMLStn(std::ofstream* xml_ofstream, const std::string& coordinateType, const double& lat_east_x, const double& lon_north_y, const double& ht_zone_z, - string& hemisphereZone); + std::string& hemisphereZone); void WriteGeoidfile(std::ofstream* binary_stream); - static string CoordinateName(const char& c); + static std::string CoordinateName(const char& c); - inline string GetReferenceFrame() const { return m_referenceFrame; } - inline string GetEpoch() const { return m_epoch; } + inline std::string GetReferenceFrame() const { return m_referenceFrame; } + inline std::string GetEpoch() const { return m_epoch; } - inline void SetReferenceFrame(const string& r) { m_referenceFrame = trimstr(r); } - inline void SetEpoch(const string& e) { m_epoch = trimstr(e); } - inline void SetEpsg(const string& e) { m_epsgCode = trimstr(e); } + inline void SetReferenceFrame(const std::string& r) { m_referenceFrame = trimstr(r); } + inline void SetEpoch(const std::string& e) { m_epoch = trimstr(e); } + inline void SetEpsg(const std::string& e) { m_epsgCode = trimstr(e); } - string m_strName; + std::string m_strName; protected: - string m_strOriginalName; + std::string m_strOriginalName; double m_dXAxis; double m_dYAxis; @@ -310,11 +308,11 @@ class CDnaStation double m_dStdDevZ; double m_dStdDevHt; - string m_strConstraints; - string m_strType; - string m_strHemisphereZone; - string m_strDescription; - string m_strComment; + std::string m_strConstraints; + std::string m_strType; + std::string m_strHemisphereZone; + std::string m_strDescription; + std::string m_strComment; char m_cLatConstraint; char m_cLonConstraint; @@ -335,9 +333,9 @@ class CDnaStation UINT32 m_zone; bool m_unusedStation; - string m_referenceFrame; - string m_epsgCode; - string m_epoch; + std::string m_referenceFrame; + std::string m_epsgCode; + std::string m_epoch; CONSTRAINT_TYPE m_constraintType; }; diff --git a/dynadjust/include/measurement_types/dnastntally.cpp b/dynadjust/include/measurement_types/dnastntally.cpp index 08c1d872..d6a1e89c 100644 --- a/dynadjust/include/measurement_types/dnastntally.cpp +++ b/dynadjust/include/measurement_types/dnastntally.cpp @@ -73,65 +73,65 @@ UINT32 StnTally::TotalCount() { return CCC + FFF + CCF + CFF + FFC + FCC + CFC + FCF; } -void StnTally::addstation(const string& constraint) { +void StnTally::addstation(const std::string& constraint) { - if (iequals(constraint, "CCC")) + if (boost::iequals(constraint, "CCC")) CCC += 1; - else if (iequals(constraint, "FFF")) + else if (boost::iequals(constraint, "FFF")) FFF += 1; - else if (iequals(constraint, "CCF")) + else if (boost::iequals(constraint, "CCF")) CCF += 1; - else if (iequals(constraint, "CFF")) + else if (boost::iequals(constraint, "CFF")) CFF += 1; - else if (iequals(constraint, "FFC")) + else if (boost::iequals(constraint, "FFC")) FFC += 1; - else if (iequals(constraint, "FCC")) + else if (boost::iequals(constraint, "FCC")) FCC += 1; - else if (iequals(constraint, "CFC")) + else if (boost::iequals(constraint, "CFC")) CFC += 1; - else if (iequals(constraint, "FCF")) + else if (boost::iequals(constraint, "FCF")) FCF += 1; } -void StnTally::removestation(const string& constraint) { +void StnTally::removestation(const std::string& constraint) { - if (iequals(constraint, "CCC")) + if (boost::iequals(constraint, "CCC")) { if (CCC > 0) CCC -= 1; } - else if (iequals(constraint, "FFF")) + else if (boost::iequals(constraint, "FFF")) { if (FFF > 0) FFF -= 1; } - else if (iequals(constraint, "CCF")) + else if (boost::iequals(constraint, "CCF")) { if (CCF > 0) CCF -= 1; } - else if (iequals(constraint, "CFF")) + else if (boost::iequals(constraint, "CFF")) { if (CFF > 0) CFF -= 1; } - else if (iequals(constraint, "FFC")) + else if (boost::iequals(constraint, "FFC")) { if (FFC > 0) FFC -= 1; } - else if (iequals(constraint, "FCC")) + else if (boost::iequals(constraint, "FCC")) { if (FCC > 0) FCC -= 1; } - else if (iequals(constraint, "CFC")) + else if (boost::iequals(constraint, "CFC")) { if (CFC > 0) CFC -= 1; } - else if (iequals(constraint, "FCF")) + else if (boost::iequals(constraint, "FCF")) { if (FCF > 0) FCF -= 1; @@ -139,36 +139,36 @@ void StnTally::removestation(const string& constraint) { } -void StnTally::coutSummary(ostream &os, const string& title) +void StnTally::coutSummary(std::ostream &os, const std::string& title) { // Print title - os << title << " " << TotalCount() << " stations:" << endl; + os << title << " " << TotalCount() << " stations:" << std::endl; UINT32 i, w(PRINT_VAR_PAD+NUMERIC_WIDTH); // Print line os << " "; for (i=0; i -using namespace std; - namespace dynadjust { namespace measurements { class StnTally { @@ -47,9 +45,9 @@ class StnTally { const StnTally operator-(const StnTally& rhs) const; UINT32 TotalCount(); - void addstation(const string& constraint); - void removestation(const string& constraint); - void coutSummary(ostream &os, const string& title); + void addstation(const std::string& constraint); + void removestation(const std::string& constraint); + void coutSummary(std::ostream &os, const std::string& title); void CreateTally(const vdnaStnPtr& vStations); UINT32 CCC, FFF, CCF, CFF, FFC, FCC, CFC, FCF; diff --git a/dynadjust/include/memory/dnafile_mapping.cpp b/dynadjust/include/memory/dnafile_mapping.cpp index 8f3e24e1..107578f1 100644 --- a/dynadjust/include/memory/dnafile_mapping.cpp +++ b/dynadjust/include/memory/dnafile_mapping.cpp @@ -71,9 +71,9 @@ block_map_t::block_map_t(const block_map_t &p) void block_map_t::MapRegion(FileMapPtr file_map_ptr) { region_ptr_.reset( - new mapped_region( + new boost::interprocess::mapped_region( *file_map_ptr, - read_write, + boost::interprocess::read_write, region_offset_, data_size_ ) @@ -89,18 +89,18 @@ vmat_file_map::vmat_file_map() } -vmat_file_map::vmat_file_map(const string& filePath, bool remove_mapped_file) +vmat_file_map::vmat_file_map(const std::string& filePath, bool remove_mapped_file) : filePath_(filePath), remove_mapped_file_(remove_mapped_file) { - file_map_ptr_.reset(new file_mapping(filePath_.c_str(), read_write)); + file_map_ptr_.reset(new boost::interprocess::file_mapping(filePath_.c_str(), boost::interprocess::read_write)); } vmat_file_map::~vmat_file_map() { if (remove_mapped_file_) - if (exists(filePath_)) - file_mapping::remove(filePath_.c_str()); + if (boost::filesystem::exists(filePath_)) + boost::interprocess::file_mapping::remove(filePath_.c_str()); } @@ -116,7 +116,7 @@ void vmat_file_map::addblockMapRegion(const block_map_t& map) } -void vmat_file_map::setnewFilePath(const string& filePath, bool remove_mapped_file) +void vmat_file_map::setnewFilePath(const std::string& filePath, bool remove_mapped_file) { filePath_ = filePath; remove_mapped_file_ = remove_mapped_file; @@ -125,7 +125,7 @@ void vmat_file_map::setnewFilePath(const string& filePath, bool remove_mapped_fi void vmat_file_map::CreateFileMapping() { - file_map_ptr_.reset(new file_mapping(filePath_.c_str(), read_write)); + file_map_ptr_.reset(new boost::interprocess::file_mapping(filePath_.c_str(), boost::interprocess::read_write)); } diff --git a/dynadjust/include/memory/dnafile_mapping.hpp b/dynadjust/include/memory/dnafile_mapping.hpp index d544fe34..cb9748bf 100644 --- a/dynadjust/include/memory/dnafile_mapping.hpp +++ b/dynadjust/include/memory/dnafile_mapping.hpp @@ -36,17 +36,11 @@ #include #include -using namespace std; -using namespace boost; -using namespace boost::filesystem; -using namespace boost::interprocess; - - namespace dynadjust { namespace memory { -typedef boost::shared_ptr MapRegPtr; -typedef boost::shared_ptr FileMapPtr; +typedef boost::shared_ptr MapRegPtr; +typedef boost::shared_ptr FileMapPtr; class block_map_t { @@ -78,7 +72,7 @@ class block_map_t MapRegPtr region_ptr_; // shared pointer to the region }; -typedef vector vblock_map; +typedef std::vector vblock_map; typedef vblock_map::iterator _it_block_map; // class to hold addresses and sizes for all matrices @@ -86,13 +80,13 @@ typedef vblock_map::iterator _it_block_map; class vmat_file_map { public: vmat_file_map(); - vmat_file_map(const string& filePath, bool remove_mapped_file); + vmat_file_map(const std::string& filePath, bool remove_mapped_file); ~vmat_file_map(); void reserveblockMapRegions(const UINT32& size); void addblockMapRegion(const block_map_t& map); - void setnewFilePath(const string& filePath, bool remove_mapped_file); + void setnewFilePath(const std::string& filePath, bool remove_mapped_file); void CreateFileMapping(); void MapRegion(const UINT32 block); @@ -105,12 +99,12 @@ class vmat_file_map { vmat_file_map& operator=(const vmat_file_map&); // '' '' vblock_map vblockMapRegions_; - string filePath_; + std::string filePath_; FileMapPtr file_map_ptr_; bool remove_mapped_file_; }; -typedef vector vvmatf_map; +typedef std::vector vvmatf_map; typedef vvmatf_map::iterator _it_vvmatf_map; diff --git a/dynadjust/include/memory/dnamemory_handler.hpp b/dynadjust/include/memory/dnamemory_handler.hpp index 6f33b4f1..e946a51d 100644 --- a/dynadjust/include/memory/dnamemory_handler.hpp +++ b/dynadjust/include/memory/dnamemory_handler.hpp @@ -43,18 +43,16 @@ typedef enum _MEM_UNIT_ { // the following will be truncated //const UINT32 TERABYTE_SIZE = 1099511627776; // 2 ^ 40 -using namespace std; - namespace dynadjust { namespace memory { class new_handler_holder { public: - explicit new_handler_holder(new_handler nh) // acquire current + explicit new_handler_holder(std::new_handler nh) // acquire current : _handler(nh) {} // new handler - ~new_handler_holder() { set_new_handler(_handler); } // release it + ~new_handler_holder() { std::set_new_handler(_handler); } // release it private: - new_handler _handler; + std::new_handler _handler; new_handler_holder(const new_handler_holder&); // prevent copying new_handler_holder& operator=(const new_handler_holder&); // '' '' }; @@ -62,17 +60,17 @@ class new_handler_holder template class new_handler_support { public: - static new_handler set_new_handler(new_handler p) noexcept; + static std::new_handler set_new_handler(std::new_handler p) noexcept; static void* operator new(size_t size) noexcept(false); private: - static new_handler _current_handler; + static std::new_handler _current_handler; }; template -new_handler new_handler_support::set_new_handler(new_handler p) noexcept +std::new_handler new_handler_support::set_new_handler(std::new_handler p) noexcept { - new_handler old_handler = _current_handler; + std::new_handler old_handler = _current_handler; _current_handler = p; return old_handler; } @@ -80,13 +78,13 @@ new_handler new_handler_support::set_new_handler(new_handler p) noexcept template void* new_handler_support::operator new(size_t size) noexcept(false) { - new_handler_holder h(set_new_handler(_current_handler)); + new_handler_holder h(std::set_new_handler(_current_handler)); return ::operator new(size); } // this initialises each _current_handler to null template -new_handler new_handler_support::_current_handler = 0; +std::new_handler new_handler_support::_current_handler = 0; } // namespace memory } // namespace dynadjust diff --git a/dynadjust/include/memory/managed_mapped_file_test.cpp b/dynadjust/include/memory/managed_mapped_file_test.cpp index f0b3f6ec..7d5757bc 100644 --- a/dynadjust/include/memory/managed_mapped_file_test.cpp +++ b/dynadjust/include/memory/managed_mapped_file_test.cpp @@ -16,8 +16,6 @@ #include #include "get_process_id_name.hpp" -using namespace boost::interprocess; - int main () { const int FileSize = 65536*10; diff --git a/dynadjust/include/parameters/dnadatum.cpp b/dynadjust/include/parameters/dnadatum.cpp index 6012a2a2..a5258a50 100644 --- a/dynadjust/include/parameters/dnadatum.cpp +++ b/dynadjust/include/parameters/dnadatum.cpp @@ -32,7 +32,7 @@ namespace datum_parameters { CDnaDatum::CDnaDatum(void) // "GDA2020 (3D)" - geographic : epsgCode_(DEFAULT_EPSG_U) - , epoch_(date(2020, 1, 1)) + , epoch_(boost::gregorian::date(2020, 1, 1)) , datumType_(STATIC_DATUM) , datumName_(DEFAULT_DATUM) { @@ -45,19 +45,19 @@ CDnaDatum::CDnaDatum(const UINT32& epsgCode) SetDatum(epsgCode); } -CDnaDatum::CDnaDatum(const UINT32& epsgCode, const date& epoch) +CDnaDatum::CDnaDatum(const UINT32& epsgCode, const boost::gregorian::date& epoch) { SetDatum(epsgCode, epoch); } -CDnaDatum::CDnaDatum(const string& epsgCode, const string& epoch) +CDnaDatum::CDnaDatum(const std::string& epsgCode, const std::string& epoch) { SetDatumFromEpsg(epsgCode, epoch); } //// datumName corresponds to the name given in epsg //// epoch is a space delimited string: YYY MM DD -//CDnaDatum::CDnaDatum(const string& datumName, const string& epoch) +//CDnaDatum::CDnaDatum(const std::string& datumName, const std::string& epoch) //{ // datumName_ = datumName; // SetDatumFromName(datumName, epoch); @@ -117,38 +117,38 @@ void CDnaDatum::initialiseDatumFromEpsgCode() datumType_ = DYNAMIC_DATUM; // Set name - datumName_ = datumFromEpsgCode(epsgCode_); + datumName_ = datumFromEpsgCode(epsgCode_); } // returns: // - dd.mm.yyyy for datums that have a reference epoch // - "" for ensembles that do not have an epoch -string CDnaDatum::GetEpoch_s() const +std::string CDnaDatum::GetEpoch_s() const { if (isEpsgWGS84Ensemble(epsgCode_) && isTimeImmemorial(epoch_)) return ""; else if (isTimeImmemorial(epoch_)) return ""; - return stringFromDate(epoch_); + return stringFromDate(epoch_); } -string CDnaDatum::GetEpsgCode_s() const +std::string CDnaDatum::GetEpsgCode_s() const { char epsgCode[8]; sprintf(epsgCode, "%d", epsgCode_); - return string(epsgCode); + return std::string(epsgCode); } void CDnaDatum::SetDatum(const UINT32& epsgCode) { epsgCode_ = epsgCode; - epoch_ = dateFromString(referenceepochFromEpsgCode(epsgCode_)); + epoch_ = dateFromString(referenceepochFromEpsgCode(epsgCode_)); // set datum parameters using epsg code initialiseDatumFromEpsgCode(); } -void CDnaDatum::SetDatum(const UINT32& epsgCode, const date& epoch) +void CDnaDatum::SetDatum(const UINT32& epsgCode, const boost::gregorian::date& epoch) { epsgCode_ = epsgCode; epoch_ = epoch; @@ -157,42 +157,42 @@ void CDnaDatum::SetDatum(const UINT32& epsgCode, const date& epoch) initialiseDatumFromEpsgCode(); } -void CDnaDatum::SetDatum(const string& epsgCode) +void CDnaDatum::SetDatum(const std::string& epsgCode) { // Reuse SetDatum(LongFromString(trimstr(epsgCode))); } -//void CDnaDatum::SetDatum(const string& epsgCode, const date& epoch) +//void CDnaDatum::SetDatum(const std::string& epsgCode, const boost::gregorian::date& epoch) //{ // // Reuse // SetDatum(LongFromString(trimstr(epsgCode)), epoch); //} -void CDnaDatum::SetEpoch(const string& epoch) +void CDnaDatum::SetEpoch(const std::string& epoch) { // Parse epoch if (epoch.empty()) { if (isEpsgWGS84Ensemble(epsgCode_)) - epoch_ = timeImmemorial(); + epoch_ = timeImmemorial(); else - epoch_ = dateFromString(referenceepochFromEpsgCode(epsgCode_)); + epoch_ = dateFromString(referenceepochFromEpsgCode(epsgCode_)); } else - epoch_ = dateFromString(epoch); + epoch_ = dateFromString(epoch); } //void CDnaDatum::SetEpoch(const double& decimal_year) //{ -// epoch_ = dateFromDouble_doy_year(decimal_year); +// epoch_ = dateFromDouble_doy_year(decimal_year); // //} -void CDnaDatum::SetDatumFromName(const string& datumName, const string& epoch) +void CDnaDatum::SetDatumFromName(const std::string& datumName, const std::string& epoch) { // Get epsg code - epsgCode_ = epsgCodeFromName(datumName); + epsgCode_ = epsgCodeFromName(datumName); // Parse epoch SetEpoch(epoch); @@ -201,7 +201,7 @@ void CDnaDatum::SetDatumFromName(const string& datumName, const string& epoch) initialiseDatumFromEpsgCode(); } -void CDnaDatum::SetDatumFromEpsg(const string& epsgCode, const string& epoch) +void CDnaDatum::SetDatumFromEpsg(const std::string& epsgCode, const std::string& epoch) { // Get epsg code epsgCode_ = LongFromString(trimstr(epsgCode)); diff --git a/dynadjust/include/parameters/dnadatum.hpp b/dynadjust/include/parameters/dnadatum.hpp index 797fadbd..b1b557c7 100644 --- a/dynadjust/include/parameters/dnadatum.hpp +++ b/dynadjust/include/parameters/dnadatum.hpp @@ -36,11 +36,6 @@ #include #include -using namespace std; -using namespace boost; -using namespace boost::gregorian; -using namespace boost::local_time; - #include #include #include @@ -56,8 +51,8 @@ class CDnaDatum CDnaDatum(void); CDnaDatum(const UINT32& epsgCode); - CDnaDatum(const UINT32& epsgCode, const date& epoch); - CDnaDatum(const string& epsgCode, const string& epoch); + CDnaDatum(const UINT32& epsgCode, const boost::gregorian::date& epoch); + CDnaDatum(const std::string& epsgCode, const std::string& epoch); virtual inline ~CDnaDatum(void) {} private: @@ -78,26 +73,26 @@ class CDnaDatum inline CDnaEllipsoid GetEllipsoid() const { return ellipsoid_; } inline const CDnaEllipsoid* GetEllipsoidRef() const { return &ellipsoid_; } - string GetName() const { return datumName_; } - string GetEpsgCode_s() const; - string GetEpoch_s() const; + std::string GetName() const { return datumName_; } + std::string GetEpsgCode_s() const; + std::string GetEpoch_s() const; inline UINT32 GetEpsgCode_i() const { return epsgCode_; } - inline date GetEpoch() const { return epoch_; } + inline boost::gregorian::date GetEpoch() const { return epoch_; } inline DATUM_TYPE GetType() const { return datumType_; } inline bool isStatic() const { return datumType_ == STATIC_DATUM; } inline bool isDynamic() const { return datumType_ == DYNAMIC_DATUM; } - inline void SetEpoch(const date& epoch) { epoch_ = epoch; } - void SetEpoch(const string& epoch); + inline void SetEpoch(const boost::gregorian::date& epoch) { epoch_ = epoch; } + void SetEpoch(const std::string& epoch); //void SetEpoch(const double& decimal_year); void SetDatum(const UINT32& epsgCode); - void SetDatum(const UINT32& epsgCode, const date& epoch); - void SetDatum(const string& epsgCode); - //void SetDatum(const string& epsgCode, const date& epoch); + void SetDatum(const UINT32& epsgCode, const boost::gregorian::date& epoch); + void SetDatum(const std::string& epsgCode); + //void SetDatum(const std::string& epsgCode, const boost::gregorian::date& epoch); - void SetDatumFromName(const string& datumName, const string& epoch); - void SetDatumFromEpsg(const string& epsgCode, const string& epoch); + void SetDatumFromName(const std::string& datumName, const std::string& epoch); + void SetDatumFromEpsg(const std::string& epsgCode, const std::string& epoch); //bool isSameFrame(const CDnaDatum& rhs) const; @@ -106,9 +101,9 @@ class CDnaDatum UINT32 epsgCode_; CDnaEllipsoid ellipsoid_; - date epoch_; + boost::gregorian::date epoch_; DATUM_TYPE datumType_; - string datumName_; + std::string datumName_; }; diff --git a/dynadjust/include/parameters/dnadatumprojectionparam.hpp b/dynadjust/include/parameters/dnadatumprojectionparam.hpp index 46930a32..03621e84 100644 --- a/dynadjust/include/parameters/dnadatumprojectionparam.hpp +++ b/dynadjust/include/parameters/dnadatumprojectionparam.hpp @@ -31,8 +31,6 @@ #include -using namespace std; - #include // GRS80 parameters diff --git a/dynadjust/include/parameters/dnaellipsoid.cpp b/dynadjust/include/parameters/dnaellipsoid.cpp index ab01e91e..c44b2ff8 100644 --- a/dynadjust/include/parameters/dnaellipsoid.cpp +++ b/dynadjust/include/parameters/dnaellipsoid.cpp @@ -44,7 +44,7 @@ CDnaEllipsoid::CDnaEllipsoid(const UINT32& epsgCode) CalculateEllipsoidParams(); } -CDnaEllipsoid::CDnaEllipsoid(const string& epsgCode) +CDnaEllipsoid::CDnaEllipsoid(const std::string& epsgCode) { UINT32 epsgCode_uint32 = LongFromString(trimstr(epsgCode)); SetEllipsoid(epsgCode_uint32); diff --git a/dynadjust/include/parameters/dnaellipsoid.hpp b/dynadjust/include/parameters/dnaellipsoid.hpp index 48266c04..d13e676f 100644 --- a/dynadjust/include/parameters/dnaellipsoid.hpp +++ b/dynadjust/include/parameters/dnaellipsoid.hpp @@ -33,8 +33,6 @@ #include #include -using namespace std; - #include #include @@ -48,7 +46,7 @@ class CDnaEllipsoid // predefined ellipsoid CDnaEllipsoid(void); CDnaEllipsoid(const UINT32& epsgCode); - CDnaEllipsoid(const string& epsgCode); + CDnaEllipsoid(const std::string& epsgCode); CDnaEllipsoid(const CDnaEllipsoid& newEllipsoid); // user-defined ellipsoid diff --git a/dynadjust/include/parameters/dnaepsg.hpp b/dynadjust/include/parameters/dnaepsg.hpp index 5ee97897..e69fbf86 100644 --- a/dynadjust/include/parameters/dnaepsg.hpp +++ b/dynadjust/include/parameters/dnaepsg.hpp @@ -39,24 +39,21 @@ #include #include -using namespace std; -using namespace boost; - namespace dynadjust { namespace epsg { // pairs to help parsing epsg codes -typedef pair epsg_string_uint32; -typedef pair epsg_uint32_string; +typedef std::pair epsg_string_uint32; +typedef std::pair epsg_uint32_string; // pairs needed for the epsg structs -typedef pair epsg_unit; -typedef pair epsg_axis; -typedef pair epsg_authority; -typedef pair epsg_parameter; +typedef std::pair epsg_unit; +typedef std::pair epsg_axis; +typedef std::pair epsg_authority; +typedef std::pair epsg_parameter; typedef struct { - string name_; + std::string name_; double semi_major_; double inv_flattening_; epsg_authority authority_; @@ -67,20 +64,20 @@ typedef struct { } epsg_tparams; typedef struct { - string name_; + std::string name_; epsg_spheroid spheroid_; epsg_tparams towgs84_; epsg_authority authority_; } epsg_datum; typedef struct { - string name_; + std::string name_; double value_; epsg_authority authority_; } epsg_primem; typedef struct { - string name; + std::string name; epsg_datum datum_; epsg_primem primem_; epsg_unit unit_; @@ -91,12 +88,12 @@ typedef struct { } epsg_geogcs; typedef struct { - string name_; + std::string name_; epsg_authority authority_; } epsg_projection; typedef struct { - string name_; + std::string name_; epsg_geogcs geogcs_; epsg_projection projection_; epsg_parameter central_meridian_; @@ -119,73 +116,73 @@ typedef struct { template U epsgCodeFromName(const S& datumName) { - if (iequals(datumName, AGD66_s)) + if (boost::iequals(datumName, AGD66_s)) return AGD66_i; - if (iequals(datumName, AGD84_s)) + if (boost::iequals(datumName, AGD84_s)) return AGD84_i; - if (iequals(datumName, GDA94_s)) + if (boost::iequals(datumName, GDA94_s)) return GDA94_i_xyz; - if (iequals(datumName, GDA2020_s)) + if (boost::iequals(datumName, GDA2020_s)) return GDA2020_i_xyz; // ITRF - if (iequals(datumName, ITRF2020_s)) + if (boost::iequals(datumName, ITRF2020_s)) return ITRF2020_i_xyz; - if (iequals(datumName, ITRF2014_s)) + if (boost::iequals(datumName, ITRF2014_s)) return ITRF2014_i_xyz; - if (iequals(datumName, ITRF2008_s)) + if (boost::iequals(datumName, ITRF2008_s)) return ITRF2008_i_xyz; - if (iequals(datumName, ITRF2005_s)) + if (boost::iequals(datumName, ITRF2005_s)) return ITRF2005_i_xyz; - if (iequals(datumName, ITRF2000_s)) + if (boost::iequals(datumName, ITRF2000_s)) return ITRF2000_i_xyz; - if (iequals(datumName, ITRF1997_s) || iequals(datumName, ITRF1997_s_brief)) + if (boost::iequals(datumName, ITRF1997_s) || boost::iequals(datumName, ITRF1997_s_brief)) return ITRF1997_i_xyz; - if (iequals(datumName, ITRF1996_s) || iequals(datumName, ITRF1996_s_brief)) + if (boost::iequals(datumName, ITRF1996_s) || boost::iequals(datumName, ITRF1996_s_brief)) return ITRF1996_i_xyz; - if (iequals(datumName, ITRF1994_s) || iequals(datumName, ITRF1994_s_brief)) + if (boost::iequals(datumName, ITRF1994_s) || boost::iequals(datumName, ITRF1994_s_brief)) return ITRF1994_i_xyz; - if (iequals(datumName, ITRF1993_s) || iequals(datumName, ITRF1993_s_brief)) + if (boost::iequals(datumName, ITRF1993_s) || boost::iequals(datumName, ITRF1993_s_brief)) return ITRF1993_i_xyz; - if (iequals(datumName, ITRF1992_s) || iequals(datumName, ITRF1992_s_brief)) + if (boost::iequals(datumName, ITRF1992_s) || boost::iequals(datumName, ITRF1992_s_brief)) return ITRF1992_i_xyz; - if (iequals(datumName, ITRF1991_s) || iequals(datumName, ITRF1991_s_brief)) + if (boost::iequals(datumName, ITRF1991_s) || boost::iequals(datumName, ITRF1991_s_brief)) return ITRF1991_i_xyz; - if (iequals(datumName, ITRF1990_s) || iequals(datumName, ITRF1990_s_brief)) + if (boost::iequals(datumName, ITRF1990_s) || boost::iequals(datumName, ITRF1990_s_brief)) return ITRF1990_i_xyz; - if (iequals(datumName, ITRF1989_s) || iequals(datumName, ITRF1989_s_brief)) + if (boost::iequals(datumName, ITRF1989_s) || boost::iequals(datumName, ITRF1989_s_brief)) return ITRF1989_i_xyz; - if (iequals(datumName, ITRF1988_s) || iequals(datumName, ITRF1988_s_brief)) + if (boost::iequals(datumName, ITRF1988_s) || boost::iequals(datumName, ITRF1988_s_brief)) return ITRF1988_i_xyz; // WGS84 - if (iequals(datumName, WGS84_s) || - iequals(datumName, WGS84_ensemble_s) || - iequals(datumName, WGS84_alias_s)) + if (boost::iequals(datumName, WGS84_s) || + boost::iequals(datumName, WGS84_ensemble_s) || + boost::iequals(datumName, WGS84_alias_s)) return WGS84_i_xyz; - if (iequals(datumName, WGS84_transit_s) || - iequals(datumName, WGS84_transit_alias_s)) + if (boost::iequals(datumName, WGS84_transit_s) || + boost::iequals(datumName, WGS84_transit_alias_s)) return WGS84_transit_i_xyz; - if (iequals(datumName, WGS84_G730_s) || - iequals(datumName, WGS84_G730_alias_s)) + if (boost::iequals(datumName, WGS84_G730_s) || + boost::iequals(datumName, WGS84_G730_alias_s)) return WGS84_G730_i_xyz; - if (iequals(datumName, WGS84_G873_s) || - iequals(datumName, WGS84_G873_alias_s)) + if (boost::iequals(datumName, WGS84_G873_s) || + boost::iequals(datumName, WGS84_G873_alias_s)) return WGS84_G873_i_xyz; - if (iequals(datumName, WGS84_G1150_s) || - iequals(datumName, WGS84_G1150_alias_s)) + if (boost::iequals(datumName, WGS84_G1150_s) || + boost::iequals(datumName, WGS84_G1150_alias_s)) return WGS84_G1150_i_xyz; - if (iequals(datumName, WGS84_G1674_s) || - iequals(datumName, WGS84_G1674_alias_s)) + if (boost::iequals(datumName, WGS84_G1674_s) || + boost::iequals(datumName, WGS84_G1674_alias_s)) return WGS84_G1674_i_xyz; - if (iequals(datumName, WGS84_G1762_s) || - iequals(datumName, WGS84_G1762_alias_s)) + if (boost::iequals(datumName, WGS84_G1762_s) || + boost::iequals(datumName, WGS84_G1762_alias_s)) return WGS84_G1762_i_xyz; - if (iequals(datumName, WGS84_G2139_s) || - iequals(datumName, WGS84_G2139_alias_s)) + if (boost::iequals(datumName, WGS84_G2139_s) || + boost::iequals(datumName, WGS84_G2139_alias_s)) return WGS84_G2139_i_xyz; - stringstream ss; - ss << "epsgCodeFromName: " << datumName << " is not a supported reference frame label." << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "epsgCodeFromName: " << datumName << " is not a supported reference frame label." << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } template @@ -282,15 +279,15 @@ S epsgStringFromName(const S& datumName) return WGS84_G2139_c; } - stringstream ss; - ss << "epsgCodeFromName: " << datumName << " is either unknown or not yet supported." << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "epsgCodeFromName: " << datumName << " is either unknown or not yet supported." << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } template bool isEpsgDatumStatic(const U& epsgCode) { - stringstream ss; + std::stringstream ss; switch (epsgCode) { @@ -357,8 +354,8 @@ bool isEpsgDatumStatic(const U& epsgCode) case WGS84_G2139_i: return false; default: - ss << "isEpsgDatumStatic: EPSG code " << epsgCode << " is not a supported EPSG code." << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + ss << "isEpsgDatumStatic: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } return false; } @@ -456,14 +453,14 @@ void spheroidFromEpsgCode(const U& epsgCode, epsg_spheroid& ellipsoid) ellipsoid.semi_major_ = WGS84_a; break; default: - stringstream ss; - ss << "spheroidFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "spheroidFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } } template -string referenceepochFromEpsgCode(const U& epsgCode) +std::string referenceepochFromEpsgCode(const U& epsgCode) { switch (epsgCode) { @@ -551,9 +548,9 @@ string referenceepochFromEpsgCode(const U& epsgCode) case WGS84_G2139_i: return WGS84_G2139_epoch; default: - stringstream ss; - ss << "referenceepochFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "referenceepochFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } return ""; } @@ -656,9 +653,9 @@ S datumFromEpsgCode(const U& epsgCode) case WGS84_G2139_i: return WGS84_G2139_s; default: - stringstream ss; - ss << "datumFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "datumFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } return ""; } @@ -749,9 +746,9 @@ bool validateEpsgCode(const U& epsgCode) case WGS84_G2139_i: return true; default: - stringstream ss; - ss << "validateEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << endl; - throw boost::enable_current_exception(runtime_error(ss.str())); + std::stringstream ss; + ss << "validateEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + throw boost::enable_current_exception(std::runtime_error(ss.str())); } return false; } @@ -775,8 +772,8 @@ bool isEpsgWGS84Ensemble(const U& epsgCode) template bool isEpsgStringWGS84Ensemble(const U& epsgString) { - if (iequals(epsgString, WGS84_c) || - iequals(epsgString, WGS84_ensemble_c)) + if (boost::iequals(epsgString, WGS84_c) || + boost::iequals(epsgString, WGS84_ensemble_c)) return true; return false; @@ -815,15 +812,15 @@ bool isEpsgWGS84(const U& epsgCode) template bool isEpsgStringWGS84(const U& epsgString) { - if (iequals(epsgString, WGS84_c) || - iequals(epsgString, WGS84_ensemble_c) || - iequals(epsgString, WGS84_transit_c) || - iequals(epsgString, WGS84_G730_c) || - iequals(epsgString, WGS84_G873_c) || - iequals(epsgString, WGS84_G1150_c) || - iequals(epsgString, WGS84_G1674_c) || - iequals(epsgString, WGS84_G1762_c) || - iequals(epsgString, WGS84_G2139_c)) + if (boost::iequals(epsgString, WGS84_c) || + boost::iequals(epsgString, WGS84_ensemble_c) || + boost::iequals(epsgString, WGS84_transit_c) || + boost::iequals(epsgString, WGS84_G730_c) || + boost::iequals(epsgString, WGS84_G873_c) || + boost::iequals(epsgString, WGS84_G1150_c) || + boost::iequals(epsgString, WGS84_G1674_c) || + boost::iequals(epsgString, WGS84_G1762_c) || + boost::iequals(epsgString, WGS84_G2139_c)) return true; return false; diff --git a/dynadjust/include/parameters/dnaframesubstitutions.hpp b/dynadjust/include/parameters/dnaframesubstitutions.hpp index 72f783a4..dc80aafc 100644 --- a/dynadjust/include/parameters/dnaframesubstitutions.hpp +++ b/dynadjust/include/parameters/dnaframesubstitutions.hpp @@ -39,7 +39,7 @@ namespace frame_substitutions { ///////////////////////////////////////////////////////////// // Custom type to manage frame substitutions -template +template class frame_substitutions_t { public: @@ -75,15 +75,15 @@ class frame_substitutions_t T3 parameters_[7]; // transformation parameters (if any) }; -typedef frame_substitutions_t frame_substitutions; +typedef frame_substitutions_t frame_substitutions; -typedef boost::shared_ptr< frame_substitutions_t > frameSubsPtr; -typedef vector vframeSubsPtr, *pvframeSubsPtr; +typedef boost::shared_ptr< frame_substitutions_t > frameSubsPtr; +typedef std::vector vframeSubsPtr, *pvframeSubsPtr; typedef vframeSubsPtr::iterator _it_vframesubptr; // WGS84 (Transit) to ITRF90 -template +template class WGS84_TRANSIT_ITRF90 : public frame_substitutions_t { public: @@ -103,8 +103,8 @@ class WGS84_TRANSIT_ITRF90 : public frame_substitutions_t frame_substitutions::parameters_[5] = -0.0003; frame_substitutions::parameters_[6] = 0.0070; - frame_substitutions::from_epoch = dateFromString("01.01.1987"); - frame_substitutions::to_epoch = dateFromString("01.01.1994"); + frame_substitutions::from_epoch = dateFromString("01.01.1987"); + frame_substitutions::to_epoch = dateFromString("01.01.1994"); }; ~WGS84_TRANSIT_ITRF90() {} @@ -112,7 +112,7 @@ class WGS84_TRANSIT_ITRF90 : public frame_substitutions_t // WGS84 to ITRF90 -template +template class WGS84_ITRF90 : public frame_substitutions_t { public: @@ -132,8 +132,8 @@ class WGS84_ITRF90 : public frame_substitutions_t frame_substitutions::parameters_[5] = -0.0003; frame_substitutions::parameters_[6] = 0.0070; - frame_substitutions::from_epoch = dateFromString("01.01.1987"); - frame_substitutions::to_epoch = dateFromString("01.01.1994"); + frame_substitutions::from_epoch = dateFromString("01.01.1987"); + frame_substitutions::to_epoch = dateFromString("01.01.1994"); }; ~WGS84_ITRF90() {} @@ -141,7 +141,7 @@ class WGS84_ITRF90 : public frame_substitutions_t // WGS84 (G730) to ITRF91 -template +template class WGS84_G730_ITRF91 : public frame_substitutions_t { public: @@ -153,8 +153,8 @@ class WGS84_G730_ITRF91 : public frame_substitutions_t frame_substitutions::substitute_name = ITRF1991_s_brief; frame_substitutions::substitute_epsg = ITRF1991_i_xyz; - frame_substitutions::from_epoch = dateFromString("02.01.1994"); - frame_substitutions::to_epoch = dateFromString("28.09.1996"); + frame_substitutions::from_epoch = dateFromString("02.01.1994"); + frame_substitutions::to_epoch = dateFromString("28.09.1996"); }; virtual ~WGS84_G730_ITRF91() {} @@ -162,7 +162,7 @@ class WGS84_G730_ITRF91 : public frame_substitutions_t // WGS84 to ITRF91 -template +template class WGS84_ITRF91 : public frame_substitutions_t { public: @@ -174,8 +174,8 @@ class WGS84_ITRF91 : public frame_substitutions_t frame_substitutions::substitute_name = ITRF1991_s_brief; frame_substitutions::substitute_epsg = ITRF1991_i_xyz; - frame_substitutions::from_epoch = dateFromString("02.01.1994"); - frame_substitutions::to_epoch = dateFromString("28.09.1996"); + frame_substitutions::from_epoch = dateFromString("02.01.1994"); + frame_substitutions::to_epoch = dateFromString("28.09.1996"); }; virtual ~WGS84_ITRF91() {} @@ -183,7 +183,7 @@ class WGS84_ITRF91 : public frame_substitutions_t // WGS84 (G873) to ITRF94 -template +template class WGS84_G873_ITRF94 : public frame_substitutions_t { public: @@ -195,15 +195,15 @@ class WGS84_G873_ITRF94 : public frame_substitutions_t frame_substitutions::substitute_name = ITRF1994_s_brief; frame_substitutions::substitute_epsg = ITRF1994_i_xyz; - frame_substitutions::from_epoch = dateFromString("29.09.1996"); - frame_substitutions::to_epoch = dateFromString("19.01.2002"); + frame_substitutions::from_epoch = dateFromString("29.09.1996"); + frame_substitutions::to_epoch = dateFromString("19.01.2002"); }; virtual ~WGS84_G873_ITRF94() {} }; // WGS84 to ITRF94 -template +template class WGS84_ITRF94 : public frame_substitutions_t { public: @@ -215,15 +215,15 @@ class WGS84_ITRF94 : public frame_substitutions_t frame_substitutions::substitute_name = ITRF1994_s_brief; frame_substitutions::substitute_epsg = ITRF1994_i_xyz; - frame_substitutions::from_epoch = dateFromString("29.09.1996"); - frame_substitutions::to_epoch = dateFromString("19.01.2002"); + frame_substitutions::from_epoch = dateFromString("29.09.1996"); + frame_substitutions::to_epoch = dateFromString("19.01.2002"); }; virtual ~WGS84_ITRF94() {} }; // WGS84 (G1150) to ITRF2000 -template +template class WGS84_G1150_ITRF2000 : public frame_substitutions_t { public: @@ -235,15 +235,15 @@ class WGS84_G1150_ITRF2000 : public frame_substitutions_t frame_substitutions::substitute_name = ITRF2000_s; frame_substitutions::substitute_epsg = ITRF2000_i_xyz; - frame_substitutions::from_epoch = dateFromString("20.01.2002"); - frame_substitutions::to_epoch = dateFromString("06.05.2012"); + frame_substitutions::from_epoch = dateFromString("20.01.2002"); + frame_substitutions::to_epoch = dateFromString("06.05.2012"); }; virtual ~WGS84_G1150_ITRF2000() {} }; // WGS84 to ITRF2000 -template +template class WGS84_ITRF2000 : public frame_substitutions_t { public: @@ -255,15 +255,15 @@ class WGS84_ITRF2000 : public frame_substitutions_t frame_substitutions::substitute_name = ITRF2000_s; frame_substitutions::substitute_epsg = ITRF2000_i_xyz; - frame_substitutions::from_epoch = dateFromString("20.01.2002"); - frame_substitutions::to_epoch = dateFromString("06.05.2012"); + frame_substitutions::from_epoch = dateFromString("20.01.2002"); + frame_substitutions::to_epoch = dateFromString("06.05.2012"); }; virtual ~WGS84_ITRF2000() {} }; // WGS84 (G1674) to ITRF2008 -template +template class WGS84_G1674_ITRF2008 : public frame_substitutions_t { public: @@ -275,15 +275,15 @@ class WGS84_G1674_ITRF2008 : public frame_substitutions_t frame_substitutions::substitute_name = ITRF2008_s; frame_substitutions::substitute_epsg = ITRF2008_i_xyz; - frame_substitutions::from_epoch = dateFromString("07.05.2012"); - frame_substitutions::to_epoch = dateFromString("15.10.2013"); + frame_substitutions::from_epoch = dateFromString("07.05.2012"); + frame_substitutions::to_epoch = dateFromString("15.10.2013"); }; virtual ~WGS84_G1674_ITRF2008() {} }; // WGS84 to ITRF2008 -template +template class WGS84_ITRF2008_1 : public frame_substitutions_t { public: @@ -295,15 +295,15 @@ class WGS84_ITRF2008_1 : public frame_substitutions_t frame_substitutions::substitute_name = ITRF2008_s; frame_substitutions::substitute_epsg = ITRF2008_i_xyz; - frame_substitutions::from_epoch = dateFromString("07.05.2012"); - frame_substitutions::to_epoch = dateFromString("15.10.2013"); + frame_substitutions::from_epoch = dateFromString("07.05.2012"); + frame_substitutions::to_epoch = dateFromString("15.10.2013"); }; virtual ~WGS84_ITRF2008_1() {} }; // WGS84 (G1762) to ITRF2008 -template +template class WGS84_G1762_ITRF2008 : public frame_substitutions_t { public: @@ -315,15 +315,15 @@ class WGS84_G1762_ITRF2008 : public frame_substitutions_t frame_substitutions::substitute_name = ITRF2008_s; frame_substitutions::substitute_epsg = ITRF2008_i_xyz; - frame_substitutions::from_epoch = dateFromString("16.10.2013"); - frame_substitutions::to_epoch = dateFromString("02.01.2021"); + frame_substitutions::from_epoch = dateFromString("16.10.2013"); + frame_substitutions::to_epoch = dateFromString("02.01.2021"); }; virtual ~WGS84_G1762_ITRF2008() {} }; // WGS84 to ITRF2008 -template +template class WGS84_ITRF2008_2 : public frame_substitutions_t { public: @@ -335,15 +335,15 @@ class WGS84_ITRF2008_2 : public frame_substitutions_t frame_substitutions::substitute_name = ITRF2008_s; frame_substitutions::substitute_epsg = ITRF2008_i_xyz; - frame_substitutions::from_epoch = dateFromString("16.10.2013"); - frame_substitutions::to_epoch = dateFromString("02.01.2021"); + frame_substitutions::from_epoch = dateFromString("16.10.2013"); + frame_substitutions::to_epoch = dateFromString("02.01.2021"); }; virtual ~WGS84_ITRF2008_2() {} }; // WGS84 (G2139) to ITRF2014 -template +template class WGS84_G2139_ITRF2014 : public frame_substitutions_t { public: @@ -355,15 +355,15 @@ class WGS84_G2139_ITRF2014 : public frame_substitutions_t frame_substitutions::substitute_name = ITRF2014_s; frame_substitutions::substitute_epsg = ITRF2014_i_xyz; - frame_substitutions::from_epoch = dateFromString("02.01.2021"); - frame_substitutions::to_epoch = day_clock::local_day() + years(100); + frame_substitutions::from_epoch = dateFromString("02.01.2021"); + frame_substitutions::to_epoch = boost::gregorian::day_clock::local_day() + boost::gregorian::years(100); }; virtual ~WGS84_G2139_ITRF2014() {} }; // WGS84 to ITRF2014 -template +template class WGS84_ITRF2014 : public frame_substitutions_t { public: @@ -375,8 +375,8 @@ class WGS84_ITRF2014 : public frame_substitutions_t frame_substitutions::substitute_name = ITRF2014_s; frame_substitutions::substitute_epsg = ITRF2014_i_xyz; - frame_substitutions::from_epoch = dateFromString("02.01.2021"); - frame_substitutions::to_epoch = day_clock::local_day() + years(100); + frame_substitutions::from_epoch = dateFromString("02.01.2021"); + frame_substitutions::to_epoch = boost::gregorian::day_clock::local_day() + boost::gregorian::years(100); }; virtual ~WGS84_ITRF2014() {} @@ -425,7 +425,7 @@ struct CompareSubstituteOnFrameName template T binary_search_substitution(T begin, T end, S value) { - T i = lower_bound(begin, end, value, CompareSubstituteOnFrameName< frame_substitutions_t , string>()); + T i = lower_bound(begin, end, value, CompareSubstituteOnFrameName< frame_substitutions_t , std::string>()); if (i != end && i->get()->getFrameName() == value) return i; else diff --git a/dynadjust/include/parameters/dnaplatemotionmodels.hpp b/dynadjust/include/parameters/dnaplatemotionmodels.hpp index 1a27b4c7..6b7e2ae8 100644 --- a/dynadjust/include/parameters/dnaplatemotionmodels.hpp +++ b/dynadjust/include/parameters/dnaplatemotionmodels.hpp @@ -37,9 +37,6 @@ #include -using namespace std; -using namespace boost; - using namespace dynadjust::epsg; namespace dynadjust { diff --git a/dynadjust/include/parameters/dnaprojection.hpp b/dynadjust/include/parameters/dnaprojection.hpp index c4ab93dc..df32f934 100644 --- a/dynadjust/include/parameters/dnaprojection.hpp +++ b/dynadjust/include/parameters/dnaprojection.hpp @@ -33,8 +33,6 @@ #include #include -using namespace std; - #include #include diff --git a/dynadjust/include/parameters/dnatransformationparameters.hpp b/dynadjust/include/parameters/dnatransformationparameters.hpp index a37abbc4..d9ef5ec8 100644 --- a/dynadjust/include/parameters/dnatransformationparameters.hpp +++ b/dynadjust/include/parameters/dnatransformationparameters.hpp @@ -36,9 +36,6 @@ #include -using namespace std; -using namespace boost; - using namespace dynadjust::epsg; namespace dynadjust { @@ -63,7 +60,7 @@ typedef enum __plate_motion_model__ = 8 } transformationType; -template +template S TransformationType(const U& u) { switch (u) @@ -148,7 +145,7 @@ typedef struct transformation_parameter_set_ { } } transformation_parameter_set; -typedef vector vtransparams; +typedef std::vector vtransparams; //////////////////////////////////////////////////////////////////////////////////// diff --git a/dynadjust/include/thread/dnathreading.hpp b/dynadjust/include/thread/dnathreading.hpp index cde8a5ee..43dec1a0 100644 --- a/dynadjust/include/thread/dnathreading.hpp +++ b/dynadjust/include/thread/dnathreading.hpp @@ -33,9 +33,6 @@ #include #include -using namespace std; -using namespace boost; - template class concurrent_block_adjustment { @@ -94,31 +91,31 @@ class concurrent_block_adjustment reset_reverse_run(); } - inline string print_adjusted_forward_blocks() { - stringstream ss(""); + inline std::string print_adjusted_forward_blocks() { + std::stringstream ss(""); boost::lock_guard lock(forward_mutex); - ss << "Forward blocks (" << v_fwd_blocks.size() << "):" << endl; + ss << "Forward blocks (" << v_fwd_blocks.size() << "):" << std::endl; for (UINT32 i=0; i lock(reverse_mutex); - stringstream ss; - ss << "Reverse blocks (" << v_fwd_blocks.size() << "):" << endl; + std::stringstream ss; + ss << "Reverse blocks (" << v_fwd_blocks.size() << "):" << std::endl; for (UINT32 i=0; i > v_fwd_blocks; - vector< sequential_adj_t > v_rev_blocks; + std::vector< sequential_adj_t > v_fwd_blocks; + std::vector< sequential_adj_t > v_rev_blocks; mutable boost::mutex forward_mutex, reverse_mutex, combine_mutex; mutable boost::mutex fwd_state_mutex, rev_state_mutex, cmb_state_mutex; @@ -228,7 +225,7 @@ class concurrent_queue : more_blocks_coming_(true) {} virtual ~concurrent_queue() {} - inline void push_data(const vector& data) + inline void push_data(const std::vector& data) { boost::lock_guard ql(queue_mutex); // push a vector of data elements @@ -335,7 +332,7 @@ class concurrent_queue bool more_blocks_coming_; }; -template +template class concurrent_ofstream { public: @@ -386,7 +383,7 @@ class message_bank } private: - vector messages; + std::vector messages; mutable boost::mutex message_mutex; }; From 2fc55444a606cc2b77918d51e4ff3a31885e2be3 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:48:30 +1100 Subject: [PATCH 064/102] Update to Boost 1.87 --- dynadjust/dynadjust.props | 4 ++-- resources/BUILDING.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dynadjust/dynadjust.props b/dynadjust/dynadjust.props index fe4a6675..9942d4c0 100644 --- a/dynadjust/dynadjust.props +++ b/dynadjust/dynadjust.props @@ -2,8 +2,8 @@ - C:\Data\boost\boost_1_78_0\include - C:\Data\boost\boost_1_78_0\lib\$(Platform) + C:\Data\boost\boost_1_87_0\include + C:\Data\boost\boost_1_87_0\lib\$(Platform) C:\Program Files (x86)\CodeSynthesis XSD 4.0\include C:\Program Files (x86)\CodeSynthesis XSD 4.0\lib64\vc-12.0 C:\Program Files (x86)\CodeSynthesis XSD 4.0\lib\vc-12.0 diff --git a/resources/BUILDING.md b/resources/BUILDING.md index 91a395de..1e07cb91 100644 --- a/resources/BUILDING.md +++ b/resources/BUILDING.md @@ -73,7 +73,7 @@ rem build b2 using VS 2022 call bootstrap.bat vc143 rem Directory to boost root -set boost_dir=boost_1_78_0 +set boost_dir=boost_1_87_0 rem Store compiled libraries in directories corresponding to 64-bit and 32-bit. set stage_64=C:\Data\boost\%boost_dir%\lib\x64 @@ -118,8 +118,8 @@ provides a convenient way to reference custom boost C++ file paths across the en By default, the boost paths are set as follows. Change these to match the location of the boost header files and libraries on your machine, making sure that `\lib\` contains two folders named `x64` and `Win32` if you need to build 64-bit and 32-bit binaries respectively. -- **BoostIncludeDir:** `C:\Data\boost\boost_1_78_0\include\` -- **BoostLibDir:** `C:\Data\boost\boost_1_78_0\lib\$(Platform)` +- **BoostIncludeDir:** `C:\Data\boost\boost_1_87_0\include\` +- **BoostLibDir:** `C:\Data\boost\boost_1_87_0\lib\$(Platform)` #### 1.3 Install CodeSynthesis XSD and Apache xerces-c headers and libraries From ac9ebfcf6f294e78b832eaf80edd5562b7ea545b Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 10 Feb 2025 17:49:50 +1100 Subject: [PATCH 065/102] Further namespace clean up --- dynadjust/dynadjust/dnageoidint/FileProc.h | 2 +- dynadjust/dynadjust/metadata/metadata.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dynadjust/dynadjust/dnageoidint/FileProc.h b/dynadjust/dynadjust/dnageoidint/FileProc.h index d1e7f8b5..76f04086 100644 --- a/dynadjust/dynadjust/dnageoidint/FileProc.h +++ b/dynadjust/dynadjust/dnageoidint/FileProc.h @@ -48,7 +48,7 @@ class CFileProc CString BrowseForDialog(CString strMsg, HWND hwndOwner); void ClearFileArrayMemory(); - void BuildFileArray(const char* filedir, const vector& filetype, const int& no_filetypes); + void BuildFileArray(const char* filedir, const std::vector& filetype, const int& no_filetypes); void EnterSingleFile(char *filename); CString FileOpenSave(BOOL bOpen_Save, BOOL bMulti_Files, LPCTSTR lpszDir, char *cNewFile, LPCTSTR lpszTitle, LPCTSTR lpszExt, LPCTSTR strFilter, int iFileType); diff --git a/dynadjust/dynadjust/metadata/metadata.cpp b/dynadjust/dynadjust/metadata/metadata.cpp index 8ffd1c16..03d6fa0d 100644 --- a/dynadjust/dynadjust/metadata/metadata.cpp +++ b/dynadjust/dynadjust/metadata/metadata.cpp @@ -444,7 +444,7 @@ int main(int argc, char* argv[]) std::ostringstream ss_time, ss_msg; boost::posix_time::milliseconds elapsed_time(boost::posix_time::milliseconds(0)); - ptime pt; + boost::posix_time::ptime pt; if (!p.g.quiet) { @@ -488,7 +488,7 @@ int main(int argc, char* argv[]) // Form output file path std::stringstream ss_outputfile(""); - ss_outputfile << path(input_file).stem().generic_string(); + ss_outputfile << boost::filesystem::path(input_file).stem().generic_string(); ss_outputfile << ".edit.xml"; output_file = ss_outputfile.str(); From a455bb441a03dda3aeaf9b6c580d15389abd115a Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 10 Feb 2025 17:51:05 +1100 Subject: [PATCH 066/102] Reduce windows includes to essentials --- dynadjust/dynadjust/dnageoidint/precompile.h | 3 +-- dynadjust/dynadjust/dnageoidint/stdafx.h | 3 +-- dynadjust/dynadjust/metadata/precompile.h | 5 +++++ dynadjust/include/functions/dnaprocessfuncs.hpp | 8 +++++--- dynadjust/include/ide/trace.cpp | 12 ++++++++---- dynadjust/include/io/dnaiopdf.hpp | 11 +++++++---- dynadjust/include/io/pdfdde.cpp | 14 +++++++++----- dynadjust/include/math/dnamatrix_contiguous.hpp | 5 +++++ 8 files changed, 41 insertions(+), 20 deletions(-) diff --git a/dynadjust/dynadjust/dnageoidint/precompile.h b/dynadjust/dynadjust/dnageoidint/precompile.h index c8d51116..27c07aa4 100644 --- a/dynadjust/dynadjust/dnageoidint/precompile.h +++ b/dynadjust/dynadjust/dnageoidint/precompile.h @@ -22,9 +22,8 @@ #define _SECURE_ATL 1 #endif -#ifndef VC_EXTRALEAN +#define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers -#endif #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit diff --git a/dynadjust/dynadjust/dnageoidint/stdafx.h b/dynadjust/dynadjust/dnageoidint/stdafx.h index 1a992b1e..17757395 100644 --- a/dynadjust/dynadjust/dnageoidint/stdafx.h +++ b/dynadjust/dynadjust/dnageoidint/stdafx.h @@ -20,9 +20,8 @@ #define _SECURE_ATL 1 #endif -#ifndef VC_EXTRALEAN +#define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers -#endif #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit diff --git a/dynadjust/dynadjust/metadata/precompile.h b/dynadjust/dynadjust/metadata/precompile.h index 9f5ad3ea..6a99ced5 100644 --- a/dynadjust/dynadjust/metadata/precompile.h +++ b/dynadjust/dynadjust/metadata/precompile.h @@ -5,6 +5,11 @@ #pragma once +// prevent conflict with std::min(...) std::max(...) +#ifdef _WIN32 +#define NOMINMAX +#endif + #include #include diff --git a/dynadjust/include/functions/dnaprocessfuncs.hpp b/dynadjust/include/functions/dnaprocessfuncs.hpp index 701b6711..5f282ee3 100644 --- a/dynadjust/include/functions/dnaprocessfuncs.hpp +++ b/dynadjust/include/functions/dnaprocessfuncs.hpp @@ -34,11 +34,13 @@ #include #if defined(_WIN32) || defined(__WIN32__) -#include -#ifndef VC_EXTRALEAN +// prevent conflict with std::min(...) std::max(...) +#define NOMINMAX +#define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers -#endif + +#include #endif diff --git a/dynadjust/include/ide/trace.cpp b/dynadjust/include/ide/trace.cpp index 5067cb2e..da29ff4b 100644 --- a/dynadjust/include/ide/trace.cpp +++ b/dynadjust/include/ide/trace.cpp @@ -20,15 +20,19 @@ // Description : Provides debug trace functionality when MFC is not used //============================================================================ +// prevent conflict with std::min(...) std::max(...) +#ifdef _WIN32 +#define NOMINMAX +#endif + #ifdef _DEBUG +#define WIN32_LEAN_AND_MEAN +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers + #include #include #include -#ifndef VC_EXTRALEAN -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers -#endif - void _trace(const char *fmt, ...) { char out[1024]; diff --git a/dynadjust/include/io/dnaiopdf.hpp b/dynadjust/include/io/dnaiopdf.hpp index 48421a1e..38870946 100644 --- a/dynadjust/include/io/dnaiopdf.hpp +++ b/dynadjust/include/io/dnaiopdf.hpp @@ -30,14 +30,17 @@ #endif #if defined(_WIN32) || defined(__WIN32__) + + // prevent conflict with std::min(...) std::max(...) + #define NOMINMAX + + #define WIN32_LEAN_AND_MEAN + #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers + #include #include #include // for FindExecutable - #ifndef VC_EXTRALEAN - #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers - #endif - #elif defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) #include #endif diff --git a/dynadjust/include/io/pdfdde.cpp b/dynadjust/include/io/pdfdde.cpp index 62d48dc0..5eb7127a 100644 --- a/dynadjust/include/io/pdfdde.cpp +++ b/dynadjust/include/io/pdfdde.cpp @@ -21,7 +21,15 @@ PURPOSE ***************************************************************************/ -// #include +// prevent conflict with std::min(...) std::max(...) +#ifdef _WIN32 +#define NOMINMAX +#endif + +#define WIN32_LEAN_AND_MEAN +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers + + #define MAXPATHLEN 256 #include #include @@ -30,10 +38,6 @@ PURPOSE #include #include -#ifndef VC_EXTRALEAN -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers -#endif - //#include #define ACROBAT_EXE "acrobat.exe" diff --git a/dynadjust/include/math/dnamatrix_contiguous.hpp b/dynadjust/include/math/dnamatrix_contiguous.hpp index 37ffd6de..53dadb9d 100644 --- a/dynadjust/include/math/dnamatrix_contiguous.hpp +++ b/dynadjust/include/math/dnamatrix_contiguous.hpp @@ -26,6 +26,11 @@ #ifndef DNAMATRIX_CONTIGUOUS_H_ #define DNAMATRIX_CONTIGUOUS_H_ +// prevent conflict with std::min(...) std::max(...) +#ifdef _WIN32 +#define NOMINMAX +#endif + #if defined(_MSC_VER) #if defined(LIST_INCLUDES_ON_BUILD) #pragma message(" " __FILE__) From 57cf9a1cb2388a6a0c9b204a52eb05ae257f156b Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 10 Feb 2025 22:27:03 +1100 Subject: [PATCH 067/102] Improve test procedure --- dynadjust/CMakeLists.txt | 4 ++-- sampleData/gnss.simult.adj.expected | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dynadjust/CMakeLists.txt b/dynadjust/CMakeLists.txt index 64e94537..8cbe1da9 100644 --- a/dynadjust/CMakeLists.txt +++ b/dynadjust/CMakeLists.txt @@ -268,7 +268,7 @@ if (BUILD_TESTING) add_test (NAME imp-urb05-xml-data COMMAND $ -n urban_xml ./urban_dnastn.xml ./urban_dnamsr.xml --include-stns-assoc-msrs "4000,1,1004,1042,1046,2,2215,4000,5,9004,1002,1003,1034,1039,1050,13,2101,2102,2105,2106,2109,2118,2119,2122,2123,2124,2125,2206,2214") add_test (NAME imp-urb06-xml-data COMMAND $ -n urban_xml ./urban_dnastn.xml ./urban_dnamsr.xml --export-dna --export-asl --export-aml --export-map --output-msr-to-stn) add_test (NAME seg-urb00-xml-data COMMAND $ urban_xml --min 50 --max 50) - add_test (NAME imp-urb07-xml-data COMMAND $ -n urban_xml ./urban_dnastn.xml ./urban_dnamsr.xml --import-block-stn-msr 2) + add_test (NAME imp-urb07-xml-data COMMAND $ -n urban_xml --import-block-stn-msr 2) add_test (NAME imp-urb08-xml-data COMMAND $ -n urban_xml ./urban_dnastn.xml ./urban_dnamsr.xml --geo-file urban.geo) add_test (NAME plt-urb01-xml-data COMMAND $ urban_xml --centre-station 1004 --area-radius 5000 --plot-msr-types gxyasvz --msr-line-width 0.5) add_test (NAME plt-urb02-xml-data COMMAND $ urban_xml --centre-latitude -37.480489013 --centre-longitude 144.573579814 --area-radius 3000 --omit-measurements) @@ -426,7 +426,7 @@ if (BUILD_TESTING) add_test (NAME reftran-misc-02 COMMAND $ -p misc.dnaproj) add_test (NAME segment-misc-01 COMMAND $ misc --min 500 --max 500 --starting-stns 230900140) add_test (NAME segment-misc-02 COMMAND $ misc --min 50 --max 100 --starting-stns 230900140 --seg-file ./misc.seg) - add_test (NAME import-misc-06 COMMAND $ -n misc ./miscstn.xml ./miscmsr.xml --import-block-stn-msr 2) + add_test (NAME import-misc-06 COMMAND $ -n misc --import-block-stn-msr 2) add_test (NAME import-misc-07 COMMAND $ -p misc.dnaproj) add_test (NAME import-noname-01 COMMAND $ ${CMAKE_SOURCE_DIR}/../sampleData/dsg.stn ${CMAKE_SOURCE_DIR}/../sampleData/dsg.msr) add_test (NAME import-noname-02 COMMAND $ ${CMAKE_SOURCE_DIR}/../sampleData/dsg.stn ${CMAKE_SOURCE_DIR}/../sampleData/dsg.msr) diff --git a/sampleData/gnss.simult.adj.expected b/sampleData/gnss.simult.adj.expected index b0b2cc2d..8b265bdc 100644 --- a/sampleData/gnss.simult.adj.expected +++ b/sampleData/gnss.simult.adj.expected @@ -18,6 +18,7 @@ Free Station S.D. (m): 10 Iteration threshold: 0.0005 Maximum iterations: 10 Test confidence interval: 95.0% +Uncertainties SD(e,n,up): 68.3% (1 sigma) Station coordinate types: PLHhXYZ Stations printed in blocks: No -------------------------------------------------------------------------------- From d8399fc4315c2997674ab281ae2a665569e02696 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 10 Feb 2025 22:29:21 +1100 Subject: [PATCH 068/102] Fix test for reporting proj ref frame --- dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index 72879675..38a28994 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -1880,7 +1880,7 @@ int main(int argc, char* argv[]) UINT32 stnCount(static_cast(vstationsTotal.size())); UINT32 msrCount(static_cast(vmeasurementsTotal.size())); - if (!p.i.user_supplied_frame) + if (!p.i.user_supplied_frame && !p.i.import_block) { std::stringstream datumSource; switch (vinput_file_meta.at(0).filetype) From 8af58273221df5885468fa215bca757468f494cd Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 11 Feb 2025 09:24:47 +1100 Subject: [PATCH 069/102] Revert to original preprocessor definition --- dynadjust/dynadjust/dnasegment/dnasegment.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/dynadjust/dnasegment/dnasegment.vcxproj b/dynadjust/dynadjust/dnasegment/dnasegment.vcxproj index 675993bd..afa87ef6 100644 --- a/dynadjust/dynadjust/dnasegment/dnasegment.vcxproj +++ b/dynadjust/dynadjust/dnasegment/dnasegment.vcxproj @@ -138,7 +138,7 @@ Use Level3 Disabled - _HAS_STD_BYTE=0;WIN64;_DEBUG;_WINDOWS;_USRDLL;BUILD_DNASEGMENT_DLL;BUILD_EXPORTDNATYPES;%(PreprocessorDefinitions) + WIN64;_DEBUG;_WINDOWS;_USRDLL;BUILD_DNASEGMENT_DLL;BUILD_EXPORTDNATYPES;%(PreprocessorDefinitions) 4996;4251;4290; true /Zm280 /permissive- From 2dccbaf7c7d5762630177fe55bc0c59abfcd8b08 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 11 Feb 2025 09:25:38 +1100 Subject: [PATCH 070/102] Address incorrect cast --- dynadjust/dynadjust/dnageoid/dnageoid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/dynadjust/dnageoid/dnageoid.cpp b/dynadjust/dynadjust/dnageoid/dnageoid.cpp index 6bd62cb4..cae46bc4 100644 --- a/dynadjust/dynadjust/dnageoid/dnageoid.cpp +++ b/dynadjust/dynadjust/dnageoid/dnageoid.cpp @@ -2624,7 +2624,7 @@ int dna_geoid_interpolation::OpenGridFile(const char *filename, const char *file ptheGrid->ptrIndex[i].dLonginc = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); getline(*pgrid_ifs, sBuf); - ptheGrid->ptrIndex[i].lGscount = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); + ptheGrid->ptrIndex[i].lGscount = boost::lexical_cast(trimstr(sBuf.substr(OVERVIEW_RECS))); // Save ASCII position in grid file for first record of lat & long shifts ptheGrid->ptrIndex[i].iGridPos = (int)pgrid_ifs->tellg(); From 40d4f7b185ff324d96accaec117baa3d996f1b06 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 11 Feb 2025 09:28:16 +1100 Subject: [PATCH 071/102] Test for unique macro definitions --- dynadjust/dynadjust/dnageoidint/precompile.h | 5 +++++ dynadjust/dynadjust/dnageoidint/stdafx.h | 5 +++++ dynadjust/dynadjust/metadata/precompile.h | 2 ++ dynadjust/include/functions/dnaprocessfuncs.hpp | 8 ++++++++ dynadjust/include/ide/trace.cpp | 8 ++++++++ dynadjust/include/io/dnaiopdf.hpp | 7 +++++++ dynadjust/include/io/pdfdde.cpp | 7 +++++++ dynadjust/include/math/dnamatrix_contiguous.hpp | 2 ++ 8 files changed, 44 insertions(+) diff --git a/dynadjust/dynadjust/dnageoidint/precompile.h b/dynadjust/dynadjust/dnageoidint/precompile.h index 27c07aa4..d24cddad 100644 --- a/dynadjust/dynadjust/dnageoidint/precompile.h +++ b/dynadjust/dynadjust/dnageoidint/precompile.h @@ -22,8 +22,13 @@ #define _SECURE_ATL 1 #endif +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#endif + +#ifndef VC_EXTRALEAN #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit diff --git a/dynadjust/dynadjust/dnageoidint/stdafx.h b/dynadjust/dynadjust/dnageoidint/stdafx.h index 17757395..7f2d985b 100644 --- a/dynadjust/dynadjust/dnageoidint/stdafx.h +++ b/dynadjust/dynadjust/dnageoidint/stdafx.h @@ -20,8 +20,13 @@ #define _SECURE_ATL 1 #endif +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#endif + +#ifndef VC_EXTRALEAN #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit diff --git a/dynadjust/dynadjust/metadata/precompile.h b/dynadjust/dynadjust/metadata/precompile.h index 6a99ced5..1b47ed3c 100644 --- a/dynadjust/dynadjust/metadata/precompile.h +++ b/dynadjust/dynadjust/metadata/precompile.h @@ -7,8 +7,10 @@ // prevent conflict with std::min(...) std::max(...) #ifdef _WIN32 +#ifndef NOMINMAX #define NOMINMAX #endif +#endif #include diff --git a/dynadjust/include/functions/dnaprocessfuncs.hpp b/dynadjust/include/functions/dnaprocessfuncs.hpp index 5f282ee3..24161d65 100644 --- a/dynadjust/include/functions/dnaprocessfuncs.hpp +++ b/dynadjust/include/functions/dnaprocessfuncs.hpp @@ -36,9 +36,17 @@ #if defined(_WIN32) || defined(__WIN32__) // prevent conflict with std::min(...) std::max(...) +#ifndef NOMINMAX #define NOMINMAX +#endif + +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#endif + +#ifndef VC_EXTRALEAN #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif #include diff --git a/dynadjust/include/ide/trace.cpp b/dynadjust/include/ide/trace.cpp index da29ff4b..81526dd0 100644 --- a/dynadjust/include/ide/trace.cpp +++ b/dynadjust/include/ide/trace.cpp @@ -22,12 +22,20 @@ // prevent conflict with std::min(...) std::max(...) #ifdef _WIN32 +#ifndef NOMINMAX #define NOMINMAX #endif +#endif #ifdef _DEBUG + +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#endif + +#ifndef VC_EXTRALEAN #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif #include #include diff --git a/dynadjust/include/io/dnaiopdf.hpp b/dynadjust/include/io/dnaiopdf.hpp index 38870946..eba570da 100644 --- a/dynadjust/include/io/dnaiopdf.hpp +++ b/dynadjust/include/io/dnaiopdf.hpp @@ -32,10 +32,17 @@ #if defined(_WIN32) || defined(__WIN32__) // prevent conflict with std::min(...) std::max(...) + #ifndef NOMINMAX #define NOMINMAX + #endif + #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN + #endif + + #ifndef VC_EXTRALEAN #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers + #endif #include #include diff --git a/dynadjust/include/io/pdfdde.cpp b/dynadjust/include/io/pdfdde.cpp index 5eb7127a..f8105430 100644 --- a/dynadjust/include/io/pdfdde.cpp +++ b/dynadjust/include/io/pdfdde.cpp @@ -23,11 +23,18 @@ PURPOSE // prevent conflict with std::min(...) std::max(...) #ifdef _WIN32 +#ifndef NOMINMAX #define NOMINMAX #endif +#endif +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#endif + +#ifndef VC_EXTRALEAN #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif #define MAXPATHLEN 256 diff --git a/dynadjust/include/math/dnamatrix_contiguous.hpp b/dynadjust/include/math/dnamatrix_contiguous.hpp index 53dadb9d..cd7a3e9b 100644 --- a/dynadjust/include/math/dnamatrix_contiguous.hpp +++ b/dynadjust/include/math/dnamatrix_contiguous.hpp @@ -28,8 +28,10 @@ // prevent conflict with std::min(...) std::max(...) #ifdef _WIN32 +#ifndef NOMINMAX #define NOMINMAX #endif +#endif #if defined(_MSC_VER) #if defined(LIST_INCLUDES_ON_BUILD) From b25b6d36e4588d8eabc02d65d426b34112fec3fb Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 11 Feb 2025 09:29:38 +1100 Subject: [PATCH 072/102] Handle a change to the apu header --- dynadjust/dynadjust/dnaplot/dnaplot.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dynadjust/dynadjust/dnaplot/dnaplot.cpp b/dynadjust/dynadjust/dnaplot/dnaplot.cpp index 1b6479e4..a2f0609e 100644 --- a/dynadjust/dynadjust/dnaplot/dnaplot.cpp +++ b/dynadjust/dynadjust/dnaplot/dnaplot.cpp @@ -3660,6 +3660,8 @@ void dna_plot::LoadPosUncertaintyFile() apu_file.ignore(PRINT_LINE_LENGTH, '\n'); // File name apu_file.ignore(PRINT_LINE_LENGTH, '\n'); // apu_file.ignore(PRINT_LINE_LENGTH, '\n'); // PU Confidence interval + apu_file.ignore(PRINT_LINE_LENGTH, '\n'); // Error ellipse axes + apu_file.ignore(PRINT_LINE_LENGTH, '\n'); // Variances apu_file.getline(line, PRINT_LINE_LENGTH); // Stations printed in blocks strLine = trimstr(std::string(line)); From 6e6539de5400b047bade0c05e7238f659e5dac5d Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 11 Feb 2025 12:07:58 +1100 Subject: [PATCH 073/102] Another fix to test for reporting proj ref frame --- dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index 38a28994..82d8e7d9 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -1880,7 +1880,7 @@ int main(int argc, char* argv[]) UINT32 stnCount(static_cast(vstationsTotal.size())); UINT32 msrCount(static_cast(vmeasurementsTotal.size())); - if (!p.i.user_supplied_frame && !p.i.import_block) + if (!p.i.user_supplied_frame && !p.i.import_block && !p.i.import_network) { std::stringstream datumSource; switch (vinput_file_meta.at(0).filetype) From b5f4e142049e1f283dfd571568da5fbb1847e8e2 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 11 Feb 2025 12:12:31 +1100 Subject: [PATCH 074/102] Test no longer valid --- dynadjust/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/dynadjust/CMakeLists.txt b/dynadjust/CMakeLists.txt index 8cbe1da9..1b81ce23 100644 --- a/dynadjust/CMakeLists.txt +++ b/dynadjust/CMakeLists.txt @@ -527,8 +527,6 @@ if (BUILD_TESTING) add_test (NAME reftran-no-project COMMAND $ -p ./nofile.dnaproj) # no name add_test (NAME reftran-no-name COMMAND $ -r "gda94") - # no reference frame - add_test (NAME reftran-no-frame COMMAND $ all) # no binary files add_test (NAME reftran-no-bst-bms COMMAND $ extremelylargenetwork -r "itrf1990") # reference frame doesn't exist From d92044792c01be58b6feac53fe125147a8d0e5cf Mon Sep 17 00:00:00 2001 From: Roger Fraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 11 Feb 2025 12:22:16 +1100 Subject: [PATCH 075/102] Update cmake_release.yml --- .github/workflows/cmake_release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/cmake_release.yml b/.github/workflows/cmake_release.yml index 219afc7f..2e5a0a62 100644 --- a/.github/workflows/cmake_release.yml +++ b/.github/workflows/cmake_release.yml @@ -5,6 +5,7 @@ on: branches: [ master ] pull_request: branches: [ master ] + workflow_dispatch: env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) From 1e0b8929efb7bd75f3250a9a0acb6b70246fb478 Mon Sep 17 00:00:00 2001 From: Roger Fraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 11 Feb 2025 12:30:47 +1100 Subject: [PATCH 076/102] Update test_coverage.yml --- .github/workflows/test_coverage.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test_coverage.yml b/.github/workflows/test_coverage.yml index 5ff5b9d8..cab5b3c6 100644 --- a/.github/workflows/test_coverage.yml +++ b/.github/workflows/test_coverage.yml @@ -5,6 +5,7 @@ on: branches: [ master ] pull_request: branches: [ master ] + workflow_dispatch: env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) From 084272171d8b85430566ed272ac814be371ab192 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 11 Feb 2025 12:34:58 +1100 Subject: [PATCH 077/102] Remove test for no frame --- dynadjust/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/CMakeLists.txt b/dynadjust/CMakeLists.txt index 1b81ce23..0855a5db 100644 --- a/dynadjust/CMakeLists.txt +++ b/dynadjust/CMakeLists.txt @@ -544,7 +544,7 @@ if (BUILD_TESTING) set_tests_properties( - reftran-no-option reftran-invalid-option reftran-no-project reftran-no-name reftran-no-frame reftran-no-bst-bms + reftran-no-option reftran-invalid-option reftran-no-project reftran-no-name reftran-no-bst-bms reftran-bad-frame reftran-bad-epoch reftran-no-discont-file reftran-no-euler-file reftran-no-model-option reftran-no-help PROPERTIES WILL_FAIL TRUE) From 39c30fba2d27bcd9b1e0fc7a3dfbdb24f1f633f7 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 12 Feb 2025 08:58:44 +1100 Subject: [PATCH 078/102] Fix handling of user-supplied epoch --- .../dnaimportwrapper/dnaimportwrapper.cpp | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index 82d8e7d9..7bf52045 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -1017,24 +1017,28 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* p.r.reference_frame = inputFileDatum; } - if (inputFileEpoch.empty()) + if (!p.i.user_supplied_epoch) { - // Has an epoch been provided but no frame? - if (inputFileEpsg.empty()) - // revert to epoch of - p.i.epoch = referenceepochFromEpsgCode(inputFileEpsgi); + if (inputFileEpoch.empty()) + { + // Has an epoch been provided but no frame? + if (inputFileEpsg.empty()) + // revert to epoch of + p.i.epoch = referenceepochFromEpsgCode(inputFileEpsgi); + else + p.i.epoch = referenceepochFromEpsgString(projctEpsgCode); + p.r.epoch = p.i.epoch; + } else - p.i.epoch = referenceepochFromEpsgString(projctEpsgCode); - p.r.epoch = p.i.epoch; - } - else - { - p.i.epoch = inputFileEpoch; - p.r.epoch = p.i.epoch; + { + p.i.epoch = inputFileEpoch; + p.r.epoch = p.i.epoch; + } } try { - // Initialise the 'default' datum (frame and epoch) for the project, from the first file. + // Initialise the 'default' datum (frame and epoch) for the project, from the first file, unless the + // frame and epoch have been set by the user, in which case InitialiseDatum has already initialised the datum. parserDynaML.InitialiseDatum(p.i.reference_frame, p.i.epoch); } catch (const XMLInteropException& e) { @@ -1516,7 +1520,10 @@ int main(int argc, char* argv[]) // if adjust is called without reftran, it reflects the datum // supplied on import p.r.reference_frame = p.i.reference_frame; - p.r.epoch = referenceepochFromEpsgCode(epsgCode); + if (p.i.user_supplied_epoch) + p.r.epoch = p.i.epoch; + else + p.r.epoch = referenceepochFromEpsgCode(epsgCode); /////////////////////////////////////////////////////////////////////////////////////////////////////////// // start "total" time From 7d591fc6557466550282a25d6effce8e31259d2c Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 12 Feb 2025 09:11:01 +1100 Subject: [PATCH 079/102] Add latest MSVC compiler versions --- dynadjust/include/config/dnaversion.hpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dynadjust/include/config/dnaversion.hpp b/dynadjust/include/config/dnaversion.hpp index 63483cbf..792c46cb 100644 --- a/dynadjust/include/config/dnaversion.hpp +++ b/dynadjust/include/config/dnaversion.hpp @@ -388,8 +388,12 @@ const char* const __plot_dll_name__ = "libdnaplot.so"; #define __COMPILER_VERSION__ "17.10, VS2022" #elif (_MSC_VER == 1941) #define __COMPILER_VERSION__ "17.11, VS2022" +#elif (_MSC_VER == 1942) +#define __COMPILER_VERSION__ "17.12, VS2022" +#elif (_MSC_VER == 1943) +#define __COMPILER_VERSION__ "17.13, VS2022" -#elif (_MSC_VER > 1941) +#elif (_MSC_VER > 1943) #define __COMPILER_VERSION__ _MSC_VER #endif #else From a9d3d4717d12fd77b0067d45a854961b0298af58 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 12 Feb 2025 09:54:27 +1100 Subject: [PATCH 080/102] Catch unrecognised frame label --- .../dnareftranwrapper/dnareftranwrapper.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index 01c0842d..db43e519 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -145,17 +145,14 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const boost::program_ try { - // Okay, no frame supplied, check the frame in the project settings. + // Okay, no frame supplied, set the frame epsg code from the project settings. // The following throws an exception if the frame is unknown - std::string epsg = epsgStringFromName(p.r.reference_frame); + epsgCode = epsgCodeFromName(p.r.reference_frame); } catch (const std::runtime_error& e) { std::cout << std::endl << "- Error: " << e.what() << std::endl; return EXIT_FAILURE; - } - - // update epsgCode - epsgCode = epsgCodeFromName(p.r.reference_frame); + } } if (!vm.count(EPOCH)) @@ -442,7 +439,15 @@ int main(int argc, char* argv[]) } } - UINT32 epsgCode(epsgCodeFromName(p.r.reference_frame)); + UINT32 epsgCode; + try { + epsgCode = epsgCodeFromName(p.r.reference_frame); + } + catch (const std::runtime_error& e) { + std::cout << "- Error: " << e.what() << std::endl; + return EXIT_FAILURE; + } + if (ParseCommandLineOptions(argc, argv, vm, p, epsgCode) != EXIT_SUCCESS) return EXIT_FAILURE; From 9e1253ec69a6dc6b0859de3cdec58c9d15e132df Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 12 Feb 2025 09:56:52 +1100 Subject: [PATCH 081/102] Update tests --- dynadjust/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/CMakeLists.txt b/dynadjust/CMakeLists.txt index 0855a5db..00e1d335 100644 --- a/dynadjust/CMakeLists.txt +++ b/dynadjust/CMakeLists.txt @@ -515,7 +515,7 @@ if (BUILD_TESTING) set_tests_properties(import-no-option import-invalid-option import-invalid-file import-nearby import-no-files import-no-frame import-no-data import-no-xsd-file import-no-geoid import-no-project import-no-stns import-no-help - import-misc-block-size import-misc-network-size + import-misc-block-size import-misc-network-size import-misc-07 PROPERTIES WILL_FAIL TRUE) ### REFTRAN ### From c3a2b5d6be39b187e3f1c8ac7ab9be380eb4ad41 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 12 Feb 2025 11:33:21 +1100 Subject: [PATCH 082/102] Update tests --- dynadjust/CMakeLists.txt | 1 + sampleData/sample.dnaproj | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dynadjust/CMakeLists.txt b/dynadjust/CMakeLists.txt index 00e1d335..676b18cb 100644 --- a/dynadjust/CMakeLists.txt +++ b/dynadjust/CMakeLists.txt @@ -254,6 +254,7 @@ if (BUILD_TESTING) file (COPY ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn DESTINATION ./) file (COPY ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr DESTINATION ./) file (COPY ${CMAKE_SOURCE_DIR}/../sampleData/sample.dnaproj DESTINATION ./) + file (COPY ${CMAKE_SOURCE_DIR}/../sampleData/urban-network-geoid.gsb DESTINATION ./) #add_test (NAME dynadjust-proj-01 COMMAND $ -p ${CMAKE_SOURCE_DIR}/../sampleData/sample.dnaproj --import --geoid --reftran --segment --adjust) #add_test (NAME dynadjust-proj-02 COMMAND $ -p ${CMAKE_SOURCE_DIR}/../sampleData/sample.dnaproj --import --geoid --reftran --segment --adjust --quiet) add_test (NAME dynadjust-name-01 COMMAND $ -n sample --import --geoid --reftran --segment --adjust) diff --git a/sampleData/sample.dnaproj b/sampleData/sample.dnaproj index 2461bf20..d2139688 100644 --- a/sampleData/sample.dnaproj +++ b/sampleData/sample.dnaproj @@ -57,7 +57,7 @@ epoch #geoid (35) VALUE -------------------------------------------------------------------------------- -ntv2-file ../../sampleData/urban-network-geoid.gsb +ntv2-file urban-network-geoid.gsb interpolation-method 1 decimal-degrees 0 direction 0 From 5f720ec2f25fea1d248398ddbe563643a0974c84 Mon Sep 17 00:00:00 2001 From: Roger Fraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 12 Feb 2025 17:01:39 +1100 Subject: [PATCH 083/102] Update BUILDING.md --- resources/BUILDING.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/BUILDING.md b/resources/BUILDING.md index 1e07cb91..25599b45 100644 --- a/resources/BUILDING.md +++ b/resources/BUILDING.md @@ -25,7 +25,7 @@ The following build instructions are only needed if you would like to build DynA To build DynAdjust, the following prerequisites will be needed: -- A C++14 compiler (e.g. gcc, Microsoft Visual Studio or Apple LLVM (clang)) +- A C++14, C++17 or C++20 compiler (e.g. gcc, Microsoft Visual Studio or Apple LLVM (clang)) - Boost C++ headers and libraries - Apache Xerces C++ headers and libraries - Codesynthesis XSD headers and libraries @@ -48,11 +48,11 @@ C++ is required for compiling all DynAdjust binaries. MFC is required only for #### 1.2 Install Boost C++ headers and libraries -The supported versions of boost are 1.58.0 – 1.78.0. The headers and library sources are available from https://www.boost.org/users/download/ +The supported versions of boost are 1.58.0 – 1.87.0. The headers and library sources are available from https://www.boost.org/users/download/ The boost libraries needed by DynAdjust include `filesystem`, `system`, `program_options`, `thread`, `date_time`, `math`, `timer`, `atomic` and `chrono`. These will need to be built from the boost C++ sources using Visual Studio 2022, and installed to a suitable folder on your machine. -Follow the instructions on the [Boost Website](https://www.boost.org/doc/libs/1_78_0/more/getting_started/windows.html#prepare-to-use-a-boost-library-binary) to build the boost libraries from source. For example, the steps are: +Follow the instructions on the [Boost Website](https://www.boost.org/doc/libs/1_87_0/more/getting_started/windows.html#prepare-to-use-a-boost-library-binary) to build the boost libraries from source. For example, the steps are: 1. Download and extract boost to a suitable folder 2. Run `Bootstrap.bat` to build `b2` @@ -191,7 +191,7 @@ The specific Linux/Mac prerequisites for building DynaAdjust include the followi - gcc-c++ (with std C++ 14 support), with a compatible version of make - cmake (minimum v3.13) - Intel oneAPI Math Kernel Library (MKL) -- boost-devel (minimum v1.58.0. v1.78.0 preferred) +- boost-devel (minimum v1.58.0. v1.87.0 preferred) - xerces-c (3.1.4) - xsd (4.0) - git (if cloning copies from the GitHub repository) From a1d63e0d47ce20ea7e1c5e30c142c9e0edea9dc7 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Thu, 13 Feb 2025 14:16:56 +1100 Subject: [PATCH 084/102] Update proj epsg code when if changed from first file datum --- .../dynadjust/dnaimportwrapper/dnaimportwrapper.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index 7bf52045..de7585dd 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -879,7 +879,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* bool firstFile; - // obtain the project reference frame epsg code + // obtain the (default) project reference frame epsg code std::string projctEpsgCode(epsgStringFromName(p.i.reference_frame)); for (i=0; i(p.i.input_files.at(i)) << " (" << inputFileDatum << ")."; + + // set the project reference frame epsg code + projctEpsgCode = epsgStringFromName(p.i.reference_frame); } else { @@ -1074,7 +1079,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* if (!p.g.quiet) std::cout << ssEpsgWarning.str() << std::endl; *imp_file << ssEpsgWarning.str() << std::endl; - } + } } // Handle discontinuities for non-sinex files, if and only if a discontinuity file has been loaded. From 7339512453324a29cec9855c742e0bdf26d54b8e Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 18 Feb 2025 09:35:48 +1100 Subject: [PATCH 085/102] Update copyright year --- dynadjust/dynadjust.rc | 2 +- dynadjust/include/config/dnaversion.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dynadjust/dynadjust.rc b/dynadjust/dynadjust.rc index c36a1d81..737c7f16 100644 --- a/dynadjust/dynadjust.rc +++ b/dynadjust/dynadjust.rc @@ -44,7 +44,7 @@ BEGIN VALUE "FileDescription", "DynAdjust is a rigorous, high performance least squares adjustment application." VALUE "FileVersion", "1.2.8.0" VALUE "InternalName", "DynAdjust" - VALUE "LegalCopyright", "Copyright 2022 Geoscience Australia" + VALUE "LegalCopyright", "Copyright 2025 Geoscience Australia" VALUE "OriginalFilename", "DynAdjust" VALUE "ProductName", "DynAdjust" VALUE "ProductVersion", "1.2.8.0" diff --git a/dynadjust/include/config/dnaversion.hpp b/dynadjust/include/config/dnaversion.hpp index 792c46cb..f51481c4 100644 --- a/dynadjust/include/config/dnaversion.hpp +++ b/dynadjust/include/config/dnaversion.hpp @@ -171,7 +171,7 @@ const char* const __plot_dll_name__ = "libdnaplot.so"; #endif #define __CONTACT_EMAIL__ "geodesy@ga.gov.au" -#define __COPYRIGHT_YEAR__ "2022" +#define __COPYRIGHT_YEAR__ "2025" #define __COPYRIGHT_OWNER__ "Geoscience Australia" #define __COPYRIGHT_MSG__ "This software is released under the Apache License." From 8f210d97c06ae3fbb35725b6875b94b76120f850 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 18 Feb 2025 19:08:47 +1100 Subject: [PATCH 086/102] Initialise epoch for static datums --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 18 ++- .../dnaimportwrapper/dnaimportwrapper.cpp | 148 ++++++++++++------ .../dnareftranwrapper/dnareftranwrapper.cpp | 12 +- 3 files changed, 124 insertions(+), 54 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index fe7b9001..1d87e27d 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -495,14 +495,15 @@ void dna_import::ParseXML(const std::string& fileName, vdnaStnPtr* vStations, PU // is specified in DynaML.xsd, this value will never be empty, unless the user // has inadvertently set in the xml file, e.g.: // - if (fileEpoch.empty()) + // Or, is the file reference frame a static datum? + if (fileEpoch.empty() || isEpsgDatumStatic(LongFromString(fileEpsg))) { // Get the epoch of the nominated epsg (whether default or from the file) fileEpoch = referenceepochFromEpsgString(fileEpsg); } // Has the user supplied a reference frame on the command line (--reference-frame)? - if (projectSettings_.i.override_input_rfame) + if (projectSettings_.i.user_supplied_frame) { // A frame has been supplied. Now check for epoch. @@ -1086,6 +1087,19 @@ void dna_import::ParseDNA(const std::string& fileName, vdnaStnPtr* vStations, PU throw XMLInteropException(e.what(), 0); } + // Set to defaults if reference frame and epoch fields are empty + if (fileEpsg.empty()) + fileEpsg = datum_.GetEpsgCode_s(); + if (fileEpoch.empty()) + fileEpoch = datum_.GetEpoch_s(); + + // Is the file reference frame a static datum? + if (isEpsgDatumStatic(LongFromString(fileEpsg))) + { + // Get the reference epoch of the nominated epsg + fileEpoch = referenceepochFromEpsgString(fileEpsg); + } + // Has the user supplied a reference frame on the command line (--reference-frame)? if (projectSettings_.i.user_supplied_frame) { diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index de7585dd..be14c879 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -240,7 +240,7 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const boost::program_ else if (p.i.epoch.rfind(".") == std::string::npos) p.i.epoch.insert(0, "01.01."); p.i.user_supplied_epoch = 1; - } + } ////////////////////////////////////////////////////////////////////////////// // Data screening options @@ -984,9 +984,11 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* // Capture the input file's default reference frame and set the // project reference frame (if not specified on the command-line) std::string inputFileEpsg(""), inputFileDatum(""), inputFileEpoch(""); + UINT32 inputFileEpsgi; try { inputFileDatum = datumFromEpsgString(input_file_meta.epsgCode); inputFileEpsg = input_file_meta.epsgCode; + inputFileEpsgi = LongFromString(inputFileEpsg); inputFileEpoch = input_file_meta.epoch; } catch (...) @@ -998,7 +1000,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* // Is this the first file? If so, attempt to set the default datum from // the input file (if applicable). - UINT32 inputFileEpsgi; + bool referenceframeChanged(false); if (firstFile) @@ -1012,29 +1014,38 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* { // Set the project defaults referenceframeChanged = true; - inputFileEpsgi = LongFromString(inputFileEpsg); + p.i.reference_frame = inputFileDatum; p.r.reference_frame = inputFileDatum; } - if (!p.i.user_supplied_epoch) + // Force reference epoch if reference frame is static + if (isEpsgDatumStatic(inputFileEpsgi)) { - if (inputFileEpoch.empty()) + p.i.epoch = referenceepochFromEpsgCode(inputFileEpsgi); + p.r.epoch = p.i.epoch; + } + else + { + if (!p.i.user_supplied_epoch) { - // Has an epoch been provided but no frame? - if (inputFileEpsg.empty()) - // revert to epoch of - p.i.epoch = referenceepochFromEpsgCode(inputFileEpsgi); + if (inputFileEpoch.empty()) + { + // Has an epoch been provided but no frame? + if (inputFileEpsg.empty()) + // revert to epoch of + p.i.epoch = referenceepochFromEpsgCode(inputFileEpsgi); + else + p.i.epoch = referenceepochFromEpsgString(projctEpsgCode); + p.r.epoch = p.i.epoch; + } else - p.i.epoch = referenceepochFromEpsgString(projctEpsgCode); - p.r.epoch = p.i.epoch; - } - else - { - p.i.epoch = inputFileEpoch; - p.r.epoch = p.i.epoch; + { + p.i.epoch = inputFileEpoch; + p.r.epoch = p.i.epoch; + } } - } + } try { // Initialise the 'default' datum (frame and epoch) for the project, from the first file, unless the @@ -1403,6 +1414,53 @@ int main(int argc, char* argv[]) vstationsTotal.clear(); vmeasurementsTotal.clear(); + dna_import parserDynaML; + + //////////////////////////////////////////////////////////////////////////////////// + // First things first! + // Set the 'default' reference frame for the binary station and measurement files + // At this point, the frame may be the hard-coded default, or a user-specified + // frame via: -r [--reference-frame] arg + // See comments in InitialiseDatum() + try { + // Initialise the 'default' datum for the project. + parserDynaML.InitialiseDatum(p.i.reference_frame, p.i.epoch); + } + catch (const XMLInteropException& e) { + + std::cout << std::endl << cmd_line_banner; + + std::stringstream ss; + ss << "- Error: "; + std::cout << ss.str() << e.what() << std::endl; + return EXIT_FAILURE; + } + + // obtain the project reference frame + UINT32 epsgCode(epsgCodeFromName(p.i.reference_frame)); + + // set the default output reference frame and epoch, so that + // if adjust is called without reftran, it reflects the datum + // supplied on import + p.r.reference_frame = p.i.reference_frame; + + // if the reference frame supplied is static, then force the epoch + // to be the reference epoch + if (isEpsgDatumStatic(epsgCode)) + { + p.i.epoch = referenceepochFromEpsgCode(epsgCode); + p.r.epoch = p.i.epoch; + } + else + { + if (p.i.user_supplied_epoch) + p.r.epoch = p.i.epoch; + else + p.r.epoch = referenceepochFromEpsgCode(epsgCode); + } + + //////////////////////////////////////////////////////////////////////////////////// + if (vm.count(QUIET)) p.g.quiet = 1; @@ -1430,10 +1488,15 @@ int main(int argc, char* argv[]) if (p.i.override_input_rfame) std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Override input file ref frame:" << yesno_string(p.i.override_input_rfame) << std::endl; - if (p.i.user_supplied_epoch) - std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project epoch:" << p.i.epoch << " (user supplied)" << std::endl; + if (isEpsgDatumStatic(epsgCode) && p.i.user_supplied_frame) + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project epoch:" << p.i.epoch << " (adopted reference epoch of " << p.i.reference_frame << ")" << std::endl; else - std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project epoch:" << "To be assumed from the first input file" << std::endl; + { + if (p.i.user_supplied_epoch) + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project epoch:" << p.i.epoch << " (user supplied)" << std::endl; + else + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project epoch:" << "To be assumed from the first input file" << std::endl; + } if (p.i.export_dynaml) { @@ -1494,7 +1557,6 @@ int main(int argc, char* argv[]) PrintOutputFileHeaderInfo(&imp_file, p.i.imp_file, &p, "DYNADJUST IMPORT LOG FILE"); - dna_import parserDynaML; MsrTally parsemsrTally; StnTally parsestnTally; @@ -1502,34 +1564,6 @@ int main(int argc, char* argv[]) vifm_t vinput_file_meta; - // First things first! - // Set the 'default' reference frame for the binary station and measurement files - // At this point, the frame may be the hard-coded default, or a user-specified - // frame via: -r [--reference-frame] arg - // See comments in InitialiseDatum() - try { - // Initialise the 'default' datum for the project. - parserDynaML.InitialiseDatum(p.i.reference_frame, p.i.epoch); - } - catch (const XMLInteropException& e) { - std::stringstream ss; - ss << "- Error: "; - std::cout << ss.str() << e.what() << std::endl; - return EXIT_FAILURE; - } - - // obtain the project reference frame - UINT32 epsgCode(epsgCodeFromName(p.i.reference_frame)); - - // set the default output reference frame and epoch, so that - // if adjust is called without reftran, it reflects the datum - // supplied on import - p.r.reference_frame = p.i.reference_frame; - if (p.i.user_supplied_epoch) - p.r.epoch = p.i.epoch; - else - p.r.epoch = referenceepochFromEpsgCode(epsgCode); - /////////////////////////////////////////////////////////////////////////////////////////////////////////// // start "total" time boost::timer::cpu_timer time; @@ -1619,7 +1653,9 @@ int main(int argc, char* argv[]) if (ImportDataFiles(parserDynaML, &vStations, &vMeasurements, &vstationsTotal, &vmeasurementsTotal, &imp_file, &vinput_file_meta, &parsestnTally, &parsemsrTally, errorCount, p) != EXIT_SUCCESS) return EXIT_FAILURE; - } + } + + epsgCode = epsgCodeFromName(p.i.reference_frame); if (!p.g.quiet) std::cout << std::endl; @@ -1894,6 +1930,7 @@ int main(int argc, char* argv[]) if (!p.i.user_supplied_frame && !p.i.import_block && !p.i.import_network) { + // reference frame std::stringstream datumSource; switch (vinput_file_meta.at(0).filetype) { @@ -1907,6 +1944,17 @@ int main(int argc, char* argv[]) if (!p.g.quiet) std::cout << std::setw(PRINT_VAR_PAD) << std::left << "+ Project reference frame:" << p.i.reference_frame << datumSource.str() << std::endl; imp_file << std::setw(PRINT_VAR_PAD) << std::left << "+ Project reference frame:" << p.i.reference_frame << datumSource.str() << std::endl; + + // epoch + std::stringstream epochSource; + if (isEpsgDatumStatic(epsgCode)) + epochSource << ". Adopted static reference epoch (" << p.i.reference_frame << ")"; + else + epochSource << ". Taken from first file (" << FormatFileType(vinput_file_meta.at(0).filetype) << ")"; + + if (!p.g.quiet) + std::cout << std::setw(PRINT_VAR_PAD) << std::left << "+ Project epoch:" << p.i.epoch << epochSource.str() << std::endl; + imp_file << std::setw(PRINT_VAR_PAD) << std::left << "+ Project epoch:" << p.i.epoch << epochSource.str() << std::endl; } if (!p.g.quiet) diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index db43e519..50f746d6 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -444,14 +444,20 @@ int main(int argc, char* argv[]) epsgCode = epsgCodeFromName(p.r.reference_frame); } catch (const std::runtime_error& e) { + std::cout << std::endl << cmd_line_banner; + std::cout << "- Error: " << e.what() << std::endl; return EXIT_FAILURE; } - if (ParseCommandLineOptions(argc, argv, vm, p, epsgCode) != EXIT_SUCCESS) return EXIT_FAILURE; + // if the reference frame supplied is static, then force the epoch + // to be the reference epoch + if (isEpsgDatumStatic(epsgCode)) + p.r.epoch = referenceepochFromEpsgCode(epsgCode); + std::ofstream rft_file; try { // Create import log file. Throws runtime_error on failure. @@ -464,6 +470,8 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } + + if (vm.count(QUIET)) p.g.quiet = 1; @@ -496,7 +504,7 @@ int main(int argc, char* argv[]) std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Target epoch: " << formattedDateStringFromNumericString(p.r.epoch); if (isEpsgDatumStatic(epsgCode)) - std::cout << " (ignored: " << p.r.reference_frame << " is static)"; + std::cout << " (adopted reference epoch of " << p.r.reference_frame << ")"; std::cout << std::endl; } } From e790454a8e15e93d65b7a1a00b0d644dc0270e5d Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Tue, 18 Feb 2025 20:13:37 +1100 Subject: [PATCH 087/102] Fix handling of static datum epoch --- .../dnaimportwrapper/dnaimportwrapper.cpp | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index be14c879..60c20d47 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -880,7 +880,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* bool firstFile; // obtain the (default) project reference frame epsg code - std::string projctEpsgCode(epsgStringFromName(p.i.reference_frame)); + std::string projectEpsgCode(epsgStringFromName(p.i.reference_frame)); for (i=0; i(p.i.reference_frame); } - - // Force reference epoch if reference frame is static - if (isEpsgDatumStatic(inputFileEpsgi)) + + // Has the user supplied a static reference frame? + // If so, set the epoch + if (p.i.user_supplied_frame && isEpsgDatumStatic(LongFromString(projectEpsgCode))) { - p.i.epoch = referenceepochFromEpsgCode(inputFileEpsgi); + p.i.epoch = referenceepochFromEpsgString(projectEpsgCode); p.r.epoch = p.i.epoch; } - else + else if (!p.i.user_supplied_epoch) { - if (!p.i.user_supplied_epoch) + if (inputFileEpoch.empty()) + { + // revert to epoch of the file frame + p.i.epoch = referenceepochFromEpsgCode(inputFileEpsgi); + p.r.epoch = p.i.epoch; + } + else { - if (inputFileEpoch.empty()) - { - // Has an epoch been provided but no frame? - if (inputFileEpsg.empty()) - // revert to epoch of - p.i.epoch = referenceepochFromEpsgCode(inputFileEpsgi); - else - p.i.epoch = referenceepochFromEpsgString(projctEpsgCode); - p.r.epoch = p.i.epoch; - } - else - { - p.i.epoch = inputFileEpoch; - p.r.epoch = p.i.epoch; - } + p.i.epoch = inputFileEpoch; + p.r.epoch = p.i.epoch; } - } + } + try { // Initialise the 'default' datum (frame and epoch) for the project, from the first file, unless the @@ -1070,7 +1066,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* *imp_file << ssEpsgWarning.str() << std::endl; } // Is the datum in the first file different to the project datum? - else if (!boost::iequals(projctEpsgCode, input_file_meta.epsgCode)) + else if (!boost::iequals(projectEpsgCode, input_file_meta.epsgCode)) { std::stringstream ssEpsgWarning; if (referenceframeChanged) @@ -1079,7 +1075,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* " file datum of " << leafStr(p.i.input_files.at(i)) << " (" << inputFileDatum << ")."; // set the project reference frame epsg code - projctEpsgCode = epsgStringFromName(p.i.reference_frame); + projectEpsgCode = epsgStringFromName(p.i.reference_frame); } else { From 55a242a428c89588d728f80a2325f01b9ac5f334 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Wed, 19 Feb 2025 15:50:10 +1100 Subject: [PATCH 088/102] UI enhancements --- .../dnaimportwrapper/dnaimportwrapper.cpp | 45 ++++++++++++------- .../dnareftranwrapper/dnareftranwrapper.cpp | 8 ++-- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index 60c20d47..b1ba4105 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -61,21 +61,27 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const std::string& out_file } // If a reference frame has been supplied, report it. - // If not, the assumption is, the project frame will be assumed from the first file and + // If not, the assumption is, the project frame will be adopted from the first file and // in this case, it will be reported later if (p->i.user_supplied_frame) *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Project reference frame:" << p->i.reference_frame << " (user supplied)" << std::endl; else - *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Project reference frame:" << "To be assumed from the first input file" << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Project reference frame:" << "To be adopted from the first input file" << std::endl; if (p->i.override_input_rfame) *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Override input file ref frame:" << yesno_string(p->i.override_input_rfame) << std::endl; - if (p->i.user_supplied_epoch) - *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Project epoch:" << p->i.epoch << " (user supplied)" << std::endl; - else - *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Project epoch:" << "To be assumed from the first input file" << std::endl; + UINT32 epsgCode(epsgCodeFromName(p->i.reference_frame)); + if (isEpsgDatumStatic(epsgCode) && p->i.user_supplied_frame) + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Project epoch:" << p->i.epoch << " (adopted reference epoch of " << p->i.reference_frame << ")" << std::endl; + else + { + if (p->i.user_supplied_epoch) + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Project epoch:" << p->i.epoch << " (user supplied)" << std::endl; + else + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Project epoch:" << "To be adopted from the first input file" << std::endl; + } if (!p->i.include_msrs.empty()) *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Strip all measurements except:" << p->i.include_msrs << std::endl; @@ -830,7 +836,7 @@ int ImportContiguousNetwork(dna_import& parserDynaML, vdnaStnPtr* vStations, vdn int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, vdnaStnPtr* vstationsTotal, vdnaMsrPtr* vmeasurementsTotal, std::ofstream* imp_file, vifm_t* vinput_file_meta, StnTally* parsestnTally, MsrTally* parsemsrTally, - UINT32& errorCount, project_settings& p) + UINT32& errorCount, project_settings& p, bool& firstfileDatumProvided) { // For consideration: // - All input files could be read concurrently using multi-thread for faster input @@ -1002,10 +1008,11 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* // the input file (if applicable). bool referenceframeChanged(false); - + if (firstFile) { // Determine if the project reference frame needs to be changed + firstfileDatumProvided = parserDynaML.filespecifiedReferenceFrame(); // If the user has not provided a reference frame, then inspect the file reference frame // If the file does not contain a reference frame (e.g. SNX) or the user has left it blank, @@ -1060,7 +1067,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* if (!parserDynaML.filespecifiedReferenceFrame()) { std::stringstream ssEpsgWarning; - ssEpsgWarning << " - Warning: Input file reference frame empty. Assuming the default reference frame (" << inputFileDatum << ")."; + ssEpsgWarning << " - Warning: Input file reference frame not supplied. Adopting " << inputFileDatum << "."; if (!p.g.quiet) std::cout << ssEpsgWarning.str() << std::endl; *imp_file << ssEpsgWarning.str() << std::endl; @@ -1073,13 +1080,13 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* { ssEpsgWarning << " - Warning: The project reference frame has been set to the default" << std::endl << " file datum of " << leafStr(p.i.input_files.at(i)) << " (" << inputFileDatum << ")."; - + // set the project reference frame epsg code projectEpsgCode = epsgStringFromName(p.i.reference_frame); } - else + else { - ssEpsgWarning << " - Warning: Input file reference frame (" << inputFileDatum << ") does not match the " << std::endl << + ssEpsgWarning << " - Warning: Input file reference frame (" << inputFileDatum << ") does not match the " << std::endl << " project reference frame (" << p.i.reference_frame << ")."; } @@ -1474,12 +1481,12 @@ int main(int argc, char* argv[]) std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Binary measurement output file: " << p.i.bms_file << std::endl; // If a reference frame and epoch have been supplied, report them. - // If not, the assumption is, the project frame and epoch will be assumed from the first file and + // If not, the assumption is, the project frame and epoch will be adopted from the first file and // in this case, it will be reported later if (p.i.user_supplied_frame) std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project reference frame:" << p.i.reference_frame << " (user supplied)" << std::endl; else - std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project reference frame:" << "To be assumed from the first input file" << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project reference frame:" << "To be adopted from the first input file" << std::endl; if (p.i.override_input_rfame) std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Override input file ref frame:" << yesno_string(p.i.override_input_rfame) << std::endl; @@ -1491,7 +1498,7 @@ int main(int argc, char* argv[]) if (p.i.user_supplied_epoch) std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project epoch:" << p.i.epoch << " (user supplied)" << std::endl; else - std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project epoch:" << "To be assumed from the first input file" << std::endl; + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Project epoch:" << "To be adopted from the first input file" << std::endl; } if (p.i.export_dynaml) @@ -1616,6 +1623,7 @@ int main(int argc, char* argv[]) // Now, set the 'default' epoch in the binary station and measurement files std::string default_datum = p.i.reference_frame; + bool firstfileDatumProvided; // Import network information based on a segmentation block? if (p.i.import_block) @@ -1647,7 +1655,7 @@ int main(int argc, char* argv[]) // Import all data as-is. // All filtering is performed later below if (ImportDataFiles(parserDynaML, &vStations, &vMeasurements, &vstationsTotal, &vmeasurementsTotal, - &imp_file, &vinput_file_meta, &parsestnTally, &parsemsrTally, errorCount, p) != EXIT_SUCCESS) + &imp_file, &vinput_file_meta, &parsestnTally, &parsemsrTally, errorCount, p, firstfileDatumProvided) != EXIT_SUCCESS) return EXIT_FAILURE; } @@ -1934,7 +1942,10 @@ int main(int argc, char* argv[]) datumSource << ". DynAdjust default (frame not found in SNX)"; break; default: - datumSource << ". Taken from first file (" << FormatFileType(vinput_file_meta.at(0).filetype) << ")"; + if (firstfileDatumProvided) + datumSource << ". Taken from first file (" << FormatFileType(vinput_file_meta.at(0).filetype) << ")"; + else + datumSource << ". Adopted when reference frame not supplied in first input file"; } if (!p.g.quiet) diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index 50f746d6..3ac4ae17 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -47,10 +47,9 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const std::string& out_file if (p->r.epoch.rfind(".") == std::string::npos) p->r.epoch.insert(0, "01.01."); - *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Target epoch: " << - formattedDateStringFromNumericString(p->r.epoch); + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Target epoch: " << p->r.epoch; if (isEpsgDatumStatic(epsgCode)) - *f_out << " (ignored: " << p->r.reference_frame << " is static)"; + *f_out << " (adopted reference epoch of " << p->r.reference_frame << ")"; *f_out << std::endl; } @@ -501,8 +500,7 @@ int main(int argc, char* argv[]) if (p.r.epoch.rfind(".") == std::string::npos) p.r.epoch.insert(0, "01.01."); - std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Target epoch: " << - formattedDateStringFromNumericString(p.r.epoch); + std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Target epoch: " << p.r.epoch; if (isEpsgDatumStatic(epsgCode)) std::cout << " (adopted reference epoch of " << p.r.reference_frame << ")"; std::cout << std::endl; From a31707a966b8424b48519799f31b1a11170e9804 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Thu, 20 Feb 2025 10:46:43 +1100 Subject: [PATCH 089/102] Initialise default epoch --- dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp | 2 +- dynadjust/include/config/dnaoptions.hpp | 2 +- dynadjust/include/io/dnaiobase.cpp | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp index 4f4b94e1..3fef13b9 100644 --- a/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp +++ b/dynadjust/dynadjust/dnaadjustwrapper/dnaadjustwrapper.cpp @@ -1086,7 +1086,7 @@ int main(int argc, char* argv[]) if (bst_meta.reftran) datum.SetDatumFromName(p.r.reference_frame, p.r.epoch); else - datum.SetDatumFromName(p.i.reference_frame, bst_meta.epoch); + datum.SetDatumFromName(p.i.reference_frame, p.i.epoch); if (vm.count(QUIET)) p.g.quiet = 1; diff --git a/dynadjust/include/config/dnaoptions.hpp b/dynadjust/include/config/dnaoptions.hpp index fba08342..f5ebc00c 100644 --- a/dynadjust/include/config/dnaoptions.hpp +++ b/dynadjust/include/config/dnaoptions.hpp @@ -302,7 +302,7 @@ struct reftran_settings : private boost::equality_comparable { public: reftran_settings() : rft_file(""), bst_file(""), bms_file("") - , reference_frame(DEFAULT_DATUM), epoch("") + , reference_frame(DEFAULT_DATUM), epoch(DEFAULT_EPOCH) , tpb_file(""), tpp_file("") , plate_model_option(0) , command_line_arguments("") {} diff --git a/dynadjust/include/io/dnaiobase.cpp b/dynadjust/include/io/dnaiobase.cpp index a47fd6d4..2e74d2a5 100644 --- a/dynadjust/include/io/dnaiobase.cpp +++ b/dynadjust/include/io/dnaiobase.cpp @@ -97,6 +97,8 @@ void dna_io_base::writeFileMetadata(std::ofstream& file_stream, binary_file_meta for (UINT16 i(0); i(file_meta.inputFileMeta[i].filename), FILE_NAME_WIDTH); + file_stream.write(reinterpret_cast(file_meta.inputFileMeta[i].epsgCode), STN_EPSG_WIDTH); + file_stream.write(reinterpret_cast(file_meta.inputFileMeta[i].epoch), STN_EPOCH_WIDTH); file_stream.write(reinterpret_cast(&file_meta.inputFileMeta[i].filetype), sizeof(UINT16)); file_stream.write(reinterpret_cast(&file_meta.inputFileMeta[i].datatype), sizeof(UINT16)); } @@ -127,6 +129,8 @@ void dna_io_base::readFileMetadata(std::ifstream& file_stream, binary_file_meta_ for (UINT16 i(0); i(file_meta.inputFileMeta[i].filename), FILE_NAME_WIDTH); + file_stream.read(reinterpret_cast(file_meta.inputFileMeta[i].epsgCode), STN_EPSG_WIDTH); + file_stream.read(reinterpret_cast(file_meta.inputFileMeta[i].epoch), STN_EPOCH_WIDTH); file_stream.read(reinterpret_cast(&file_meta.inputFileMeta[i].filetype), sizeof(UINT16)); file_stream.read(reinterpret_cast(&file_meta.inputFileMeta[i].datatype), sizeof(UINT16)); } From 2fd038fe6bc1c7996d78baf033aa41e3c1794156 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Thu, 20 Feb 2025 15:43:08 +1100 Subject: [PATCH 090/102] Frame and epoch warning and error enhancements --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 6 + dynadjust/dynadjust/dnaimport/dnainterop.hpp | 2 + .../dynadjust/dnaimport/dnaparser_pimpl.cxx | 1 + .../dynadjust/dnaimport/dnaparser_pimpl.hxx | 1 + .../dynadjust/dnaimport/dnaparser_pskel.cxx | 1 + .../dynadjust/dnaimport/dnaparser_pskel.hxx | 1 + .../dnaimportwrapper/dnaimportwrapper.cpp | 227 +++++++++++++----- dynadjust/include/io/dnaiodna.cpp | 13 +- dynadjust/include/io/dnaiodna.hpp | 10 +- dynadjust/include/parameters/dnaepsg.hpp | 14 +- 10 files changed, 197 insertions(+), 79 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index 1d87e27d..0eeffc94 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -232,6 +232,7 @@ _PARSE_STATUS_ dna_import::ParseInputFile(const std::string& fileName, vdnaStnPt percentComplete_ = -99.0; isProcessing_ = true; _filespecifiedreferenceframe = false; + _filespecifiedepoch = false; std::stringstream ss; try @@ -399,6 +400,7 @@ void dna_import::ParseXML(const std::string& fileName, vdnaStnPtr* vStations, PU parseStatus_ = PARSE_SUCCESS; _filespecifiedreferenceframe = false; + _filespecifiedepoch = false; try { @@ -476,6 +478,7 @@ void dna_import::ParseXML(const std::string& fileName, vdnaStnPtr* vStations, PU *msrCount = DnaXmlFormat_p.NumMeasurementsRead(); *success_msg = DnaXmlFormat_p.DnaXmlParseMessage() + "\n"; _filespecifiedreferenceframe = DnaXmlFormat_p.filespecifiedreferenceframe(); + _filespecifiedepoch = DnaXmlFormat_p.filespecifiedepoch(); try { @@ -649,6 +652,7 @@ void dna_import::ParseSNX(const std::string& fileName, vdnaStnPtr* vStations, PU catch (const std::runtime_error& e) { SignalExceptionParse(e.what(), 0); } + _filespecifiedepoch = true; } // Parse discontinuities and create discontinuity tuple @@ -1084,6 +1088,7 @@ void dna_import::ParseDNA(const std::string& fileName, vdnaStnPtr* vStations, PU } catch (const std::runtime_error& e) { import_file_mutex.unlock(); + parseStatus_ = PARSE_EXCEPTION_RAISED; throw XMLInteropException(e.what(), 0); } @@ -1141,6 +1146,7 @@ void dna_import::ParseDNA(const std::string& fileName, vdnaStnPtr* vStations, PU } _filespecifiedreferenceframe = dnaFile.filespecifiedReferenceFrame(); + _filespecifiedepoch = dnaFile.filespecifiedEpoch(); // Station file if (idt == stn_data || diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.hpp b/dynadjust/dynadjust/dnaimport/dnainterop.hpp index 2384a512..dd1cb9dd 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.hpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.hpp @@ -186,6 +186,7 @@ class dna_import { inline void ResetFileOrder() const { g_fileOrder = 0; } inline bool filespecifiedReferenceFrame() const { return _filespecifiedreferenceframe; } + inline bool filespecifiedEpoch() const { return _filespecifiedepoch; } void InitialiseDatum(const std::string& reference_frame, const std::string epoch=""); void PrintMeasurementsToStations(std::string& m2s_file, MsrTally* parsemsrTally, @@ -376,6 +377,7 @@ class dna_import { vUINT32 v_measurementCount_, v_unknownsCount_, v_ContiguousNetList_, v_parameterStationCount_; bool _filespecifiedreferenceframe; + bool _filespecifiedepoch; }; diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index c495cb1b..e0ea6537 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -951,6 +951,7 @@ DnaXmlFormat_pimpl::DnaXmlFormat_pimpl(std::ifstream* is, PUINT32 clusterID, con // Has the user supplied a reference frame and should this be used to override all? _userspecifiedreferenceframe = userspecifiedreferenceframe; _filespecifiedreferenceframe = false; + _filespecifiedepoch = false; _overridereferenceframe = overridereferenceframe; _userspecifiedepoch = userspecifiedepoch; } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx index 7d27fbd7..187dde41 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.hxx @@ -126,6 +126,7 @@ public: virtual void epoch (); virtual void post_DnaXmlFormat (vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements); inline bool filespecifiedreferenceframe() { return _filespecifiedreferenceframe; } + inline bool filespecifiedepoch() { return _filespecifiedepoch; } std::string DnaXmlParseMessage() { return _parse_msg; } diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx index 3f528191..d5ca0718 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.cxx @@ -2150,6 +2150,7 @@ bool DnaXmlFormat_pskel::_attribute_impl (const ::xml_schema::ro_string& ns, _userspecifiedreferenceframe, _userspecifiedepoch, _firstFile); this->epoch(); + _filespecifiedepoch = true; } return true; diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx index 9092dc1b..4166b357 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pskel.hxx @@ -850,6 +850,7 @@ protected: bool _filespecifiedreferenceframe; bool _overridereferenceframe; bool _userspecifiedepoch; + bool _filespecifiedepoch; }; class GPSBaseline_pskel: public ::xml_schema::complex_content diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index b1ba4105..ec087237 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -836,7 +836,7 @@ int ImportContiguousNetwork(dna_import& parserDynaML, vdnaStnPtr* vStations, vdn int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* vMeasurements, vdnaStnPtr* vstationsTotal, vdnaMsrPtr* vmeasurementsTotal, std::ofstream* imp_file, vifm_t* vinput_file_meta, StnTally* parsestnTally, MsrTally* parsemsrTally, - UINT32& errorCount, project_settings& p, bool& firstfileDatumProvided) + UINT32& errorCount, project_settings& p) { // For consideration: // - All input files could be read concurrently using multi-thread for faster input @@ -1008,11 +1008,11 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* // the input file (if applicable). bool referenceframeChanged(false); + bool epochChanged(false); if (firstFile) { - // Determine if the project reference frame needs to be changed - firstfileDatumProvided = parserDynaML.filespecifiedReferenceFrame(); + bool isStaticFrame(false); // If the user has not provided a reference frame, then inspect the file reference frame // If the file does not contain a reference frame (e.g. SNX) or the user has left it blank, @@ -1026,10 +1026,12 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* p.r.reference_frame = inputFileDatum; projectEpsgCode = epsgStringFromName(p.i.reference_frame); } + + isStaticFrame = isEpsgDatumStatic(LongFromString(projectEpsgCode)); // Has the user supplied a static reference frame? // If so, set the epoch - if (p.i.user_supplied_frame && isEpsgDatumStatic(LongFromString(projectEpsgCode))) + if (p.i.user_supplied_frame && isStaticFrame) { p.i.epoch = referenceepochFromEpsgString(projectEpsgCode); p.r.epoch = p.i.epoch; @@ -1061,39 +1063,169 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* std::cout << ss.str() << e.what() << std::endl; return EXIT_FAILURE; } - } - // Was the datum field empty in the first file? - if (!parserDynaML.filespecifiedReferenceFrame()) - { - std::stringstream ssEpsgWarning; - ssEpsgWarning << " - Warning: Input file reference frame not supplied. Adopting " << inputFileDatum << "."; - if (!p.g.quiet) - std::cout << ssEpsgWarning.str() << std::endl; - *imp_file << ssEpsgWarning.str() << std::endl; + if (p.i.import_block || p.i.import_network) + continue; + + // When the user has not supplied a frame on the command line + if (!p.i.user_supplied_frame) + { + // reference frame + std::stringstream datumSource; + switch (input_file_meta.filetype) + { + case sinex: + datumSource << ". DynAdjust default (frame not present within SNX file)"; + break; + default: + if (parserDynaML.filespecifiedReferenceFrame()) + datumSource << ". Taken from " << FormatFileType(input_file_meta.filetype) << " header."; + else + datumSource << ". Reference frame not supplied in " << FormatFileType(input_file_meta.filetype) << " header."; + } + + if (!p.g.quiet) + std::cout << std::left << " Project reference frame set to " << p.i.reference_frame << datumSource.str() << std::endl; + *imp_file << std::left << " Project reference frame set to " << p.i.reference_frame << datumSource.str() << std::endl; + } + // When the user has supplied a frame on the command line, and the input file datum field is blank + else if (!parserDynaML.filespecifiedReferenceFrame()) + { + std::stringstream ssEpsgWarning; + switch (input_file_meta.filetype) + { + case sinex: + ssEpsgWarning << " - Warning: SNX reference frame set to " << p.i.reference_frame << "."; + break; + default: + ssEpsgWarning << " - Warning: Input file reference frame not supplied. Adopting " << inputFileDatum << "."; + } + + if (!p.g.quiet) + std::cout << ssEpsgWarning.str() << std::endl; + *imp_file << ssEpsgWarning.str() << std::endl; + } + // when reference frame has been supplied and the value in the file doesn't match + else if (p.i.user_supplied_frame) + { + if (!boost::iequals(projectEpsgCode, input_file_meta.epsgCode)) + { + std::stringstream ssEpsgWarning; + ssEpsgWarning << " - Warning: Input file reference frame (" << inputFileDatum << ") does not match the " << std::endl << + " project reference frame (" << p.i.reference_frame << ")."; + if (!p.g.quiet) + std::cout << ssEpsgWarning.str() << std::endl; + *imp_file << ssEpsgWarning.str() << std::endl; + } + } + + // When the user has not supplied an epoch on the command line + if (!p.i.user_supplied_epoch) + { + // epoch + std::stringstream epochSource; + if (!isStaticFrame) + { + if (parserDynaML.filespecifiedEpoch()) + epochSource << ". Taken from " << FormatFileType(input_file_meta.filetype) << " header."; + else + epochSource << ". Epoch not supplied in " << FormatFileType(input_file_meta.filetype) << " header."; + if (!p.g.quiet) + std::cout << std::left << " Project epoch set to " << p.i.epoch << epochSource.str() << std::endl; + *imp_file << std::left << " Project epoch set to " << p.i.epoch << epochSource.str() << std::endl; + epochChanged = true; + } + } + // When the user has supplied an epoch on the command line, and the input file epoch field is blank + else if (!parserDynaML.filespecifiedEpoch()) + { + std::stringstream ssEpochWarning; + ssEpochWarning << " - Warning: Input file epoch not supplied. Adopting " << p.i.epoch << "."; + + if (!p.g.quiet) + std::cout << ssEpochWarning.str() << std::endl; + *imp_file << ssEpochWarning.str() << std::endl; + } + // when epoch has been supplied and the value in the file doesn't match + else if (p.i.user_supplied_epoch) + { + if (!boost::iequals(p.i.epoch, input_file_meta.epoch)) + { + std::stringstream ssEpochWarning; + ssEpochWarning << " - Warning: Input file epoch (" << inputFileEpoch << ") does not match the " << std::endl << + " project epoch (" << p.i.epoch << ")."; + if (!p.g.quiet) + std::cout << ssEpochWarning.str() << std::endl; + *imp_file << ssEpochWarning.str() << std::endl; + } + } + + if (referenceframeChanged || epochChanged) + { + if (!p.g.quiet) + std::cout << std::endl; + *imp_file << std::endl; + } } - // Is the datum in the first file different to the project datum? - else if (!boost::iequals(projectEpsgCode, input_file_meta.epsgCode)) + else { - std::stringstream ssEpsgWarning; - if (referenceframeChanged) + if (p.i.import_block || p.i.import_network) + continue; + + // Was the datum field empty in the file? + if (!parserDynaML.filespecifiedReferenceFrame()) + { + std::stringstream ssEpsgWarning; + ssEpsgWarning << " - Warning: Input file reference frame not supplied. Adopting " << inputFileDatum << "."; + if (!p.g.quiet) + std::cout << ssEpsgWarning.str() << std::endl; + *imp_file << ssEpsgWarning.str() << std::endl; + } + // Is the datum in the file different to the project datum? + else if (!boost::iequals(projectEpsgCode, input_file_meta.epsgCode)) { - ssEpsgWarning << " - Warning: The project reference frame has been set to the default" << std::endl << - " file datum of " << leafStr(p.i.input_files.at(i)) << " (" << inputFileDatum << ")."; + std::stringstream ssEpsgWarning; + if (referenceframeChanged) + { + ssEpsgWarning << " - Warning: The project reference frame has been set to the default" << std::endl << + " file datum of " << leafStr(p.i.input_files.at(i)) << " (" << inputFileDatum << ")."; - // set the project reference frame epsg code - projectEpsgCode = epsgStringFromName(p.i.reference_frame); + // set the project reference frame epsg code + projectEpsgCode = epsgStringFromName(p.i.reference_frame); + } + else + { + ssEpsgWarning << " - Warning: Input file reference frame (" << inputFileDatum << ") does not match the " << std::endl << + " project reference frame (" << p.i.reference_frame << ")."; + } + + if (!p.g.quiet) + std::cout << ssEpsgWarning.str() << std::endl; + *imp_file << ssEpsgWarning.str() << std::endl; } - else + + // Was the epoch field empty in the file? + if (!parserDynaML.filespecifiedEpoch()) { - ssEpsgWarning << " - Warning: Input file reference frame (" << inputFileDatum << ") does not match the " << std::endl << - " project reference frame (" << p.i.reference_frame << ")."; + std::stringstream ssEpochWarning; + ssEpochWarning << " - Warning: Input file epoch not supplied. Adopting " << p.i.epoch << "."; + if (!p.g.quiet) + std::cout << ssEpochWarning.str() << std::endl; + *imp_file << ssEpochWarning.str() << std::endl; } + // Is the epoch in the file different to the project epoch? + else if (!boost::iequals(p.i.epoch, input_file_meta.epoch)) + { + std::stringstream ssEpochWarning; + + ssEpochWarning << " - Warning: Input file epoch (" << inputFileEpoch << ") does not match the " << std::endl << + " project epoch (" << p.i.epoch << ")."; - if (!p.g.quiet) - std::cout << ssEpsgWarning.str() << std::endl; - *imp_file << ssEpsgWarning.str() << std::endl; - } + if (!p.g.quiet) + std::cout << ssEpochWarning.str() << std::endl; + *imp_file << ssEpochWarning.str() << std::endl; + } + } } // Handle discontinuities for non-sinex files, if and only if a discontinuity file has been loaded. @@ -1432,10 +1564,12 @@ int main(int argc, char* argv[]) catch (const XMLInteropException& e) { std::cout << std::endl << cmd_line_banner; + imp_file << std::endl << cmd_line_banner; std::stringstream ss; ss << "- Error: "; std::cout << ss.str() << e.what() << std::endl; + imp_file << ss.str() << e.what() << std::endl; return EXIT_FAILURE; } @@ -1623,8 +1757,7 @@ int main(int argc, char* argv[]) // Now, set the 'default' epoch in the binary station and measurement files std::string default_datum = p.i.reference_frame; - bool firstfileDatumProvided; - + // Import network information based on a segmentation block? if (p.i.import_block) { @@ -1655,7 +1788,7 @@ int main(int argc, char* argv[]) // Import all data as-is. // All filtering is performed later below if (ImportDataFiles(parserDynaML, &vStations, &vMeasurements, &vstationsTotal, &vmeasurementsTotal, - &imp_file, &vinput_file_meta, &parsestnTally, &parsemsrTally, errorCount, p, firstfileDatumProvided) != EXIT_SUCCESS) + &imp_file, &vinput_file_meta, &parsestnTally, &parsemsrTally, errorCount, p) != EXIT_SUCCESS) return EXIT_FAILURE; } @@ -1932,38 +2065,6 @@ int main(int argc, char* argv[]) UINT32 stnCount(static_cast(vstationsTotal.size())); UINT32 msrCount(static_cast(vmeasurementsTotal.size())); - if (!p.i.user_supplied_frame && !p.i.import_block && !p.i.import_network) - { - // reference frame - std::stringstream datumSource; - switch (vinput_file_meta.at(0).filetype) - { - case sinex: - datumSource << ". DynAdjust default (frame not found in SNX)"; - break; - default: - if (firstfileDatumProvided) - datumSource << ". Taken from first file (" << FormatFileType(vinput_file_meta.at(0).filetype) << ")"; - else - datumSource << ". Adopted when reference frame not supplied in first input file"; - } - - if (!p.g.quiet) - std::cout << std::setw(PRINT_VAR_PAD) << std::left << "+ Project reference frame:" << p.i.reference_frame << datumSource.str() << std::endl; - imp_file << std::setw(PRINT_VAR_PAD) << std::left << "+ Project reference frame:" << p.i.reference_frame << datumSource.str() << std::endl; - - // epoch - std::stringstream epochSource; - if (isEpsgDatumStatic(epsgCode)) - epochSource << ". Adopted static reference epoch (" << p.i.reference_frame << ")"; - else - epochSource << ". Taken from first file (" << FormatFileType(vinput_file_meta.at(0).filetype) << ")"; - - if (!p.g.quiet) - std::cout << std::setw(PRINT_VAR_PAD) << std::left << "+ Project epoch:" << p.i.epoch << epochSource.str() << std::endl; - imp_file << std::setw(PRINT_VAR_PAD) << std::left << "+ Project epoch:" << p.i.epoch << epochSource.str() << std::endl; - } - if (!p.g.quiet) std::cout << std::endl; imp_file << std::endl; diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index ad42a57f..1ac45eea 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -256,6 +256,7 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, std::string& version, INPUT getline((*ptr), sBuf); sBuf = trimstr(sBuf); m_filespecifiedReferenceFrame_ = false; + m_filespecifiedEpoch_ = false; // Set the default version version = "1.00"; @@ -360,6 +361,9 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, std::string& version, INPUT epoch_version = ""; } + if (!epoch_version.empty()) + m_filespecifiedEpoch_ = true; + // Try to get the reference frame // For the first file, and unless the user has specified a reference frame, // the reference frame will be used to set the frame for all other files. @@ -380,13 +384,8 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, std::string& version, INPUT // capture file epoch if (epoch_version.empty()) { - // Empty? Get the epoch of the nominated epsg, set from either - // project or from the file - if (user_supplied_frame) - fileEpoch = referenceframe.GetEpoch_s(); - else - // take from file's epsg's epoch - fileEpoch = referenceepochFromEpsgString(fileEpsg); + // Empty? Get the epoch of the nominated epsg (set above) + fileEpoch = referenceepochFromEpsgString(fileEpsg); } else fileEpoch = epoch_version; diff --git a/dynadjust/include/io/dnaiodna.hpp b/dynadjust/include/io/dnaiodna.hpp index d5f694d6..1362331c 100644 --- a/dynadjust/include/io/dnaiodna.hpp +++ b/dynadjust/include/io/dnaiodna.hpp @@ -51,12 +51,16 @@ class dna_io_dna : public dna_io_base dna_io_dna(void) : pv_msr_db_map_(0) , m_databaseIDsSet_(false) - , m_filespecifiedReferenceFrame_(false) {}; + , m_filespecifiedReferenceFrame_(false) + , m_filespecifiedEpoch_(false) { + }; dna_io_dna(const dna_io_dna& dna) : dna_io_base(dna) , pv_msr_db_map_(0) , m_databaseIDsSet_(false) - , m_filespecifiedReferenceFrame_(false) {}; + , m_filespecifiedReferenceFrame_(false) + , m_filespecifiedEpoch_(false) { + }; virtual ~dna_io_dna(void) {}; dna_io_dna& operator=(const dna_io_dna& rhs); @@ -102,6 +106,7 @@ class dna_io_dna : public dna_io_base void set_dbid_ptr(pv_msr_database_id_map pv_msr_db_map); inline bool filespecifiedReferenceFrame() { return m_filespecifiedReferenceFrame_; } + inline bool filespecifiedEpoch() { return m_filespecifiedEpoch_; } protected: @@ -138,6 +143,7 @@ class dna_io_dna : public dna_io_base pv_msr_database_id_map pv_msr_db_map_; bool m_databaseIDsSet_; bool m_filespecifiedReferenceFrame_; + bool m_filespecifiedEpoch_; }; } // namespace iostreams diff --git a/dynadjust/include/parameters/dnaepsg.hpp b/dynadjust/include/parameters/dnaepsg.hpp index e69fbf86..afd0b462 100644 --- a/dynadjust/include/parameters/dnaepsg.hpp +++ b/dynadjust/include/parameters/dnaepsg.hpp @@ -181,7 +181,7 @@ U epsgCodeFromName(const S& datumName) return WGS84_G2139_i_xyz; std::stringstream ss; - ss << "epsgCodeFromName: " << datumName << " is not a supported reference frame label." << std::endl; + ss << " epsgCodeFromName: " << datumName << " is not a supported reference frame label." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } @@ -280,7 +280,7 @@ S epsgStringFromName(const S& datumName) } std::stringstream ss; - ss << "epsgCodeFromName: " << datumName << " is either unknown or not yet supported." << std::endl; + ss << " epsgStringFromName: " << datumName << " is either unknown or not yet supported." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } @@ -354,7 +354,7 @@ bool isEpsgDatumStatic(const U& epsgCode) case WGS84_G2139_i: return false; default: - ss << "isEpsgDatumStatic: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + ss << " isEpsgDatumStatic: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } return false; @@ -454,7 +454,7 @@ void spheroidFromEpsgCode(const U& epsgCode, epsg_spheroid& ellipsoid) break; default: std::stringstream ss; - ss << "spheroidFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + ss << " spheroidFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } } @@ -549,7 +549,7 @@ std::string referenceepochFromEpsgCode(const U& epsgCode) return WGS84_G2139_epoch; default: std::stringstream ss; - ss << "referenceepochFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + ss << " referenceepochFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } return ""; @@ -654,7 +654,7 @@ S datumFromEpsgCode(const U& epsgCode) return WGS84_G2139_s; default: std::stringstream ss; - ss << "datumFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + ss << " datumFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } return ""; @@ -747,7 +747,7 @@ bool validateEpsgCode(const U& epsgCode) return true; default: std::stringstream ss; - ss << "validateEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + ss << " validateEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } return false; From 0a6cfffaae15e14cc997feefe47dadc32770e181 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:20:01 +1100 Subject: [PATCH 091/102] Handle incomplete date string --- .../dnaimportwrapper/dnaimportwrapper.cpp | 4 ++ .../dnareftranwrapper/dnareftranwrapper.cpp | 14 ++++- .../include/functions/dnatemplatefuncs.hpp | 57 ++++++++++++------- 3 files changed, 55 insertions(+), 20 deletions(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index ec087237..61d455c6 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -245,6 +245,10 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const boost::program_ // Has the user supplied the year only? else if (p.i.epoch.rfind(".") == std::string::npos) p.i.epoch.insert(0, "01.01."); + + if (p.i.epoch.length() < 10) + p.i.epoch = FormatDateString(p.i.epoch); + p.i.user_supplied_epoch = 1; } diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index 3ac4ae17..6b471d3f 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -154,7 +154,19 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const boost::program_ } } - if (!vm.count(EPOCH)) + if (vm.count(EPOCH)) + { + // Get today's date? + if (boost::iequals(p.r.epoch, "today")) + p.r.epoch = stringFromToday(); + // Has the user supplied the year only? + else if (p.r.epoch.rfind(".") == std::string::npos) + p.r.epoch.insert(0, "01.01."); + + if (p.r.epoch.length() < 10) + p.r.epoch = FormatDateString(p.i.epoch); + } + else { try { diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index 8646d5c6..d89ac121 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -186,6 +186,25 @@ class value_equals { } }; +// insert leading zeros into date string +template +S FormatDateString(const S& datestring) +{ + std::vector tokenList; + S delimiter("."); + SplitDelimitedString(datestring, delimiter, &tokenList); + + if (tokenList.at(0).size() < 2) + tokenList.at(0).insert(0, "0"); + if (tokenList.at(1).size() < 2) + tokenList.at(1).insert(0, "0"); + + std::stringstream datess; + datess << tokenList.at(0) << "." << tokenList.at(1) << "." << tokenList.at(2); + return datess.str(); +} + + //delimiter should be a space, commar or similar // Expected input is -38 43 28.24255 // Use of NSEW to indicate negative/positive hemispheres @@ -227,7 +246,7 @@ T ParseDmsString(const std::string& dmsString, const std::string& delimiter) return dms; } - + //symbols is only optional if withSpaces is true template std::string FormatDmsString(const T& dDegMinSec, const int precision, bool withSpaces, bool withSymbols) @@ -240,11 +259,11 @@ std::string FormatDmsString(const T& dDegMinSec, const int precision, bool withS return ss.str(); std::string strNumber(ss.str()), strBuf(ss.str()); - + size_t decimal(0); int precision_fmt(precision); - int minute_symbol_loc(withSymbols?4:3), second_symbol_loc(withSymbols?8:6); - + int minute_symbol_loc(withSymbols ? 4 : 3), second_symbol_loc(withSymbols ? 8 : 6); + // Add symbols for degrees minutes and seconds if ((decimal = strNumber.find('.')) != std::string::npos) { @@ -257,47 +276,47 @@ std::string FormatDmsString(const T& dDegMinSec, const int precision, bool withS // add spaces if (withSpaces) - strBuf.replace(decimal, 1, " "); - + strBuf.replace(decimal, 1, " "); + // add symbols if (withSymbols) strBuf.insert(decimal, "\260"); // 272 is the degree symbol - + // add zero after "tens" minute or "tens" second value if (precision == 1 || precision == 3) { strBuf += "0"; precision_fmt++; } - + if (precision > 2) { // add spaces if (withSpaces) - strBuf.insert((decimal+minute_symbol_loc), " "); - + strBuf.insert((decimal + minute_symbol_loc), " "); + // add symbols if (withSymbols) - strBuf.insert((decimal+minute_symbol_loc), "\222"); //minutes symbol + strBuf.insert((decimal + minute_symbol_loc), "\222"); //minutes symbol } if (precision == 2 && withSymbols) - strBuf += "\222"; - + strBuf += "\222"; + if (precision > 4) { - strBuf.insert((decimal+second_symbol_loc), "."); + strBuf.insert((decimal + second_symbol_loc), "."); if (withSymbols) strBuf += "\224"; } - + if (precision == 4 && withSymbols) - strBuf += "\224"; - } + strBuf += "\224"; + } else if (withSymbols) strBuf += "\260"; // couldn't find a decimal point, so append the degree symbol - - + + //// Show North and South notation //if (strNumber[0] == '-' || strNumber[0] == 's' || strNumber[0] == 'S' || // strNumber[0] == 'w' || strNumber[0] == 'W') From 195c42e6972ed99642550371b81b6aa71024ccd2 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Thu, 20 Feb 2025 17:03:42 +1100 Subject: [PATCH 092/102] Add incomplte date to tests --- dynadjust/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynadjust/CMakeLists.txt b/dynadjust/CMakeLists.txt index 676b18cb..6344014c 100644 --- a/dynadjust/CMakeLists.txt +++ b/dynadjust/CMakeLists.txt @@ -314,7 +314,7 @@ if (BUILD_TESTING) add_test (NAME ref-gnss03-network COMMAND $ gnss -r itrf1989) add_test (NAME ref-gnss04-network COMMAND $ gnss -r itrf1990) add_test (NAME ref-gnss05-network COMMAND $ gnss -r itrf1991) - add_test (NAME ref-gnss06-network COMMAND $ gnss -r itrf2005 -e 05.05.2005 --export-xml --single-xml-file --verb 3) + add_test (NAME ref-gnss06-network COMMAND $ gnss -r itrf2005 -e 5.5.2005 --export-xml --single-xml-file --verb 3) add_test (NAME ref-gnss07-network COMMAND $ gnss -r itrf1992 --verb 3) add_test (NAME ref-gnss08-network COMMAND $ gnss -r gda94 --export-xml --single-xml-file --verb 3) add_test (NAME ref-gnss09-network COMMAND $ gnss -r itrf1988) From 7f7e8ba5a8cc13d0919f2d9f807b1bbf3e38604a Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Thu, 20 Feb 2025 17:04:38 +1100 Subject: [PATCH 093/102] Improve handling of user supplied epoch --- .../dnareftranwrapper/dnareftranwrapper.cpp | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index 6b471d3f..6b3d27e2 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -164,7 +164,7 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const boost::program_ p.r.epoch.insert(0, "01.01."); if (p.r.epoch.length() < 10) - p.r.epoch = FormatDateString(p.i.epoch); + p.r.epoch = FormatDateString(p.r.epoch); } else { @@ -450,6 +450,7 @@ int main(int argc, char* argv[]) } } + // Test for a valid reference frame label UINT32 epsgCode; try { epsgCode = epsgCodeFromName(p.r.reference_frame); @@ -464,7 +465,7 @@ int main(int argc, char* argv[]) if (ParseCommandLineOptions(argc, argv, vm, p, epsgCode) != EXIT_SUCCESS) return EXIT_FAILURE; - // if the reference frame supplied is static, then force the epoch + // If the reference frame supplied is static, then force the epoch // to be the reference epoch if (isEpsgDatumStatic(epsgCode)) p.r.epoch = referenceepochFromEpsgCode(epsgCode); @@ -507,15 +508,18 @@ int main(int argc, char* argv[]) try { if (!p.r.epoch.empty()) - { - // Has the user supplied the year only? - if (p.r.epoch.rfind(".") == std::string::npos) - p.r.epoch.insert(0, "01.01."); - + { std::cout << std::setw(PRINT_VAR_PAD) << std::left << " Target epoch: " << p.r.epoch; if (isEpsgDatumStatic(epsgCode)) std::cout << " (adopted reference epoch of " << p.r.reference_frame << ")"; - std::cout << std::endl; + else + { + if (vm.count(EPOCH)) + std::cout << " (user supplied)" << std::endl; + else + std::cout << " (project default)" << std::endl; + } + std::cout << std::endl; } } catch (const std::runtime_error& e) { From 6b634df9869d0a05a6f231fbdb0b928077021ea0 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 21 Feb 2025 09:46:43 +1100 Subject: [PATCH 094/102] Create symlinks to assist testing --- dynadjust/CMakeLists.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dynadjust/CMakeLists.txt b/dynadjust/CMakeLists.txt index 6344014c..bbff279d 100644 --- a/dynadjust/CMakeLists.txt +++ b/dynadjust/CMakeLists.txt @@ -199,6 +199,13 @@ add_subdirectory (dynadjust/dynadjust) if (BUILD_TESTING) message (" ") message (STATUS "Configuring tests") + + # Create symbolic links + add_custom_target(import_link_target COMMAND ${CMAKE_COMMAND} -E create_symlink $ dnaimport) + add_custom_target(geoid_link_target COMMAND ${CMAKE_COMMAND} -E create_symlink $ dnageoid) + add_custom_target(reftran_link_target COMMAND ${CMAKE_COMMAND} -E create_symlink $ dnareftran) + add_custom_target(segment_link_target COMMAND ${CMAKE_COMMAND} -E create_symlink $ dnasegment) + add_custom_target(adjust_link_target COMMAND ${CMAKE_COMMAND} -E create_symlink $ dnaadjust) # test execution of dynadjust binaries # 1. gnss network (simultaneous, phased-block 1, phased, staged) @@ -254,9 +261,7 @@ if (BUILD_TESTING) file (COPY ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn DESTINATION ./) file (COPY ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr DESTINATION ./) file (COPY ${CMAKE_SOURCE_DIR}/../sampleData/sample.dnaproj DESTINATION ./) - file (COPY ${CMAKE_SOURCE_DIR}/../sampleData/urban-network-geoid.gsb DESTINATION ./) - #add_test (NAME dynadjust-proj-01 COMMAND $ -p ${CMAKE_SOURCE_DIR}/../sampleData/sample.dnaproj --import --geoid --reftran --segment --adjust) - #add_test (NAME dynadjust-proj-02 COMMAND $ -p ${CMAKE_SOURCE_DIR}/../sampleData/sample.dnaproj --import --geoid --reftran --segment --adjust --quiet) + file (COPY ${CMAKE_SOURCE_DIR}/../sampleData/urban-network-geoid.gsb DESTINATION ./) add_test (NAME dynadjust-name-01 COMMAND $ -n sample --import --geoid --reftran --segment --adjust) # 6. urban data manipulation From 4e64ebb5e8b11739d3d658a40f65174f11b549c6 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 21 Feb 2025 10:12:14 +1100 Subject: [PATCH 095/102] Handle process exceptions --- .../include/functions/dnaprocessfuncs.cpp | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/dynadjust/include/functions/dnaprocessfuncs.cpp b/dynadjust/include/functions/dnaprocessfuncs.cpp index 4551353f..583b5c87 100644 --- a/dynadjust/include/functions/dnaprocessfuncs.cpp +++ b/dynadjust/include/functions/dnaprocessfuncs.cpp @@ -21,7 +21,7 @@ //============================================================================ #include - +#include #include bool run_command(const std::string& executable_path, const UINT16& quiet) @@ -61,12 +61,20 @@ bool run_command(const std::string& executable_path, const UINT16& quiet) #elif defined(__linux) || defined(sun) || defined(__unix__) || defined(__APPLE__) int return_value(0); - - if (quiet) - return_value = boost::process::system(executable_path, boost::process::std_out > boost::process::null); - else - return_value = boost::process::system(executable_path, boost::process::std_out > stdout); - + + try { + if (quiet) + return_value = boost::process::system(executable_path, boost::process::std_out > boost::process::null); + else + return_value = boost::process::system(executable_path, boost::process::std_out > stdout); + } + catch (const boost::process::process_error& e) + { + std::cout << std::endl << "- Error: Cannot find " << executable_path << "\n" << + " " << e.what() << std::endl; + return EXIT_FAILURE; + } + return (return_value == EXIT_SUCCESS); #endif From 03ed1abf0676844b826c3851d03daaa299196073 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 21 Feb 2025 11:10:03 +1100 Subject: [PATCH 096/102] Add new tests --- dynadjust/CMakeLists.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/dynadjust/CMakeLists.txt b/dynadjust/CMakeLists.txt index bbff279d..1c4d6143 100644 --- a/dynadjust/CMakeLists.txt +++ b/dynadjust/CMakeLists.txt @@ -256,6 +256,24 @@ if (BUILD_TESTING) add_test (NAME geoid-urban-network-stage COMMAND $ urban_st -g ${CMAKE_SOURCE_DIR}/../sampleData/urban-network-geoid.gsb --convert-stn-hts --export-dna-geo) add_test (NAME segment-urban-network-stage COMMAND $ urban_st --min 90 --max 90) add_test (NAME adjust-urban-network-stage COMMAND $ urban_st --phased --staged-adjustment --create-stage-files --output-adj-msr --export-sinex-file --output-pos-uncertainty --export-xml-stn-file --export-xml-msr-file --export-dna-stn-file --export-dna-msr --output-iter-adj-stn --output-iter-adj-stat --output-iter-adj-msr --output-iter-cmp-msr --stn-corrections --output-corrections-file) + + # test all frame labels + add_test (NAME imp-frame-misc-01 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1988 -e 03.12.1988) + add_test (NAME imp-frame-misc-02 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1989 -e 01.09.1989) + add_test (NAME imp-frame-misc-03 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1990 -e 01.10.1990) + add_test (NAME imp-frame-misc-04 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1991 -e 01.01.1991) + add_test (NAME imp-frame-misc-05 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1992 -e 01.02.1992) + add_test (NAME imp-frame-misc-06 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1993 -e 01.03.1993) + add_test (NAME imp-frame-misc-07 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1994 -e 01.04.1994) + add_test (NAME imp-frame-misc-08 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1996 -e 01.06.1996) + add_test (NAME imp-frame-misc-09 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1997 -e 01.07.1997) + add_test (NAME imp-frame-misc-10 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2000 -e 22.2.2000) + add_test (NAME imp-frame-misc-11 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2005 -e 5.5.2005) + add_test (NAME imp-frame-misc-12 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2008 -e 8.8.2008) + add_test (NAME imp-frame-misc-13 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2014 -e 2020) + add_test (NAME imp-frame-misc-14 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2020 -e today) + add_test (NAME imp-frame-misc-15 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r gda94) + add_test (NAME imp-frame-misc-16 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r gda2020) # 5. dynadjust project mode file (COPY ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn DESTINATION ./) From 378825d1d67b49f55e75fa01d503e6bf5249fdda Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 21 Feb 2025 13:26:31 +1100 Subject: [PATCH 097/102] Increase reftran test coverage --- dynadjust/CMakeLists.txt | 60 +++++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/dynadjust/CMakeLists.txt b/dynadjust/CMakeLists.txt index 1c4d6143..7431250d 100644 --- a/dynadjust/CMakeLists.txt +++ b/dynadjust/CMakeLists.txt @@ -258,22 +258,50 @@ if (BUILD_TESTING) add_test (NAME adjust-urban-network-stage COMMAND $ urban_st --phased --staged-adjustment --create-stage-files --output-adj-msr --export-sinex-file --output-pos-uncertainty --export-xml-stn-file --export-xml-msr-file --export-dna-stn-file --export-dna-msr --output-iter-adj-stn --output-iter-adj-stat --output-iter-adj-msr --output-iter-cmp-msr --stn-corrections --output-corrections-file) # test all frame labels - add_test (NAME imp-frame-misc-01 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1988 -e 03.12.1988) - add_test (NAME imp-frame-misc-02 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1989 -e 01.09.1989) - add_test (NAME imp-frame-misc-03 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1990 -e 01.10.1990) - add_test (NAME imp-frame-misc-04 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1991 -e 01.01.1991) - add_test (NAME imp-frame-misc-05 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1992 -e 01.02.1992) - add_test (NAME imp-frame-misc-06 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1993 -e 01.03.1993) - add_test (NAME imp-frame-misc-07 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1994 -e 01.04.1994) - add_test (NAME imp-frame-misc-08 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1996 -e 01.06.1996) - add_test (NAME imp-frame-misc-09 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1997 -e 01.07.1997) - add_test (NAME imp-frame-misc-10 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2000 -e 22.2.2000) - add_test (NAME imp-frame-misc-11 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2005 -e 5.5.2005) - add_test (NAME imp-frame-misc-12 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2008 -e 8.8.2008) - add_test (NAME imp-frame-misc-13 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2014 -e 2020) - add_test (NAME imp-frame-misc-14 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2020 -e today) - add_test (NAME imp-frame-misc-15 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r gda94) - add_test (NAME imp-frame-misc-16 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r gda2020) + add_test (NAME imp-frame-misc-01 COMMAND $ -n impframe-01 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1988 -e 03.12.1988) + add_test (NAME ref-frame-misc-01 COMMAND $ impframe-01 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-02 COMMAND $ -n impframe-02 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1988 -e 03.12.1988) + add_test (NAME ref-frame-misc-02 COMMAND $ impframe-02 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-03 COMMAND $ -n impframe-03 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1989 -e 01.09.1989) + add_test (NAME ref-frame-misc-03 COMMAND $ impframe-03 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-04 COMMAND $ -n impframe-04 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1990 -e 01.10.1990) + add_test (NAME ref-frame-misc-04 COMMAND $ impframe-04 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-05 COMMAND $ -n impframe-05 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1991 -e 01.01.1991) + add_test (NAME ref-frame-misc-05 COMMAND $ impframe-05 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-06 COMMAND $ -n impframe-06 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1992 -e 01.02.1992) + add_test (NAME ref-frame-misc-06 COMMAND $ impframe-06 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-07 COMMAND $ -n impframe-07 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1993 -e 01.03.1993) + add_test (NAME ref-frame-misc-07 COMMAND $ impframe-07 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-08 COMMAND $ -n impframe-08 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1994 -e 01.04.1994) + add_test (NAME ref-frame-misc-08 COMMAND $ impframe-08 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-09 COMMAND $ -n impframe-09 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1996 -e 01.06.1996) + add_test (NAME ref-frame-misc-09 COMMAND $ impframe-09 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-10 COMMAND $ -n impframe-10 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf1997 -e 01.07.1997) + add_test (NAME ref-frame-misc-10 COMMAND $ impframe-10 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-11 COMMAND $ -n impframe-11 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2000 -e 22.2.2000) + add_test (NAME ref-frame-misc-11 COMMAND $ impframe-11 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-12 COMMAND $ -n impframe-12 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2005 -e 5.5.2005) + add_test (NAME ref-frame-misc-12 COMMAND $ impframe-12 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-13 COMMAND $ -n impframe-13 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2008 -e 8.8.2008) + add_test (NAME ref-frame-misc-13 COMMAND $ impframe-13 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-14 COMMAND $ -n impframe-14 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2014 -e 2020) + add_test (NAME ref-frame-misc-14 COMMAND $ impframe-14 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-15 COMMAND $ -n impframe-15 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r itrf2020 -e today) + add_test (NAME ref-frame-misc-15 COMMAND $ impframe-15 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-16 COMMAND $ -n impframe-16 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r gda94) + add_test (NAME ref-frame-misc-16 COMMAND $ impframe-16 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-17 COMMAND $ -n impframe-17 ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r gda2020) + add_test (NAME ref-frame-misc-17 COMMAND $ impframe-17 --verb 6 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) + add_test (NAME imp-frame-misc-18 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r wgs84) + add_test (NAME imp-frame-misc-19 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r "wgs 84") + add_test (NAME imp-frame-misc-20 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r "wgs84 (ensemble)") + add_test (NAME imp-frame-misc-21 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r "wgs84 (G730)") + add_test (NAME imp-frame-misc-22 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r "wgs84 (G873)") + add_test (NAME imp-frame-misc-23 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r "wgs84 (G1150)") + add_test (NAME imp-frame-misc-24 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r "wgs84 (G1674)") + add_test (NAME imp-frame-misc-25 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r "wgs84 (G1762)") + add_test (NAME imp-frame-misc-26 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r "wgs84 (G2139)") + add_test (NAME imp-frame-misc-27 COMMAND $ -n impframe ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr -r "wgs84 (transit)") # 5. dynadjust project mode file (COPY ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn DESTINATION ./) From e70768af87f5edcd7ebcc4ae4487950b8e602ab3 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 21 Feb 2025 16:18:55 +1100 Subject: [PATCH 098/102] Increase transformation parameter code coverage --- dynadjust/CMakeLists.txt | 459 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 447 insertions(+), 12 deletions(-) diff --git a/dynadjust/CMakeLists.txt b/dynadjust/CMakeLists.txt index 7431250d..25603d70 100644 --- a/dynadjust/CMakeLists.txt +++ b/dynadjust/CMakeLists.txt @@ -209,7 +209,7 @@ if (BUILD_TESTING) # test execution of dynadjust binaries # 1. gnss network (simultaneous, phased-block 1, phased, staged) - add_test (NAME import-gnss-network COMMAND $ -n gnss ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.msr --export-dna --export-xml --export-asl --export-aml --export-map --output-msr-to-stn --test-integrity -r GDA94) + add_test (NAME import-gnss-network COMMAND $ -n gnss ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.msr --export-dna --export-xml --export-asl --export-aml --export-map --output-msr-to-stn --test-integrity -r GDA94 --flag-unused-stations) add_test (NAME geoid-gnss-network COMMAND $ gnss -g ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network-geoid.gsb --convert-stn-hts --export-dna-geo) add_test (NAME reftran-gnss-network COMMAND $ gnss -r gda2020 --export-dna --export-xml) add_test (NAME adjust-gnss-network COMMAND $ gnss --output-adj-msr --export-dna-msr --export-xml-msr) @@ -221,7 +221,7 @@ if (BUILD_TESTING) add_test (NAME import-gnss-network-similar COMMAND $ -n gnss_similar ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.msr -r itrf2008 --override-input-ref-frame --search-similar-gnss-msr --quiet) add_test (NAME import-gnss-network-exclude COMMAND $ -n gnss_excl ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.msr --exclude-stns-assoc-msrs "BEEC,261000380,356000780,349800490" --split) add_test (NAME import-gnss-network-scaled COMMAND $ -n gnss_scaled ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.msr --baseline-scalar-file ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.scalars -r GDA94) - add_test (NAME import-gnss-network-block1 COMMAND $ -n gnss_b1 ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.msr --export-dna --export-xml --single-xml-file --export-asl --export-aml --export-map --output-msr-to-stn --test-integrity -r GDA94) + add_test (NAME import-gnss-network-block1 COMMAND $ -n gnss_b1 ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network.msr --export-dna --export-xml --single-xml-file --export-asl --export-aml --export-map --output-msr-to-stn --test-integrity -r GDA94 --flag-unused-stations) add_test (NAME segment-gnss-network-block1-a COMMAND $ gnss_b1 --min 90 --max 90 --starting-stns 220700210) add_test (NAME segment-gnss-network-block1-b COMMAND $ gnss_b1 --min 110 --max 110 --net-file) add_test (NAME segment-gnss-network-block1-c COMMAND $ gnss_b1 --min 80 --max 200 --net-file --starting-stns 211300940 --verbose 3) @@ -232,7 +232,7 @@ if (BUILD_TESTING) add_test (NAME adjust-gnss-network-staged-b COMMAND $ gnss_b1 --staged-adjustment --purge-stage-files --output-adj-msr --output-adj-gnss-units 3 --output-stn-blocks --output-msr-blocks --sort-adj-msr-field 5) # 2. urban network (phased-sequential) - add_test (NAME import-urban-network COMMAND $ -n urban ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr) + add_test (NAME import-urban-network COMMAND $ -n urban ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr --flag-unused-stations) add_test (NAME geoid-urban-network COMMAND $ urban -g ${CMAKE_SOURCE_DIR}/../sampleData/urban-network-geoid.gsb --convert-stn-hts --export-dna-geo) add_test (NAME segment-urban-network COMMAND $ urban --min 50 --max 150 --test-integrity) add_test (NAME adjust-urban-network-verbose COMMAND $ urban --verbose 3) @@ -252,7 +252,7 @@ if (BUILD_TESTING) add_test (NAME adjust-urban-network-thread-02 COMMAND $ urban_mt --output-adj-msr --multi --verb 5) # 4. urban network (phased-staged) - add_test (NAME import-urban-network-stage COMMAND $ -n urban_st ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr) + add_test (NAME import-urban-network-stage COMMAND $ -n urban_st ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.stn ${CMAKE_SOURCE_DIR}/../sampleData/urban-network.msr --flag-unused-stations) add_test (NAME geoid-urban-network-stage COMMAND $ urban_st -g ${CMAKE_SOURCE_DIR}/../sampleData/urban-network-geoid.gsb --convert-stn-hts --export-dna-geo) add_test (NAME segment-urban-network-stage COMMAND $ urban_st --min 90 --max 90) add_test (NAME adjust-urban-network-stage COMMAND $ urban_st --phased --staged-adjustment --create-stage-files --output-adj-msr --export-sinex-file --output-pos-uncertainty --export-xml-stn-file --export-xml-msr-file --export-dna-stn-file --export-dna-msr --output-iter-adj-stn --output-iter-adj-stat --output-iter-adj-msr --output-iter-cmp-msr --stn-corrections --output-corrections-file) @@ -318,16 +318,16 @@ if (BUILD_TESTING) add_test (NAME imp-urb03-xml-data COMMAND $ -n urban_xml ./urban_dnastn.xml ./urban_dnamsr.xml --search-similar-msr --ignore-similar-msr --flag-unused-stations) add_test (NAME imp-urb04-xml-data COMMAND $ -n urban_xml ./urban_dnastn.xml ./urban_dnamsr.xml --v-scale 2.5 --p-scale 5.0 --l-scale 5.0 --h-scale 10.0) add_test (NAME imp-urb05-xml-data COMMAND $ -n urban_xml ./urban_dnastn.xml ./urban_dnamsr.xml --include-stns-assoc-msrs "4000,1,1004,1042,1046,2,2215,4000,5,9004,1002,1003,1034,1039,1050,13,2101,2102,2105,2106,2109,2118,2119,2122,2123,2124,2125,2206,2214") - add_test (NAME imp-urb06-xml-data COMMAND $ -n urban_xml ./urban_dnastn.xml ./urban_dnamsr.xml --export-dna --export-asl --export-aml --export-map --output-msr-to-stn) + add_test (NAME imp-urb06-xml-data COMMAND $ -n urban_xml ./urban_dnastn.xml ./urban_dnamsr.xml --export-dna --export-asl --export-aml --export-map --output-msr-to-stn --flag-unused-stations) add_test (NAME seg-urb00-xml-data COMMAND $ urban_xml --min 50 --max 50) add_test (NAME imp-urb07-xml-data COMMAND $ -n urban_xml --import-block-stn-msr 2) add_test (NAME imp-urb08-xml-data COMMAND $ -n urban_xml ./urban_dnastn.xml ./urban_dnamsr.xml --geo-file urban.geo) add_test (NAME plt-urb01-xml-data COMMAND $ urban_xml --centre-station 1004 --area-radius 5000 --plot-msr-types gxyasvz --msr-line-width 0.5) add_test (NAME plt-urb02-xml-data COMMAND $ urban_xml --centre-latitude -37.480489013 --centre-longitude 144.573579814 --area-radius 3000 --omit-measurements) - add_test (NAME imp-psu01-dna-data COMMAND $ -n pseudo ${CMAKE_SOURCE_DIR}/../sampleData/pseudo.stn) + add_test (NAME imp-psu01-dna-data COMMAND $ -n pseudo ${CMAKE_SOURCE_DIR}/../sampleData/pseudo.stn --flag-unused-stations) add_test (NAME geo-psu00-dna-data COMMAND $ pseudo -g ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network-geoid.gsb --export-dna-geo-file) add_test (NAME imp-psu02-dna-data COMMAND $ -n pseudo ${CMAKE_SOURCE_DIR}/../sampleData/pseudo.stn ${CMAKE_SOURCE_DIR}/../sampleData/pseudo-driver-file.msr --simulate --geo-file pseudo.geo --export-xml) - add_test (NAME imp-psu03-xml-data COMMAND $ -n pseudo pseudostn.xml pseudomsr.xml) + add_test (NAME imp-psu03-xml-data COMMAND $ -n pseudo pseudostn.xml pseudomsr.xml --export-asl --export-aml --export-map) add_test (NAME geo-psu01-xml-data COMMAND $ pseudo -g ${CMAKE_SOURCE_DIR}/../sampleData/gnss-network-geoid.gsb --convert --interpolation-method 0) add_test (NAME adj-psu00-xml-data COMMAND $ pseudo --output-adj-msr --free-stn-sd 5.0 --fixed-stn-sd 0.000005 --max-iterations 15 --output-tstat-adj-msr --sort-adj-msr-field 7 --sort-stn-orig-order --stn-coord-types XYZPLHhENz --angular-stn-type 1 --angular-msr-type 1 --precision-stn-linear 3 --precision-msr-linear 3 --precision-stn-angular 4 --precision-msr-angular 4 --output-pos-uncertainty --output-all-covariances --output-corrections-file) add_test (NAME imp-gnss0-xml-data COMMAND $ -n gnss_xml ./gnssstn.xml ./gnssmsr.xml --bounding-box "-36.3000,145.4500,-36.4500,146.4500" --get-msrs-transcending-box --split-gnss-cluster-msrs --prefer-single-x-as-g) @@ -374,19 +374,454 @@ if (BUILD_TESTING) add_test (NAME ref-gnss12-network COMMAND $ gnss -r itrf1996) add_test (NAME ref-gnss13-network COMMAND $ gnss -r itrf1997) add_test (NAME ref-gnss14-network COMMAND $ gnss -r itrf2020) + + # gda2020 + add_test (NAME gda2020-param-01 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-02 COMMAND $ gnss -r gda94) + add_test (NAME gda2020-param-03 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-04 COMMAND $ gnss -r itrf1988) + add_test (NAME gda2020-param-05 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-06 COMMAND $ gnss -r itrf1989) + add_test (NAME gda2020-param-07 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-08 COMMAND $ gnss -r itrf1990) + add_test (NAME gda2020-param-09 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-10 COMMAND $ gnss -r itrf1991) + add_test (NAME gda2020-param-11 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-12 COMMAND $ gnss -r itrf1992) + add_test (NAME gda2020-param-13 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-14 COMMAND $ gnss -r itrf1993) + add_test (NAME gda2020-param-15 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-16 COMMAND $ gnss -r itrf1994) + add_test (NAME gda2020-param-17 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-18 COMMAND $ gnss -r itrf1996) + add_test (NAME gda2020-param-19 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-20 COMMAND $ gnss -r itrf1997) + add_test (NAME gda2020-param-21 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-22 COMMAND $ gnss -r itrf2000) + add_test (NAME gda2020-param-23 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-24 COMMAND $ gnss -r itrf2005) + add_test (NAME gda2020-param-25 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME gda2020-param-27 COMMAND $ gnss -r gda2020) + add_test (NAME gda2020-param-28 COMMAND $ gnss -r itrf2020) + # gda94 + add_test (NAME gda94-param-01 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-02 COMMAND $ gnss -r gda2020) + add_test (NAME gda94-param-03 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-04 COMMAND $ gnss -r itrf1988) + add_test (NAME gda94-param-05 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-06 COMMAND $ gnss -r itrf1989) + add_test (NAME gda94-param-07 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-08 COMMAND $ gnss -r itrf1990) + add_test (NAME gda94-param-09 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-10 COMMAND $ gnss -r itrf1991) + add_test (NAME gda94-param-11 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-12 COMMAND $ gnss -r itrf1992) + add_test (NAME gda94-param-13 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-14 COMMAND $ gnss -r itrf1993) + add_test (NAME gda94-param-15 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-16 COMMAND $ gnss -r itrf1994) + add_test (NAME gda94-param-17 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-18 COMMAND $ gnss -r itrf1996) + add_test (NAME gda94-param-19 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-20 COMMAND $ gnss -r itrf1997) + add_test (NAME gda94-param-21 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-22 COMMAND $ gnss -r itrf2000) + add_test (NAME gda94-param-23 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-24 COMMAND $ gnss -r itrf2005) + add_test (NAME gda94-param-25 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME gda94-param-27 COMMAND $ gnss -r gda94) + add_test (NAME gda94-param-28 COMMAND $ gnss -r itrf2020) + # itrf1988 + add_test (NAME itrf1988-param-01 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-02 COMMAND $ gnss -r gda94) + add_test (NAME itrf1988-param-03 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-04 COMMAND $ gnss -r gda2020) + add_test (NAME itrf1988-param-05 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-06 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1988-param-07 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-08 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1988-param-09 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-10 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1988-param-11 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-12 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1988-param-13 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-14 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1988-param-15 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-16 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1988-param-17 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-18 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1988-param-19 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-20 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1988-param-21 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-22 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf1988-param-23 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-24 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf1988-param-25 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf1988-param-27 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1988-param-28 COMMAND $ gnss -r itrf2020) + # itrf1989 + add_test (NAME itrf1989-param-01 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-02 COMMAND $ gnss -r gda94) + add_test (NAME itrf1989-param-03 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-04 COMMAND $ gnss -r gda2020) + add_test (NAME itrf1989-param-05 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-06 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1989-param-07 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-08 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1989-param-09 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-10 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1989-param-11 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-12 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1989-param-13 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-14 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1989-param-15 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-16 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1989-param-17 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-18 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1989-param-19 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-20 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1989-param-21 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-22 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf1989-param-23 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-24 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf1989-param-25 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf1989-param-27 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1989-param-28 COMMAND $ gnss -r itrf2020) + # itrf1990 + add_test (NAME itrf1990-param-01 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-02 COMMAND $ gnss -r gda94) + add_test (NAME itrf1990-param-03 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-04 COMMAND $ gnss -r gda2020) + add_test (NAME itrf1990-param-05 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-06 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1990-param-07 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-08 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1990-param-09 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-10 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1990-param-11 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-12 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1990-param-13 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-14 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1990-param-15 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-16 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1990-param-17 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-18 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1990-param-19 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-20 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1990-param-21 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-22 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf1990-param-23 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-24 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf1990-param-25 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf1990-param-27 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1990-param-28 COMMAND $ gnss -r itrf2020) + # itrf1991 + add_test (NAME itrf1991-param-01 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-02 COMMAND $ gnss -r gda94) + add_test (NAME itrf1991-param-03 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-04 COMMAND $ gnss -r gda2020) + add_test (NAME itrf1991-param-05 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-06 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1991-param-07 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-08 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1991-param-09 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-10 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1991-param-11 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-12 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1991-param-13 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-14 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1991-param-15 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-16 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1991-param-17 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-18 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1991-param-19 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-20 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1991-param-21 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-22 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf1991-param-23 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-24 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf1991-param-25 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf1991-param-27 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1991-param-28 COMMAND $ gnss -r itrf2020) + # itrf1992 + add_test (NAME itrf1992-param-01 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-02 COMMAND $ gnss -r gda94) + add_test (NAME itrf1992-param-03 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-04 COMMAND $ gnss -r gda2020) + add_test (NAME itrf1992-param-05 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-06 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1992-param-07 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-08 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1992-param-09 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-10 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1992-param-11 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-12 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1992-param-13 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-14 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1992-param-15 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-16 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1992-param-17 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-18 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1992-param-19 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-20 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1992-param-21 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-22 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf1992-param-23 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-24 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf1992-param-25 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf1992-param-27 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1992-param-28 COMMAND $ gnss -r itrf2020) + # itrf1993 + add_test (NAME itrf1993-param-01 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-02 COMMAND $ gnss -r gda94) + add_test (NAME itrf1993-param-03 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-04 COMMAND $ gnss -r gda2020) + add_test (NAME itrf1993-param-05 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-06 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1993-param-07 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-08 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1993-param-09 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-10 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1993-param-11 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-12 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1993-param-13 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-14 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1993-param-15 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-16 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1993-param-17 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-18 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1993-param-19 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-20 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1993-param-21 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-22 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf1993-param-23 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-24 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf1993-param-25 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf1993-param-27 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1993-param-28 COMMAND $ gnss -r itrf2020) + # itrf1994 + add_test (NAME itrf1994-param-01 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-02 COMMAND $ gnss -r gda94) + add_test (NAME itrf1994-param-03 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-04 COMMAND $ gnss -r gda2020) + add_test (NAME itrf1994-param-05 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-06 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1994-param-07 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-08 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1994-param-09 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-10 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1994-param-11 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-12 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1994-param-13 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-14 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1994-param-15 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-16 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1994-param-17 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-18 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1994-param-19 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-20 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1994-param-21 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-22 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf1994-param-23 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-24 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf1994-param-25 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf1994-param-27 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1994-param-28 COMMAND $ gnss -r itrf2020) + # itrf1996 + add_test (NAME itrf1996-param-01 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-02 COMMAND $ gnss -r gda94) + add_test (NAME itrf1996-param-03 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-04 COMMAND $ gnss -r gda2020) + add_test (NAME itrf1996-param-05 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-06 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1996-param-07 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-08 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1996-param-09 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-10 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1996-param-11 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-12 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1996-param-13 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-14 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1996-param-15 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-16 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1996-param-17 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-18 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1996-param-19 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-20 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1996-param-21 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-22 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf1996-param-23 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-24 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf1996-param-25 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf1996-param-27 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1996-param-28 COMMAND $ gnss -r itrf2020) + # itrf1997 + add_test (NAME itrf1997-param-01 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-02 COMMAND $ gnss -r gda94) + add_test (NAME itrf1997-param-03 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-04 COMMAND $ gnss -r gda2020) + add_test (NAME itrf1997-param-05 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-06 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf1997-param-07 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-08 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf1997-param-09 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-10 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf1997-param-11 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-12 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf1997-param-13 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-14 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf1997-param-15 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-16 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf1997-param-17 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-18 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf1997-param-19 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-20 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf1997-param-21 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-22 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf1997-param-23 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-24 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf1997-param-25 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf1997-param-27 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf1997-param-28 COMMAND $ gnss -r itrf2020) + # itrf2000 + add_test (NAME itrf2000-param-01 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-02 COMMAND $ gnss -r gda94) + add_test (NAME itrf2000-param-03 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-04 COMMAND $ gnss -r gda2020) + add_test (NAME itrf2000-param-05 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-06 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf2000-param-07 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-08 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf2000-param-09 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-10 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf2000-param-11 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-12 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf2000-param-13 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-14 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf2000-param-15 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-16 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf2000-param-17 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-18 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf2000-param-19 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-20 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf2000-param-21 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-22 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf2000-param-23 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-24 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2000-param-25 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2000-param-27 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2000-param-28 COMMAND $ gnss -r itrf2020) + # itrf2005 + add_test (NAME itrf2005-param-01 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-02 COMMAND $ gnss -r gda94) + add_test (NAME itrf2005-param-03 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-04 COMMAND $ gnss -r gda2020) + add_test (NAME itrf2005-param-05 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-06 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf2005-param-07 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-08 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf2005-param-09 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-10 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf2005-param-11 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-12 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf2005-param-13 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-14 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf2005-param-15 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-16 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf2005-param-17 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-18 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf2005-param-19 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-20 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf2005-param-21 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-22 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf2005-param-23 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-24 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2005-param-25 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-26 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2005-param-27 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2005-param-28 COMMAND $ gnss -r itrf2020) + # itrf2008 + add_test (NAME itrf2008-param-01 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-02 COMMAND $ gnss -r gda94) + add_test (NAME itrf2008-param-03 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-04 COMMAND $ gnss -r gda2020) + add_test (NAME itrf2008-param-05 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-06 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf2008-param-07 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-08 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf2008-param-09 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-10 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf2008-param-11 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-12 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf2008-param-13 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-14 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf2008-param-15 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-16 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf2008-param-17 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-18 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf2008-param-19 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-20 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf2008-param-21 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-22 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf2008-param-23 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-24 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2008-param-25 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-26 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2008-param-27 COMMAND $ gnss -r itrf2008) + add_test (NAME itrf2008-param-28 COMMAND $ gnss -r itrf2020) + # itrf2020 + add_test (NAME itrf2020-param-01 COMMAND $ gnss -r gda94) + add_test (NAME itrf2020-param-02 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-03 COMMAND $ gnss -r gda2020) + add_test (NAME itrf2020-param-04 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-05 COMMAND $ gnss -r itrf1988) + add_test (NAME itrf2020-param-06 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-07 COMMAND $ gnss -r itrf1989) + add_test (NAME itrf2020-param-08 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-09 COMMAND $ gnss -r itrf1990) + add_test (NAME itrf2020-param-10 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-11 COMMAND $ gnss -r itrf1991) + add_test (NAME itrf2020-param-12 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-13 COMMAND $ gnss -r itrf1992) + add_test (NAME itrf2020-param-14 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-15 COMMAND $ gnss -r itrf1993) + add_test (NAME itrf2020-param-16 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-17 COMMAND $ gnss -r itrf1994) + add_test (NAME itrf2020-param-18 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-19 COMMAND $ gnss -r itrf1996) + add_test (NAME itrf2020-param-20 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-21 COMMAND $ gnss -r itrf1997) + add_test (NAME itrf2020-param-22 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-23 COMMAND $ gnss -r itrf2000) + add_test (NAME itrf2020-param-24 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-25 COMMAND $ gnss -r itrf2005) + add_test (NAME itrf2020-param-26 COMMAND $ gnss -r itrf2020) + add_test (NAME itrf2020-param-27 COMMAND $ gnss -r itrf2008) # 9. gnss reference frame transformations with plate motion model - add_test (NAME ref-itrf-pmm-01 COMMAND $ -n itrf05_itrf1997_a -r itrf2005 ${CMAKE_SOURCE_DIR}/../sampleData/TEST_ITRF05.SNX) + add_test (NAME ref-itrf-pmm-01 COMMAND $ -n itrf05_itrf1997_a -r itrf2005 ${CMAKE_SOURCE_DIR}/../sampleData/TEST_ITRF05.SNX --flag-unused-stations) add_test (NAME ref-itrf-pmm-02 COMMAND $ itrf05_itrf1997_a -r itrf1997 -e 25.10.2017 --export-dna --verb 2 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) - add_test (NAME ref-itrf-pmm-03 COMMAND $ -n itrf05_itrf1997_b -r itrf2005 ${CMAKE_SOURCE_DIR}/../sampleData/TEST_ITRF05.SNX) + add_test (NAME ref-itrf-pmm-03 COMMAND $ -n itrf05_itrf1997_b -r itrf2005 ${CMAKE_SOURCE_DIR}/../sampleData/TEST_ITRF05.SNX --flag-unused-stations) add_test (NAME ref-itrf-pmm-04 COMMAND $ itrf05_itrf1997_b -r itrf1997 -e 01.01.2020 --export-dna --verb 3 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/PB2002_poles.dat) - add_test (NAME ref-itrf-pmm-05 COMMAND $ -n apr -r itrf2008 ${CMAKE_SOURCE_DIR}/../sampleData/apr.ITRF2008.04.06.2020.stn ${CMAKE_SOURCE_DIR}/../sampleData/apr.ITRF2008.04.06.2020.msr) + add_test (NAME ref-itrf-pmm-05 COMMAND $ -n apr -r itrf2008 ${CMAKE_SOURCE_DIR}/../sampleData/apr.ITRF2008.04.06.2020.stn ${CMAKE_SOURCE_DIR}/../sampleData/apr.ITRF2008.04.06.2020.msr --flag-unused-stations) add_test (NAME ref-itrf-pmm-06 COMMAND $ apr -r itrf2008 -e 01.01.2021 --export-dna --verb 2 --plate-model-option 1 -b ${CMAKE_SOURCE_DIR}/../sampleData/MORVEL56_plates.dig -m ${CMAKE_SOURCE_DIR}/../sampleData/NNR-MORVEL56_poles.dat) #add_test (NAME ref-itrf-pmm-07 COMMAND bash -c "diff <(tail -n +6 apr.ITRF2008.01.01.2021.stn) <(tail -n +4 ${CMAKE_SOURCE_DIR}/../sampleData/apr.ITRF2008.01.01.2021.stn.expected)") # 10. station discontinuities - add_test (NAME imp-discont-01 COMMAND $ -n discont -r itrf2005 ${CMAKE_SOURCE_DIR}/../sampleData/TEST_ITRF05.SNX --discontinuity-file ${CMAKE_SOURCE_DIR}/../sampleData/disconts20201205.snx --export-discont-file) - add_test (NAME imp-discont-02 COMMAND $ -n discont -r itrf2005 ${CMAKE_SOURCE_DIR}/../sampleData/TEST_ITRF05.SNX --discontinuity-file ${CMAKE_SOURCE_DIR}/../sampleData/disconts20201205.snx --split-gnss --include-stn "ALIC" --export-dna) + add_test (NAME imp-discont-01 COMMAND $ -n discont -r itrf2005 ${CMAKE_SOURCE_DIR}/../sampleData/TEST_ITRF05.SNX --discontinuity-file ${CMAKE_SOURCE_DIR}/../sampleData/disconts20201205.snx --export-discont-file --flag-unused-stations) + add_test (NAME imp-discont-02 COMMAND $ -n discont -r itrf2005 ${CMAKE_SOURCE_DIR}/../sampleData/TEST_ITRF05.SNX --discontinuity-file ${CMAKE_SOURCE_DIR}/../sampleData/disconts20201205.snx --split-gnss --include-stn "ALIC" --export-dna --flag-unused-stations) add_test (NAME imp-discont-03 COMMAND $ -n discont -r itrf2014 --override-input-ref-frame ${CMAKE_SOURCE_DIR}/../sampleData/TEST_ITRF05.SNX ${CMAKE_SOURCE_DIR}/../sampleData/sa-gnss-stn.xml ${CMAKE_SOURCE_DIR}/../sampleData/sa-gnss-msr.xml --prefer-single-x-as-g --flag-unused --discontinuity-file ${CMAKE_SOURCE_DIR}/../sampleData/disconts20201205.snx --remove-ignored-msr --split-gnss --include-stns-assoc-msrs "ALIC" --export-dna --export-xml) add_test (NAME adj-discont-01 COMMAND $ discont --constraint "ALIC,CCC") add_test (NAME imp-discont-04 COMMAND $ -n discont -r itrf2005 ${CMAKE_SOURCE_DIR}/../sampleData/TEST_ITRF05.SNX --export-xml) From 0f16684e5892bece6d5aaa2eff4fce8bb288655e Mon Sep 17 00:00:00 2001 From: Roger Fraser <18198507+rogerfraser@users.noreply.github.com> Date: Fri, 21 Feb 2025 16:35:39 +1100 Subject: [PATCH 099/102] Update docker.yml --- .github/workflows/docker.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 9c782a40..f370e5f6 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -3,8 +3,10 @@ name: Build docker image on: push: - branches: - - 'master' + branches: [ master ] + pull_request: + branches: [ master ] + workflow_dispatch: jobs: docker: From 181b521146688ff68aed3a46b3a1582ff0e5b29a Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:20:17 +1100 Subject: [PATCH 100/102] Improve UI messaging re frame and epoch --- .../dynadjust/dnaimport/dnaparser_pimpl.cxx | 11 +++- .../dnaimportwrapper/dnaimportwrapper.cpp | 60 +++++++++++++------ .../dnareftranwrapper/dnareftranwrapper.cpp | 32 ++++++++-- .../include/functions/dnatemplatefuncs.hpp | 3 + dynadjust/include/io/dnaiodna.cpp | 2 +- dynadjust/include/parameters/dnaepsg.hpp | 14 ++--- 6 files changed, 90 insertions(+), 32 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx index e0ea6537..50a2c87e 100644 --- a/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx +++ b/dynadjust/dynadjust/dnaimport/dnaparser_pimpl.cxx @@ -1394,8 +1394,15 @@ void referenceframe_pimpl::post_type(std::string& referenceframe, std::string& f // to the default reference frame passed from import _referenceframe = referenceframe; - // Capture epsg code for the file - fileEpsg = epsgStringFromName(_referenceframe); + try { + // Capture epsg code for the file + fileEpsg = epsgStringFromName(_referenceframe); + } + catch (std::runtime_error& e) { + std::stringstream ss(""); + ss << e.what() << std::endl; + throw XMLInteropException(ss.str(), 0); + } if (!userspecifiedreferenceframe) { diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index 61d455c6..3b9dba0d 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -247,7 +247,16 @@ int ParseCommandLineOptions(const int& argc, char* argv[], const boost::program_ p.i.epoch.insert(0, "01.01."); if (p.i.epoch.length() < 10) - p.i.epoch = FormatDateString(p.i.epoch); + { + std::string dateStr = FormatDateString(p.i.epoch); + if (dateStr.empty()) + { + std::cout << std::endl << "- Error: Cannot parse date '" << p.i.epoch << "'." << std::endl << + " Please supply date in the format dd.mm.yyyy" << std::endl << std::endl; + return EXIT_FAILURE; + } + p.i.epoch = dateStr; + } p.i.user_supplied_epoch = 1; } @@ -616,7 +625,7 @@ void ExportStationsandMeasurements(dna_import* parserDynaML, const project_setti std::string epsgCode(epsgStringFromName(p.i.reference_frame)); // Check inconsistent reference frames - if ((p.i.export_dynaml || p.i.export_dna_files) && !p.i.override_input_rfame && !p.i.user_supplied_frame) + if ((p.i.export_dynaml || p.i.export_dna_files) && !p.i.override_input_rfame) { for (UINT32 i(0); isize(); ++i) { @@ -1115,8 +1124,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* if (!boost::iequals(projectEpsgCode, input_file_meta.epsgCode)) { std::stringstream ssEpsgWarning; - ssEpsgWarning << " - Warning: Input file reference frame (" << inputFileDatum << ") does not match the " << std::endl << - " project reference frame (" << p.i.reference_frame << ")."; + ssEpsgWarning << " - Warning: File reference frame (" << inputFileDatum << ") differs from project frame (" << p.i.reference_frame << ")."; if (!p.g.quiet) std::cout << ssEpsgWarning.str() << std::endl; *imp_file << ssEpsgWarning.str() << std::endl; @@ -1128,10 +1136,22 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* { // epoch std::stringstream epochSource; - if (!isStaticFrame) + if (isStaticFrame) + { + epochSource << " - Warning: File epoch (" << inputFileEpoch << ") will be ignored." << std::endl; + if (!p.g.quiet) + std::cout << epochSource.str() << std::endl; + *imp_file << epochSource.str() << std::endl; + } + else { if (parserDynaML.filespecifiedEpoch()) - epochSource << ". Taken from " << FormatFileType(input_file_meta.filetype) << " header."; + { + if (isEpsgDatumStatic(inputFileEpsgi)) + epochSource << " (adopted reference epoch of " << inputFileDatum << ")."; + else + epochSource << ". Taken from " << FormatFileType(input_file_meta.filetype) << " header."; + } else epochSource << ". Epoch not supplied in " << FormatFileType(input_file_meta.filetype) << " header."; if (!p.g.quiet) @@ -1156,8 +1176,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* if (!boost::iequals(p.i.epoch, input_file_meta.epoch)) { std::stringstream ssEpochWarning; - ssEpochWarning << " - Warning: Input file epoch (" << inputFileEpoch << ") does not match the " << std::endl << - " project epoch (" << p.i.epoch << ")."; + ssEpochWarning << " - Warning: File epoch (" << inputFileEpoch << ") differs from project epoch (" << p.i.epoch << ")."; if (!p.g.quiet) std::cout << ssEpochWarning.str() << std::endl; *imp_file << ssEpochWarning.str() << std::endl; @@ -1199,8 +1218,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* } else { - ssEpsgWarning << " - Warning: Input file reference frame (" << inputFileDatum << ") does not match the " << std::endl << - " project reference frame (" << p.i.reference_frame << ")."; + ssEpsgWarning << " - Warning: File reference frame (" << inputFileDatum << ") differs from project frame (" << p.i.reference_frame << ")."; } if (!p.g.quiet) @@ -1222,8 +1240,7 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* { std::stringstream ssEpochWarning; - ssEpochWarning << " - Warning: Input file epoch (" << inputFileEpoch << ") does not match the " << std::endl << - " project epoch (" << p.i.epoch << ")."; + ssEpochWarning << " - Warning: File epoch (" << inputFileEpoch << ") differs from project epoch (" << p.i.epoch << ")."; if (!p.g.quiet) std::cout << ssEpochWarning.str() << std::endl; @@ -1318,7 +1335,8 @@ int main(int argc, char* argv[]) (std::string("Project epoch for all stations and measurements when input files do not specify an epoch. Default is ") + p.i.epoch + ".").c_str()) (OVERRIDE_INPUT_FRAME, - "Override the reference frame specified for each measurement in input files.") + (std::string("Replace the reference frame specified in the input files with the reference frame specified by arg in --") + + std::string(REFERENCE_FRAME)).c_str()) ; data_screening_options.add_options() @@ -1594,10 +1612,18 @@ int main(int argc, char* argv[]) } else { - if (p.i.user_supplied_epoch) - p.r.epoch = p.i.epoch; - else - p.r.epoch = referenceepochFromEpsgCode(epsgCode); + // Dynamic reference frame. For this code to be reached, which + // is prior to the input files been parsed, the user must have + // supplied a dynamic reference frame on the command line. + // + // Has the user not supplied an epoch? + if (!p.i.user_supplied_epoch) + // No, so set the "default" epoch for the project to be the + // reference epoch of the supplied dynamic reference frame + p.i.epoch = referenceepochFromEpsgCode(epsgCode); + + // Set the project epoch for reftran also + p.r.epoch = p.i.epoch; } //////////////////////////////////////////////////////////////////////////////////// diff --git a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp index 6b3d27e2..912e7bf3 100644 --- a/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp +++ b/dynadjust/dynadjust/dnareftranwrapper/dnareftranwrapper.cpp @@ -24,7 +24,7 @@ using namespace dynadjust; -void PrintOutputFileHeaderInfo(std::ofstream* f_out, const std::string& out_file, project_settings* p, const std::string& header, UINT32& epsgCode) +void PrintOutputFileHeaderInfo(std::ofstream* f_out, const std::string& out_file, project_settings* p, const std::string& header, UINT32& epsgCode, bool userSuppliedFrame, bool userSuppliedEpoch) { // Print formatted header print_file_header(*f_out, header); @@ -39,7 +39,12 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const std::string& out_file *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Output folder: " << boost::filesystem::system_complete(p->g.output_folder).string() << std::endl; *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Stations file:" << boost::filesystem::system_complete(p->r.bst_file).string() << std::endl; *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Measurements file:" << boost::filesystem::system_complete(p->r.bms_file).string() << std::endl; - *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Target reference frame:" << p->r.reference_frame << std::endl; + *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Target reference frame:" << p->r.reference_frame; + + if (userSuppliedFrame) + *f_out << " (user supplied)" << std::endl; + else + *f_out << " (project reference frame)" << std::endl; if (!p->r.epoch.empty()) { @@ -50,6 +55,18 @@ void PrintOutputFileHeaderInfo(std::ofstream* f_out, const std::string& out_file *f_out << std::setw(PRINT_VAR_PAD) << std::left << "Target epoch: " << p->r.epoch; if (isEpsgDatumStatic(epsgCode)) *f_out << " (adopted reference epoch of " << p->r.reference_frame << ")"; + else + { + if (userSuppliedEpoch) + *f_out << " (user supplied)" << std::endl; + else + { + if (userSuppliedFrame) + *f_out << " (adopted reference epoch of " << p->r.reference_frame << ")" << std::endl; + else + *f_out << " (project epoch)" << std::endl; + } + } *f_out << std::endl; } @@ -501,7 +518,7 @@ int main(int argc, char* argv[]) if (vm.count(REFERENCE_FRAME)) std::cout << " (user supplied)" << std::endl; else - std::cout << " (project default)" << std::endl; + std::cout << " (project reference frame)" << std::endl; // try to parse user supplied string. If this fails, then there's not much point in attempting // to transform stations and measurements @@ -517,7 +534,12 @@ int main(int argc, char* argv[]) if (vm.count(EPOCH)) std::cout << " (user supplied)" << std::endl; else - std::cout << " (project default)" << std::endl; + { + if (vm.count(REFERENCE_FRAME)) + std::cout << " (adopted reference epoch of " << p.r.reference_frame << ")" << std::endl; + else + std::cout << " (project epoch)" << std::endl; + } } std::cout << std::endl; } @@ -567,7 +589,7 @@ int main(int argc, char* argv[]) std::cout << std::endl; } - PrintOutputFileHeaderInfo(&rft_file, p.r.rft_file, &p, "DYNADJUST REFTRAN LOG FILE", epsgCode); + PrintOutputFileHeaderInfo(&rft_file, p.r.rft_file, &p, "DYNADJUST REFTRAN LOG FILE", epsgCode, vm.count(REFERENCE_FRAME), vm.count(EPOCH)); dna_reftran refTran(p, &rft_file); std::stringstream ss_msg; diff --git a/dynadjust/include/functions/dnatemplatefuncs.hpp b/dynadjust/include/functions/dnatemplatefuncs.hpp index d89ac121..d309e837 100644 --- a/dynadjust/include/functions/dnatemplatefuncs.hpp +++ b/dynadjust/include/functions/dnatemplatefuncs.hpp @@ -194,6 +194,9 @@ S FormatDateString(const S& datestring) S delimiter("."); SplitDelimitedString(datestring, delimiter, &tokenList); + if (tokenList.size() < 3) + return ""; + if (tokenList.at(0).size() < 2) tokenList.at(0).insert(0, "0"); if (tokenList.at(1).size() < 2) diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index 1ac45eea..7ea5f7c6 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -400,7 +400,7 @@ void dna_io_dna::read_dna_header(std::ifstream* ptr, std::string& version, INPUT } catch (const std::runtime_error& e) { std::stringstream ssError; - ssError << "The supplied frame is not recognised" << std::endl << + ssError << "The supplied frame (" << file_referenceframe << ") is not recognised" << std::endl << e.what() << std::endl; throw boost::enable_current_exception(std::runtime_error(ssError.str())); } diff --git a/dynadjust/include/parameters/dnaepsg.hpp b/dynadjust/include/parameters/dnaepsg.hpp index afd0b462..db7aacc2 100644 --- a/dynadjust/include/parameters/dnaepsg.hpp +++ b/dynadjust/include/parameters/dnaepsg.hpp @@ -181,7 +181,7 @@ U epsgCodeFromName(const S& datumName) return WGS84_G2139_i_xyz; std::stringstream ss; - ss << " epsgCodeFromName: " << datumName << " is not a supported reference frame label." << std::endl; + ss << " epsgCodeFromName: '" << datumName << "' is not a supported reference frame label." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } @@ -280,7 +280,7 @@ S epsgStringFromName(const S& datumName) } std::stringstream ss; - ss << " epsgStringFromName: " << datumName << " is either unknown or not yet supported." << std::endl; + ss << " epsgStringFromName: '" << datumName << "' is either unknown or not yet supported." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } @@ -354,7 +354,7 @@ bool isEpsgDatumStatic(const U& epsgCode) case WGS84_G2139_i: return false; default: - ss << " isEpsgDatumStatic: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + ss << " isEpsgDatumStatic: EPSG code '" << epsgCode << "' is not a supported EPSG code." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } return false; @@ -454,7 +454,7 @@ void spheroidFromEpsgCode(const U& epsgCode, epsg_spheroid& ellipsoid) break; default: std::stringstream ss; - ss << " spheroidFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + ss << " spheroidFromEpsgCode: EPSG code '" << epsgCode << "' is not a supported EPSG code." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } } @@ -549,7 +549,7 @@ std::string referenceepochFromEpsgCode(const U& epsgCode) return WGS84_G2139_epoch; default: std::stringstream ss; - ss << " referenceepochFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + ss << " referenceepochFromEpsgCode: EPSG code '" << epsgCode << "' is not a supported EPSG code." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } return ""; @@ -654,7 +654,7 @@ S datumFromEpsgCode(const U& epsgCode) return WGS84_G2139_s; default: std::stringstream ss; - ss << " datumFromEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + ss << " datumFromEpsgCode: EPSG code '" << epsgCode << "' is not a supported EPSG code." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } return ""; @@ -747,7 +747,7 @@ bool validateEpsgCode(const U& epsgCode) return true; default: std::stringstream ss; - ss << " validateEpsgCode: EPSG code " << epsgCode << " is not a supported EPSG code." << std::endl; + ss << " validateEpsgCode: EPSG code '" << epsgCode << "' is not a supported EPSG code." << std::endl; throw boost::enable_current_exception(std::runtime_error(ss.str())); } return false; From 3fd6e3a7f2281b8d7d3a0419144d0732c8e4be7f Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:41:36 +1100 Subject: [PATCH 101/102] Minor enhancements --- dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp index 3b9dba0d..57dcfa19 100644 --- a/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp +++ b/dynadjust/dynadjust/dnaimportwrapper/dnaimportwrapper.cpp @@ -1140,8 +1140,8 @@ int ImportDataFiles(dna_import& parserDynaML, vdnaStnPtr* vStations, vdnaMsrPtr* { epochSource << " - Warning: File epoch (" << inputFileEpoch << ") will be ignored." << std::endl; if (!p.g.quiet) - std::cout << epochSource.str() << std::endl; - *imp_file << epochSource.str() << std::endl; + std::cout << epochSource.str(); + *imp_file << epochSource.str(); } else { From 5076143f744dbbfcd878822fef1a8245ab757144 Mon Sep 17 00:00:00 2001 From: rogerfraser <18198507+rogerfraser@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:55:58 +1100 Subject: [PATCH 102/102] Remove unused variable --- dynadjust/dynadjust/dnaimport/dnainterop.cpp | 1 - dynadjust/include/io/dnaiodna.cpp | 4 ++-- dynadjust/include/io/dnaiodna.hpp | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/dynadjust/dynadjust/dnaimport/dnainterop.cpp b/dynadjust/dynadjust/dnaimport/dnainterop.cpp index 0eeffc94..ab02e86d 100644 --- a/dynadjust/dynadjust/dnaimport/dnainterop.cpp +++ b/dynadjust/dynadjust/dnaimport/dnainterop.cpp @@ -1081,7 +1081,6 @@ void dna_import::ParseDNA(const std::string& fileName, vdnaStnPtr* vStations, PU // reference frame based on the header and user preferences dnaFile.read_dna_header(ifsInputFILE_, version, idt, datum_, // project datum - projectSettings_.i.user_supplied_frame==1, // Has a reference frame been supplied? fileEpsg, fileEpoch, geoversion, count); // release file pointer mutex import_file_mutex.unlock(); diff --git a/dynadjust/include/io/dnaiodna.cpp b/dynadjust/include/io/dnaiodna.cpp index 7ea5f7c6..d3ad830d 100644 --- a/dynadjust/include/io/dnaiodna.cpp +++ b/dynadjust/include/io/dnaiodna.cpp @@ -165,7 +165,7 @@ void dna_io_dna::read_ren_file(const std::string& filename, pv_string_vstring_pa UINT32 count(0); // read header information - read_dna_header(&renaming_file, version, idt, datum, false, fileEpsg, fileEpoch, geoidVersion, count); + read_dna_header(&renaming_file, version, idt, datum, fileEpsg, fileEpoch, geoidVersion, count); read_ren_data(&renaming_file, stnRenaming); @@ -249,7 +249,7 @@ void dna_io_dna::read_ren_data(std::ifstream* ptr, pv_string_vstring_pair stnRen void dna_io_dna::read_dna_header(std::ifstream* ptr, std::string& version, INPUT_DATA_TYPE& idt, - CDnaDatum& referenceframe, bool user_supplied_frame, + CDnaDatum& referenceframe, std::string& fileEpsg, std::string& fileEpoch, std::string& geoidversion, UINT32& count) { std::string sBuf; diff --git a/dynadjust/include/io/dnaiodna.hpp b/dynadjust/include/io/dnaiodna.hpp index 1362331c..3fd47e79 100644 --- a/dynadjust/include/io/dnaiodna.hpp +++ b/dynadjust/include/io/dnaiodna.hpp @@ -95,7 +95,7 @@ class dna_io_dna : public dna_io_base const CDnaDatum& datum, const std::string& comment); void read_dna_header(std::ifstream* ptr, std::string& version, INPUT_DATA_TYPE& idt, - CDnaDatum& referenceframe, bool user_supplied_frame, + CDnaDatum& referenceframe, std::string& fileEpsg, std::string& fileEpoch, std::string& geoidversion, UINT32& count); inline const dna_stn_fields dna_stn_positions() { return dsl_; }

  • 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�}(y&^8npsHe%X1~uTc&_qTY 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