From 75a3edd6e6a5c16aea583771dfd1924c7aee9103 Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Tue, 19 Dec 2000 21:37:10 +0000 Subject: [PATCH] r305: Initial CVS import --- include/plotfile.h | 148 ++++++++++++++++++++++ libctsupport/plotfile.cpp | 251 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 399 insertions(+) create mode 100644 include/plotfile.h create mode 100644 libctsupport/plotfile.cpp diff --git a/include/plotfile.h b/include/plotfile.h new file mode 100644 index 0000000..35c7f9f --- /dev/null +++ b/include/plotfile.h @@ -0,0 +1,148 @@ +/***************************************************************************** +** FILE IDENTIFICATION +** +** Name: plotfile.h +** Purpose: PlotFile class header +** Programmer: Kevin Rosenberg +** Date Started: Dec 2000 +** +** This is part of the CTSim program +** Copyright (C) 1983-2000 Kevin Rosenberg +** +** $Id: plotfile.h,v 1.1 2000/12/19 21:37:10 kevin Exp $ +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License (version 2) as +** published by the Free Software Foundation. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +******************************************************************************/ + +#ifndef PLOTFILE_H +#define PLOTFILE_H + +#ifndef MSVC +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include "ctsupport.h" +#include "plotfile.h" + +// Plotfile structure: +// 1. Lines that begin with # are comments +// 2. ASCII file format +// 3. Header lines begin with and end with +// 4. Valid headers +//
(signifies beginning of headers) +// (multiple instances may be present) +// +// +// <xlabel> +// <ylabel> +// <filetype>plotfile</filetype> (required) +// <ncolumns> (required) +// <nrecords> (required) +// </header> (required, signifies end of headers) +// 5. Data is ASCII file format, one record per line +// Number of columns is variable and is set by ncolumns header +// 6. Data begins with <plotdata> and ends with </plotdata> + + +class PlotFile +{ + private: + std::string m_strFilename; + std::string m_strTitle; + std::string m_strXLabel; + std::string m_strYLabel; + std::string m_strDate; + std::vector<std::string> m_vecStrDescriptions; + std::vector<double> m_vecCurves; + int m_iNumColumns; + int m_iNumRecords; + + bool headerRead (std::iostream& os); + bool headerWrite (std::iostream& os); + bool columnsRead (std::iostream& os); + bool columnsWrite (std::iostream& os); + + void initHeaders (); + + PlotFile (const PlotFile& rhs); // copy constructor + PlotFile& operator= (const PlotFile&); // assignment operator + +public: + PlotFile (int iNColumns, int iNRecords); + PlotFile (void); + ~PlotFile (); + + void setTitle (const std::string& title) + { m_strTitle = title; } + + void setXLabel (const std::string& label) + { m_strXLabel = label; } + + void setYLabel (const std::string& label) + { m_strYLabel = label; } + + void setCurveSize (int iNCurves, int iNRecords); + + void addDescription (const char* const pszDesc) + { m_vecStrDescriptions.push_back (pszDesc); } + + bool addColumn (int iCol, const double* const pdColumn); + + bool addColumn (int iCol, const float* const pdColumn); + + const std::string& getTitle () const + { return m_strTitle; } + + const std::string& getXLabel () const + { return m_strXLabel; } + + const std::string& getYLabel () const + { return m_strXLabel; } + + const std::string& getData () const + { return m_strDate; } + + int getNumColumns () const + { return m_iNumColumns; } + + int getNumRecords () const + { return m_iNumRecords; } + + unsigned int getNumDescriptions (void) const + { return m_vecStrDescriptions.size(); } + + const std::string& getDescription (int iDescIndex) const + { return m_vecStrDescriptions[iDescIndex]; } + + bool fileRead (const char* const filename); + + bool fileWrite (const char* const filename); + + const std::string& getFilename (void) const + { return m_strFilename; } + + void printHeaders (std::ostream& os) const; +}; + + + +#endif diff --git a/libctsupport/plotfile.cpp b/libctsupport/plotfile.cpp new file mode 100644 index 0000000..588c014 --- /dev/null +++ b/libctsupport/plotfile.cpp @@ -0,0 +1,251 @@ +/***************************************************************************** +** FILE IDENTIFICATION +** +** Name: plotfile.cpp +** Purpose: plotfile class +** Programmer: Kevin Rosenberg +** Date Started: Dec 2000 +** +** This is part of the CTSim program +** Copyright (C) 1983-2000 Kevin Rosenberg +** +** $Id: plotfile.cpp,v 1.1 2000/12/19 21:37:10 kevin Exp $ +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License (version 2) as +** published by the Free Software Foundation. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +******************************************************************************/ + +#include "ct.h" +#include <ctime> + + +/////////////////////////////////////////////////////////////////////////// +// CLASS IMPLEMENTATION +// +// Name: PlotFile +// Purpose: Plot File storage +/////////////////////////////////////////////////////////////////////////// + + +PlotFile::PlotFile (int nCurves, int nRecords) +{ + initHeaders (); + setCurveSize (nCurves, nRecords); +} + +PlotFile::PlotFile () +{ + initHeaders (); +} + +PlotFile::~PlotFile () +{ +} + +void +PlotFile::initHeaders () +{ + m_iNumColumns = 0; + m_iNumRecords = 0; + m_strTitle = ""; + m_strXLabel = ""; + m_strYLabel = ""; + m_strDate = ""; + m_vecStrDescriptions.clear(); +} + +void +PlotFile::setCurveSize (int nCols, int nRecords) +{ + m_iNumColumns = nCols; + m_iNumRecords = nRecords; + m_vecCurves.clear(); + m_vecCurves.reserve (m_iNumColumns * m_iNumRecords); +} + +// Storage format +// a Column's records are stored sequentially. It begins at iCol * m_iNumRecords + +bool +PlotFile::addColumn (int iCol, const double* const pdColData) +{ + if (iCol < 0 || iCol >= m_iNumColumns) { + sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol); + return (false); + } + + for (int iRec = 0; iRec < m_iNumRecords; iRec++) + m_vecCurves[ iRec + (iCol * m_iNumRecords) ] = pdColData [iRec]; + + return true; +} + +bool +PlotFile::addColumn (int iCol, const float* const pdColData) +{ + if (iCol < 0 || iCol >= m_iNumColumns) { + sys_error (ERR_SEVERE, "Illegal column number %d [PlotFile::addColumn]", iCol); + return (false); + } + + for (int iRec = 0; iRec < m_iNumRecords; iRec++) + m_vecCurves[ iRec + (iCol * m_iNumRecords) ] = pdColData [iRec]; + + return true; +} + +bool +PlotFile::fileWrite (const char* const filename) +{ + m_strFilename = filename; + + fstream fs (m_strFilename.c_str(), std::ios::out | std::ios::trunc); + if (fs.fail()) { + sys_error (ERR_WARNING, "Error opening file %s for writing [fileCreate]", m_strFilename.c_str()); + return false; + } + + if (! headerWrite(fs) || ! columnsWrite (fs)) + return false; + + return true; +} + +bool +PlotFile::fileRead (const char* const filename) +{ + m_strFilename = filename; + +#ifdef MSVC + fstream fs (m_strFilename.c_str(), std::ios::in); +#else + fstream fs (m_strFilename.c_str(), std::ios::in | std::ios::nocreate); +#endif + + if (fs.fail()) { + sys_error (ERR_WARNING, "Unable to open file %s [fileRead]", m_strFilename.c_str()); + return false; + } + + if (! headerRead(fs)) + return false; + + setCurveSize (m_iNumColumns, m_iNumRecords); + + if (! columnsRead(fs)) + return false;; + + return true; +} + +bool +PlotFile::headerRead (std::iostream& fs) +{ + if (! fs) { + sys_error (ERR_WARNING, "Tried to read header with file closed [headerRead]"); + return false; + } + + fs.seekg (0); + + initHeaders(); + bool bInHeaders = true; +// while (bInHeaders) { + //} + + return ! fs.fail(); +} + + +bool +PlotFile::headerWrite (std::iostream& fs) +{ + if (! fs) { + sys_error (ERR_WARNING, "Tried to write header with ! fs"); + return false; + } + + fs.seekp (0); + fs << "<plotfile>\n"; + fs << "<header>\n"; + + if (! m_strDate.empty()) + fs << "<date>" << m_strDate << "</date>\n"; + + if (! m_strTitle.empty()) + fs << "<title>" << m_strTitle << "\n"; + + if (! m_strXLabel.empty()) + fs << "" << m_strXLabel << "\n"; + + if (! m_strYLabel.empty()) + fs << "" << m_strYLabel << "\n"; + + int iNDesc = m_vecStrDescriptions.size(); + for (int i = 0; i < iNDesc; i++) + fs << "" << m_vecStrDescriptions[i] << "\n"; + + fs << "
\n"; + + return ! fs.fail(); +} + + +bool +PlotFile::columnsWrite (std::iostream& fs) +{ + if (! fs) { + sys_error (ERR_WARNING, "Tried to columnWrite with !fs"); + return false; + } + + fs << "\n"; + + int iStride = m_iNumRecords; + for (int iRec = 0; iRec < m_iNumRecords; iRec++) { + for (int iCol = 0; iCol < m_iNumColumns; iCol++) + fs << m_vecCurves [iRec + (iCol * iStride)] << " "; + fs << "\n"; + } + + fs << "\n"; + + fs << "\n"; + + return ! fs.fail(); +} + + +bool +PlotFile::columnsRead (std::iostream& fs) +{ + if (! fs) { + sys_error (ERR_WARNING, "Tried to arrayDataRead with ! fs"); + return false; + } + + return ! fs.fail(); + + if (m_iNumColumns == 0 || m_iNumRecords == 0) { + sys_error (ERR_WARNING, "Called PlotFile::columnsRead with 0 columns or records"); + return false; + } + + return true; +} + + +void +PlotFile::printHeaders (std::ostream& os) const +{ +} -- 2.34.1