#include #include #include #include #include #include "MBDynSystem.h" #include "CREATE.h" #include "FullColumn.h" #include "MBDynInitialValue.h" #include "MBDynData.h" #include "MBDynControlData.h" #include "MBDynLabels.h" #include "MBDynVariables.h" #include "MBDynReferences.h" #include "MBDynNodes.h" #include "MBDynElements.h" using namespace MbD; void MbD::MBDynSystem::runFile(const char* filename) { std::ifstream stream(filename); std::string line; std::vector lines; while (std::getline(stream, line)) { lines.push_back(line); } eraseComments(lines); auto statements = collectStatements(lines); auto system = std::make_shared(); system->setFilename(filename); system->parseMBDyn(statements); system->runKINEMATIC(); } void MbD::MBDynSystem::parseMBDyn(std::vector& lines) { readDataBlock(lines); readInitialValueBlock(lines); readControlDataBlock(lines); readLabels(lines); readVariables(lines); readReferences(lines); readNodesBlock(lines); readElementsBlock(lines); } std::shared_ptr MbD::MBDynSystem::mbdynVariables() { return variables; } std::shared_ptr MbD::MBDynSystem::mbdynReferences() { return references; } void MbD::MBDynSystem::runKINEMATIC() { assert(false); } void MbD::MBDynSystem::setFilename(std::string str) { filename = str; } void MbD::MBDynSystem::readDataBlock(std::vector& lines) { std::vector tokens{"begin:", "data;"}; auto beginit = findLineWith(lines, tokens); std::vector tokens1{"end:", "data;"}; auto endit = findLineWith(lines, tokens1); std::vector blocklines = { beginit, endit + 1 }; dataBlk = std::make_shared(); dataBlk->owner = this; dataBlk->parseMBDyn(blocklines); lines.erase(beginit, endit + 1); } void MbD::MBDynSystem::readInitialValueBlock(std::vector& lines) { std::vector tokens{"begin:", "initial", "value"}; auto beginit = findLineWith(lines, tokens); std::vector tokens1{"end:", "initial", "value"}; auto endit = findLineWith(lines, tokens1); std::vector blocklines = { beginit, endit + 1 }; initialValueBlk = std::make_shared(); initialValueBlk->owner = this; initialValueBlk->parseMBDyn(blocklines); lines.erase(beginit, endit + 1); } void MbD::MBDynSystem::readControlDataBlock(std::vector& lines) { std::vector tokens{"begin:", "control", "data"}; auto beginit = findLineWith(lines, tokens); std::vector tokens1{"end:", "control", "data"}; auto endit = findLineWith(lines, tokens1); std::vector blocklines = { beginit, endit + 1 }; controlDataBlk = std::make_shared(); controlDataBlk->owner = this; controlDataBlk->parseMBDyn(blocklines); lines.erase(beginit, endit + 1); } void MbD::MBDynSystem::readLabels(std::vector& lines) { labels = std::make_shared(); labels->owner = this; labels->parseMBDyn(lines); } void MbD::MBDynSystem::readVariables(std::vector& lines) { variables = std::make_shared(); variables->owner = this; variables->parseMBDyn(lines); } void MbD::MBDynSystem::readReferences(std::vector& lines) { references = std::make_shared(); references->owner = this; references->parseMBDyn(lines); } void MbD::MBDynSystem::readNodesBlock(std::vector& lines) { std::vector tokens{ "begin:", "nodes;" }; auto beginit = findLineWith(lines, tokens); std::vector tokens1{ "end:", "nodes;" }; auto endit = findLineWith(lines, tokens1); std::vector blocklines = { beginit, endit + 1 }; nodesBlk = std::make_shared(); nodesBlk->owner = this; nodesBlk->parseMBDyn(blocklines); lines.erase(beginit, endit + 1); } void MbD::MBDynSystem::readElementsBlock(std::vector& lines) { std::vector tokens{ "begin:", "elements;" }; auto beginit = findLineWith(lines, tokens); std::vector tokens1{ "end:", "elements;" }; auto endit = findLineWith(lines, tokens1); std::vector blocklines = { beginit, endit + 1 }; elementsBlk = std::make_shared(); elementsBlk->owner = this; elementsBlk->parseMBDyn(blocklines); lines.erase(beginit, endit + 1); } void MbD::MBDynSystem::eraseComments(std::vector& lines) { for (int i = 0; i < lines.size(); i++) { auto line = lines[i]; auto it = line.find('#'); if (it != std::string::npos) { lines[i] = line.substr(0, it); } } for (int i = lines.size() - 1; i >= 0; i--) { auto& line = lines[i]; auto it = std::find_if(line.begin(), line.end(), [](unsigned char ch) { return !std::isspace(ch); }); if (it == line.end()) lines.erase(lines.begin() + i); } } std::vector MbD::MBDynSystem::collectStatements(std::vector& lines) { auto statements = std::vector(); while (!lines.empty()) { std::stringstream ss; while (!lines.empty()) { auto line = lines[0]; lines.erase(lines.begin()); auto i = line.find(';'); if (i != std::string::npos) { ss << line.substr(0, i + 1); if (line.size() > i + 1) { auto remainder = line.substr(i + 1); auto it = std::find_if(remainder.begin(), remainder.end(), [](unsigned char ch) { return !std::isspace(ch); }); if (it != remainder.end()) lines.insert(lines.begin(), remainder); } break; } else { ss << line; } } statements.push_back(ss.str()); } return statements; } void MbD::MBDynSystem::initialize() { }