Qt Quick 3D - Robot Arm Example
#include "backend.h"
#include <QTransform>
Backend::Backend(QObject *parent) : QObject(parent)
{
connect(&m_rotation1Angle, &AnimatedParam::valueChanged, this, &Backend::rot1AngleChanged);
connect(&m_rotation2Angle, &AnimatedParam::valueChanged, this, &Backend::rot2AngleChanged);
connect(&m_rotation3Angle, &AnimatedParam::valueChanged, this, &Backend::rot3AngleChanged);
connect(&m_rotation4Angle, &AnimatedParam::valueChanged, this, &Backend::rot4AngleChanged);
connect(&m_clawsAngle, &AnimatedParam::valueChanged, this, &Backend::clawsAngleChanged);
m_status.setBinding([this]() {
return m_isCollision.value() ? QString("Collision!")
: m_rotation1Angle.isRunning() || m_rotation2Angle.isRunning() || m_rotation3Angle.isRunning()
|| m_rotation4Angle.isRunning()
? QString("Busy")
: QString("Ready");
});
connect(&m_rotation1Angle, &AnimatedParam::valueChanged, this, &Backend::detectCollision);
connect(&m_rotation2Angle, &AnimatedParam::valueChanged, this, &Backend::detectCollision);
connect(&m_rotation3Angle, &AnimatedParam::valueChanged, this, &Backend::detectCollision);
connect(&m_rotation4Angle, &AnimatedParam::valueChanged, this, &Backend::detectCollision);
}
int Backend::rotation1Angle() const
{
return m_rotation1Angle.value();
}
void Backend::setRot1Angle(const int angle)
{
m_rotation1Angle.setValue(angle);
}
int Backend::rotation2Angle() const
{
return m_rotation2Angle.value();
}
void Backend::setRot2Angle(const int angle)
{
m_rotation2Angle.setValue(angle);
}
int Backend::rotation3Angle() const
{
return m_rotation3Angle.value();
}
void Backend::setRot3Angle(const int angle)
{
m_rotation3Angle.setValue(angle);
}
int Backend::rotation4Angle() const
{
return m_rotation4Angle.value();
}
void Backend::setRot4Angle(const int angle)
{
m_rotation4Angle.setValue(angle);
}
int Backend::clawsAngle() const
{
return m_clawsAngle.value();
}
void Backend::setClawsAngle(const int angle)
{
m_clawsAngle.setValue(angle);
}
QString Backend::status() const
{
return m_status;
}
QBindable<QString> Backend::bindableStatus() const
{
return &m_status;
}
void Backend::detectCollision()
{
QPolygon pol1(QRect(-70, 0, 70, 300));
QTransform t;
t.rotate(8.7);
t.translate(0, 259);
t.rotate(-20.);
t.rotate(rotation3Angle());
QPolygon pol2 = t.mapToPolygon(QRect(-35, 0, 35, 233));
t.translate(0, 233);
t.rotate(15);
t.rotate(rotation2Angle());
QPolygon pol3 = t.mapToPolygon(QRect(-27, 0, 27, 212));
t.translate(0, 212);
t.rotate(rotation1Angle());
QPolygon pol4 = t.mapToPolygon(QRect(-42, 0, 42, 180));