#define EXPORT_DLL #include "SolveSpaceSystem.h" #include //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- SolveSpaceSystem::SolveSpaceSystem() : m_paramsMemory (new std::vector ()) , m_entityMemory (new std::vector ()) , m_constraintMemory (new std::vector ()) , m_failedConstrMemory(new std::vector()) { m_paramsMemory ->reserve(100); m_entityMemory ->reserve(100); m_constraintMemory->reserve(100); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- Slvs_hParam SolveSpaceSystem::addParam(Slvs_Param parameter) { parameter.h = static_cast(m_paramsMemory->size()+1); m_paramsMemory->push_back(parameter); m_slvsSystem.param = m_paramsMemory->data(); m_slvsSystem.params = static_cast(m_paramsMemory->size()); return parameter.h; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- Slvs_hEntity SolveSpaceSystem::addEntity(Slvs_Entity entity) { entity.h = static_cast(m_entityMemory->size()+1); m_entityMemory->push_back(entity); m_slvsSystem.entity = m_entityMemory->data(); m_slvsSystem.entities = static_cast(m_entityMemory->size()); return entity.h; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- Slvs_hConstraint SolveSpaceSystem::addConstr(Slvs_Constraint constr) { constr.h = static_cast(m_constraintMemory->size()+1); m_constraintMemory->push_back(constr); m_slvsSystem.constraint = m_constraintMemory->data(); m_slvsSystem.constraints = static_cast(m_constraintMemory->size()); return constr.h; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- SolveSpaceSystem::ResultStatus SolveSpaceSystem::solve(Slvs_hGroup groupId, bool reportFailedConstraints /*= true*/) { m_failedConstrMemory->resize(m_constraintMemory->size()); m_slvsSystem.failed = m_failedConstrMemory->data(); m_slvsSystem.faileds = static_cast(m_failedConstrMemory->size()); m_slvsSystem.calculateFaileds = reportFailedConstraints; Slvs_Solve(&m_slvsSystem, groupId); m_failedConstrMemory->resize(m_slvsSystem.faileds); return static_cast(m_slvsSystem.result); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- double SolveSpaceSystem::parameterValue(Slvs_hParam paramId) { return (*m_paramsMemory)[paramId-1].val; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void SolveSpaceSystem::setParameterValue(Slvs_hParam paramId, double value) { (*m_paramsMemory)[paramId-1].val = value; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::tuple< std::valarray, std::valarray, std::valarray > SolveSpaceSystem::orientationMx(Slvs_hEntity normalIn3dEntityId) { Slvs_Entity e_CS = (*m_entityMemory)[normalIn3dEntityId -1]; if ( e_CS.type == SLVS_E_NORMAL_IN_3D ) { std::valarray quat ={ 0.0, 0.0, 0.0, 0.0 }; quat[0] = parameterValue(e_CS.param[0]); quat[1] = parameterValue(e_CS.param[1]); quat[2] = parameterValue(e_CS.param[2]); quat[3] = parameterValue(e_CS.param[3]); std::valarray Ex ={ 0.0,0.0,0.0 }; std::valarray Ey ={ 0.0,0.0,0.0 }; std::valarray Ez ={ 0.0,0.0,0.0 }; Slvs_QuaternionU(quat[0], quat[1], quat[2], quat[3], &Ex[0], &Ex[1], &Ex[2]); Slvs_QuaternionV(quat[0], quat[1], quat[2], quat[3], &Ey[0], &Ey[1], &Ey[2]); Slvs_QuaternionN(quat[0], quat[1], quat[2], quat[3], &Ez[0], &Ez[1], &Ez[2]); return std::make_tuple(Ex, Ey, Ez); } assert(false); return std::make_tuple(std::valarray(), std::valarray(), std::valarray()); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::valarray SolveSpaceSystem::global3DPos(Slvs_hEntity pointEntityId) { std::valarray point ={ 0.0,0.0,0.0 }; Slvs_Entity pointEntity = (*m_entityMemory)[pointEntityId -1]; if ( pointEntity.type == SLVS_E_POINT_IN_2D ) { std::valarray locPoint ={ 0.0,0.0,0.0 }; locPoint[0] = parameterValue(pointEntity.param[0]); locPoint[1] = parameterValue(pointEntity.param[1]); Slvs_Entity e_Plane = (*m_entityMemory)[pointEntity.wrkpl - 1]; std::valarray origin = global3DPos(e_Plane.point[0]); auto mx = orientationMx(e_Plane.normal); point = origin + std::get<0>(mx)*locPoint[0] + std::get<1>(mx)*locPoint[1]; } else if ( pointEntity.type == SLVS_E_POINT_IN_3D ) { point[0] = parameterValue(pointEntity.param[0]); point[1] = parameterValue(pointEntity.param[1]); point[2] = parameterValue(pointEntity.param[2]); } return point; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- Slvs_Constraint& SolveSpaceSystem::constraint(Slvs_hConstraint constraintId) { return (*m_constraintMemory)[constraintId-1]; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector SolveSpaceSystem::failedConstraints() const { return (*m_failedConstrMemory); }