/*************************************************************************** * Copyright (c) 2023 Ondsel, Inc. * * * * This file is part of OndselSolver. * * * * See LICENSE file for details about copyright. * ***************************************************************************/ #include "ASMTGeneralMotion.h" #include "ASMTAssembly.h" #include "SymbolicParser.h" #include "BasicUserFunction.h" #include "CREATE.h" #include "Constant.h" #include "EulerAngles.h" using namespace MbD; void MbD::ASMTGeneralMotion::parseASMT(std::vector& lines) { readName(lines); readMarkerI(lines); readMarkerJ(lines); readrIJI(lines); readangIJJ(lines); readRotationOrder(lines); } void MbD::ASMTGeneralMotion::readrIJI(std::vector& lines) { rIJI = std::make_shared>(3); assert(lines[0].find("rIJI1") != std::string::npos); lines.erase(lines.begin()); rIJI->at(0) = readString(lines[0]); lines.erase(lines.begin()); assert(lines[0].find("rIJI2") != std::string::npos); lines.erase(lines.begin()); rIJI->at(1) = readString(lines[0]); lines.erase(lines.begin()); assert(lines[0].find("rIJI3") != std::string::npos); lines.erase(lines.begin()); rIJI->at(2) = readString(lines[0]); lines.erase(lines.begin()); } void MbD::ASMTGeneralMotion::readangIJJ(std::vector& lines) { angIJJ = std::make_shared>(3); assert(lines[0].find("angIJJ1") != std::string::npos); lines.erase(lines.begin()); angIJJ->at(0) = readString(lines[0]); lines.erase(lines.begin()); assert(lines[0].find("angIJJ2") != std::string::npos); lines.erase(lines.begin()); angIJJ->at(1) = readString(lines[0]); lines.erase(lines.begin()); assert(lines[0].find("angIJJ3") != std::string::npos); lines.erase(lines.begin()); angIJJ->at(2) = readString(lines[0]); lines.erase(lines.begin()); } void MbD::ASMTGeneralMotion::readRotationOrder(std::vector& lines) { assert(lines[0].find("RotationOrder") != std::string::npos); lines.erase(lines.begin()); rotationOrder = readString(lines[0]); lines.erase(lines.begin()); } std::shared_ptr MbD::ASMTGeneralMotion::mbdClassNew() { return CREATE::With(); } void MbD::ASMTGeneralMotion::createMbD(std::shared_ptr mbdSys, std::shared_ptr mbdUnits) { ASMTMotion::createMbD(mbdSys, mbdUnits); auto parser = CREATE::With(); parser->owner = this; auto geoTime = owner->root()->geoTime(); parser->variables->insert(std::make_pair("time", geoTime)); std::shared_ptr< BasicUserFunction> userFunc; auto fullMotion = std::static_pointer_cast(mbdObject); //rIJI userFunc = CREATE::With(rIJI->at(0), 1.0); parser->parseUserFunction(userFunc); auto geoX = parser->stack->top(); geoX = Symbolic::times(geoX, std::make_shared(1.0 / mbdUnits->length)); geoX->createMbD(mbdSys, mbdUnits); auto xBlk = geoX->simplified(geoX); userFunc = CREATE::With(rIJI->at(1), 1.0); parser->parseUserFunction(userFunc); auto geoY = parser->stack->top(); geoY = Symbolic::times(geoY, std::make_shared(1.0 / mbdUnits->length)); geoY->createMbD(mbdSys, mbdUnits); auto yBlk = geoY->simplified(geoY); userFunc = CREATE::With(rIJI->at(2), 1.0); parser->parseUserFunction(userFunc); auto geoZ = parser->stack->top(); geoZ = Symbolic::times(geoZ, std::make_shared(1.0 / mbdUnits->length)); geoZ->createMbD(mbdSys, mbdUnits); auto zBlk = geoZ->simplified(geoZ); auto xyzBlkList = std::initializer_list{ xBlk, yBlk, zBlk }; fullMotion->frIJI = std::make_shared>(xyzBlkList); //angIJJ userFunc = CREATE::With(angIJJ->at(0), 1.0); parser->parseUserFunction(userFunc); auto geoPhi = parser->stack->top(); geoPhi = Symbolic::times(geoPhi, std::make_shared(1.0 / mbdUnits->angle)); geoPhi->createMbD(mbdSys, mbdUnits); auto phiBlk = geoPhi->simplified(geoPhi); userFunc = CREATE::With(angIJJ->at(1), 1.0); parser->parseUserFunction(userFunc); auto geoThe = parser->stack->top(); geoThe = Symbolic::times(geoThe, std::make_shared(1.0 / mbdUnits->angle)); geoThe->createMbD(mbdSys, mbdUnits); auto theBlk = geoThe->simplified(geoThe); userFunc = CREATE::With(angIJJ->at(2), 1.0); parser->parseUserFunction(userFunc); auto geoPsi = parser->stack->top(); geoPsi = Symbolic::times(geoPsi, std::make_shared(1.0 / mbdUnits->angle)); geoPsi->createMbD(mbdSys, mbdUnits); auto psiBlk = geoPsi->simplified(geoPsi); auto xyzRotBlkList = std::initializer_list{ phiBlk, theBlk, psiBlk }; auto fangIJJ = std::make_shared>(xyzRotBlkList); std::istringstream iss(rotationOrder); auto rotOrder = std::make_shared>(); int order; for (int i = 0; i < 3; i++) { iss >> order; rotOrder->push_back(order); } fangIJJ->rotOrder = rotOrder; fullMotion->fangIJJ = fangIJJ; }