diff --git a/CMakeLists.txt b/CMakeLists.txt index ae7120fb9535b89c78cb098f3842c723c1a9cf65..86683865938f22106b730737cbafdbbce54690e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,8 @@ add_executable(validateSerials "validateSerials.cpp") add_executable(testXmlStructure "testxmlstructure.cxx") +add_executable(makeProdSheet "makeProdSheet.cpp") + target_link_libraries(toolbox Qt5::Network Qt5::Core Qt5::Xml proddbaccess) target_link_libraries(proddbaccess Qt5::Network Qt5::Core Qt5::Xml) @@ -53,3 +55,5 @@ target_link_libraries(setSentForAnalysisAfterIrradiation proddbaccess proddbclie target_link_libraries(setIrradiationInfo proddbaccess proddbclient boost_program_options Qt5::Gui Qt5::Widgets) target_link_libraries(setAnnealingInfo proddbaccess proddbclient boost_program_options Qt5::Gui Qt5::Widgets) target_link_libraries(validateSerials proddbaccess) + +target_compile_features(makeProdSheet PRIVATE cxx_std_17) diff --git a/makeProdSheet.cpp b/makeProdSheet.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ca3bef06e313c1e00b7035599597daa430ce719f --- /dev/null +++ b/makeProdSheet.cpp @@ -0,0 +1,204 @@ +#include <iostream> +#include <fstream> +#include <string> +#include <vector> +#include <filesystem> +#include <cstdlib> +#include <chrono> + +bool checkFilesExist(std::string texFileName, std::string csvFileName, std::string prodSheetPdfName){ + + bool oneFileExists = false; + + if(std::filesystem::exists(texFileName)){ + std::cerr << "ERROR - " << texFileName << " already exists" << std::endl; + oneFileExists = true; + } + if (std::filesystem::exists(csvFileName)){ + std::cerr << "ERROR - " << csvFileName << " already exists" << std::endl; + oneFileExists = true; + } + if (std::filesystem::exists(prodSheetPdfName)){ + std::cerr << "ERROR - " << prodSheetPdfName << " already exists" << std::endl; + oneFileExists = true; + } + + return oneFileExists; +} + +bool makeTexFile(std::vector<std::string> serialList, std::string texFileName){ + + std::fstream serialTexFile; + serialTexFile.open(texFileName, std::fstream::out); + if(serialTexFile.is_open()){ + serialTexFile << "\\newcommand{\\serialZeroR}{" << serialList[0] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialZeroB}{" << serialList[8] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialOneR}{" << serialList[1] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialOneB}{" << serialList[9] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialTwoR}{" << serialList[16] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialTwoB}{" << serialList[24] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialThreeR}{" << serialList[17] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialThreeB}{" << serialList[25] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialFourR}{" << serialList[2] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialFourB}{" << serialList[10] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialFiveR}{" << serialList[3] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialFiveB}{" << serialList[11] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialSixR}{" << serialList[18] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialSixB}{" << serialList[26] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialSevenR}{" << serialList[19] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialSevenB}{" << serialList[27] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialEightR}{" << serialList[4] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialEightB}{" << serialList[12] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialNineR}{" << serialList[5] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialNineB}{" << serialList[13] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialAR}{" << serialList[20] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialAB}{" << serialList[28] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialBR}{" << serialList[21] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialBB}{" << serialList[29] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialCR}{" << serialList[6] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialCB}{" << serialList[14] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialDR}{" << serialList[7] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialDB}{" << serialList[15] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialER}{" << serialList[22] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialEB}{" << serialList[30] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialFR}{" << serialList[23] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialFB}{" << serialList[31] << "}" << std::endl; + /* + serialTexFile << "\\newcommand{\\serialZeroR}{" << serialList[0] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialZeroB}{" << serialList[1] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialOneR}{" << serialList[2] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialOneB}{" << serialList[3] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialTwoR}{" << serialList[4] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialTwoB}{" << serialList[5] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialThreeR}{" << serialList[6] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialThreeB}{" << serialList[7] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialFourR}{" << serialList[8] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialFourB}{" << serialList[9] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialFiveR}{" << serialList[10] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialFiveB}{" << serialList[11] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialSixR}{" << serialList[12] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialSixB}{" << serialList[13] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialSevenR}{" << serialList[14] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialSevenB}{" << serialList[15] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialEightR}{" << serialList[16] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialEightB}{" << serialList[17] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialNineR}{" << serialList[18] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialNineB}{" << serialList[19] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialAR}{" << serialList[20] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialAB}{" << serialList[21] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialBR}{" << serialList[22] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialBB}{" << serialList[23] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialCR}{" << serialList[24] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialCB}{" << serialList[25] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialDR}{" << serialList[26] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialDB}{" << serialList[27] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialEB}{" << serialList[29] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialER}{" << serialList[28] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialFR}{" << serialList[30] << "}" << std::endl; + serialTexFile << "\\newcommand{\\serialFB}{" << serialList[31] << "}" << std::endl; + */ + } else { + std::cerr << "ERROR - couldnt open tex-file" << std::endl; + return false; + } + return true; +} + +bool makeCsvFile(std::vector<std::string> serialList, std::string csvFileName){ + + std::fstream serialCsvFile; + serialCsvFile.open(csvFileName, std::fstream::out); + if(serialCsvFile.is_open()){ + serialCsvFile << serialList[0] << " " << serialList[8] << std::endl; + serialCsvFile << serialList[1] << " " << serialList[9] << std::endl; + serialCsvFile << serialList[16] << " " << serialList[24] << std::endl; + serialCsvFile << serialList[17] << " " << serialList[25] << std::endl; + serialCsvFile << serialList[2] << " " << serialList[10] << std::endl; + serialCsvFile << serialList[3] << " " << serialList[11] << std::endl; + serialCsvFile << serialList[18] << " " << serialList[26] << std::endl; + serialCsvFile << serialList[19] << " " << serialList[27] << std::endl; + serialCsvFile << serialList[4] << " " << serialList[12] << std::endl; + serialCsvFile << serialList[5] << " " << serialList[13] << std::endl; + serialCsvFile << serialList[20] << " " << serialList[28] << std::endl; + serialCsvFile << serialList[21] << " " << serialList[29] << std::endl; + serialCsvFile << serialList[6] << " " << serialList[14] << std::endl; + serialCsvFile << serialList[7] << " " << serialList[15] << std::endl; + serialCsvFile << serialList[22] << " " << serialList[30] << std::endl; + serialCsvFile << serialList[23] << " " << serialList[31] << std::endl; + /* + for (int i=0; i < serialList.size()-1; i+=2){ + serialCsvFile << serialList[i] << " " << serialList[i+1] << std::endl; + } + */ + } else { + std::cerr << "ERROR - couldnt open csv-file" << std::endl; + return false; + } + return true; +} + +bool makePdfFile(std::string prodSheetPdfName){ + //std::system("cp /home/orestis/Dokumente/Laufzettel/headerProductionSheet.tex ."); + std::system("cp /home/tau/oafedulidis/APDStuff/makeProdSheet/tex/headerProductionSheet.tex ."); + //std::system("cp /home/orestis/Dokumente/Laufzettel/productionSheet.tex ."); + std::system("cp /home/tau/oafedulidis/APDStuff/makeProdSheet/tex/productionSheet.tex ."); + std::system("pdflatex productionSheet.tex > /dev/null"); + if(std::filesystem::exists(prodSheetPdfName)){ + std::system("rm productionSheet.log productionSheet.aux productionSheet.tex serialsAssigned.tex headerProductionSheet.tex"); + return true; + } + else { + return false; + } +} + +int main(){ + + std::string serialFileName = "serials.dat"; + std::string csvFileName = "apd_assignments_on_alveole.csv"; + std::string texFileName = "serialsAssigned.tex"; + std::string prodSheetPdfName = "productionSheet.pdf"; + + std::string lineBuffer; + std::vector<std::string> serialList; + serialList.clear(); + + std::fstream serialFile; + serialFile.open(serialFileName, std::fstream::in); + if(serialFile.is_open()){ + while(std::getline(serialFile, lineBuffer)){ + if(lineBuffer.size() == 9) lineBuffer = "0" + lineBuffer; + if(lineBuffer.size() == 10) serialList.push_back(lineBuffer); + } + serialFile.close(); + } else { + std::cerr << "ERROR - could not open File: " << serialFileName << std::endl; + return 1; + } + + if(serialList.size() == 32){ + std::cout << "found " << serialList.size() << " serials" << std::endl; + std::cout << "creating tex-file for production sheet" << std::endl; + std::cout << "creating csv-file for APD serials where Crystals and Barcodes needs to be added" << std::endl; + if(!checkFilesExist(texFileName, csvFileName, prodSheetPdfName)){ + if(!makeTexFile(serialList, texFileName)) return 1; + if(!makeCsvFile(serialList, csvFileName)) return 1; + } else { + return 1; + } + } else { + std::cerr << "ERROR - unexpected amount of serials, expected 32 but got " << serialList.size(); + return 1; + } + std::cout << "serialsAssigned.tex and apd_assignments_on_alveole.csv created" << std::endl; + std::cout << "know executing pdflatex to compile productionSheet.pdf" << std::endl; + + if(makePdfFile(prodSheetPdfName)){ + std::cout << "productionSheet.pdf created and cleared output" << std::endl; + } else { + std::cout << "could not create productionSheet.pdf" << std::endl; + return 1; + } + + return 0; +} diff --git a/toolbox.cpp b/toolbox.cpp index 88fd14da7dfbb8974a88314f27141745d0b758b0..9de3c3f9de43d8a3afe5ad959ae3266d65662108 100644 --- a/toolbox.cpp +++ b/toolbox.cpp @@ -2,6 +2,7 @@ #include <iostream> #include <string> #include <vector> +#include <algorithm> #include "ProdDbAccess.h" #include "BulkDbAccess.h" @@ -22,6 +23,10 @@ vector<string> loadSerialsFromFileName(string m_fileName, bool m_debug = false) while (in.good()) { getline(in,line); if (line.length() == 0 || !isdigit(line[0])) continue; + line.erase(std::remove_if(line.begin(), line.end(), [](char c) {return !std::isdigit(c); }), line.end()); + while (line.length() < 10) { + line = "0" + line; + } result.push_back(line); if (m_debug) cout << "Found serial: " << line << endl; } @@ -38,7 +43,7 @@ AbsDbAccess *suitedDbAccess(size_t nAPDs, bool debug = false) { } else { if (debug) - std::cout << "Initializing BulkDbAccess which becomes efficient for many queries. Patience, this might take a minute..."; + std::cout << "Initializing ProdDbAccess, since only a few APDs are being queried..."; result = new ProdDbAccess(); } return result;