refactor: Use gp_Ax2 for all sketch plane calculations in CircleTool
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
+47
-53
@@ -15,6 +15,10 @@
|
|||||||
#include <QOpenGLShaderProgram>
|
#include <QOpenGLShaderProgram>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <QtMath>
|
#include <QtMath>
|
||||||
|
#include <optional>
|
||||||
|
#include <gp_Ax2.hxx>
|
||||||
|
#include <gp_Pnt2d.hxx>
|
||||||
|
#include <ElCLib.hxx>
|
||||||
|
|
||||||
CircleTool::CircleTool(ViewportWidget* viewport)
|
CircleTool::CircleTool(ViewportWidget* viewport)
|
||||||
: SketchTool(viewport)
|
: SketchTool(viewport)
|
||||||
@@ -35,14 +39,18 @@ void CircleTool::activate()
|
|||||||
|
|
||||||
void CircleTool::mousePressEvent(QMouseEvent *event)
|
void CircleTool::mousePressEvent(QMouseEvent *event)
|
||||||
{
|
{
|
||||||
|
auto currentPlaneOpt = m_viewport->currentPlane();
|
||||||
|
if (!currentPlaneOpt) return;
|
||||||
|
const auto& plane = currentPlaneOpt.value();
|
||||||
|
|
||||||
gp_Pnt p;
|
gp_Pnt p;
|
||||||
if (!m_isDefining) {
|
if (!m_isDefining) {
|
||||||
if (m_viewport->isSnappingOrigin()) {
|
if (m_viewport->isSnappingOrigin()) {
|
||||||
p.SetCoord(0, 0, 0);
|
p = plane.Location();
|
||||||
} else if (m_viewport->isSnappingVertex()) {
|
} else if (m_viewport->isSnappingVertex()) {
|
||||||
p = m_viewport->snapVertex();
|
p = m_viewport->snapVertex();
|
||||||
} else {
|
} else {
|
||||||
QVector3D worldPos = m_viewport->unproject(event->pos(), m_viewport->currentPlane());
|
QVector3D worldPos = m_viewport->unproject(event->pos(), plane);
|
||||||
p.SetCoord(worldPos.x(), worldPos.y(), worldPos.z());
|
p.SetCoord(worldPos.x(), worldPos.y(), worldPos.z());
|
||||||
}
|
}
|
||||||
m_centerPoint = p;
|
m_centerPoint = p;
|
||||||
@@ -70,24 +78,22 @@ void CircleTool::mousePressEvent(QMouseEvent *event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (diameterFromInput) {
|
if (diameterFromInput) {
|
||||||
QVector3D mousePos = m_viewport->unproject(event->pos(), m_viewport->currentPlane());
|
QVector3D mousePos = m_viewport->unproject(event->pos(), plane);
|
||||||
QVector3D mouseDir = mousePos - centerPos;
|
QVector3D mouseDir = mousePos - centerPos;
|
||||||
if (mouseDir.lengthSquared() < 1e-9) {
|
if (mouseDir.lengthSquared() < 1e-9) {
|
||||||
if (m_viewport->currentPlane() == ViewportWidget::SketchPlane::XY || m_viewport->currentPlane() == ViewportWidget::SketchPlane::XZ) {
|
const auto& xDir = plane.XDirection();
|
||||||
mouseDir = QVector3D(1, 0, 0);
|
mouseDir = QVector3D(xDir.X(), xDir.Y(), xDir.Z());
|
||||||
} else { // YZ
|
|
||||||
mouseDir = QVector3D(0, 1, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
double radius = inputDiameter / 2.0;
|
double radius = inputDiameter / 2.0;
|
||||||
worldPos = centerPos + mouseDir.normalized() * radius;
|
worldPos = centerPos + mouseDir.normalized() * radius;
|
||||||
} else {
|
} else {
|
||||||
if (m_viewport->isSnappingOrigin()) {
|
if (m_viewport->isSnappingOrigin()) {
|
||||||
worldPos.setX(0); worldPos.setY(0); worldPos.setZ(0);
|
const auto& origin = plane.Location();
|
||||||
|
worldPos.setX(origin.X()); worldPos.setY(origin.Y()); worldPos.setZ(origin.Z());
|
||||||
} else if (m_viewport->isSnappingVertex()) {
|
} else if (m_viewport->isSnappingVertex()) {
|
||||||
worldPos = QVector3D(m_viewport->snapVertex().X(), m_viewport->snapVertex().Y(), m_viewport->snapVertex().Z());
|
worldPos = QVector3D(m_viewport->snapVertex().X(), m_viewport->snapVertex().Y(), m_viewport->snapVertex().Z());
|
||||||
} else {
|
} else {
|
||||||
worldPos = m_viewport->unproject(event->pos(), m_viewport->currentPlane());
|
worldPos = m_viewport->unproject(event->pos(), plane);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p.SetCoord(worldPos.x(), worldPos.y(), worldPos.z());
|
p.SetCoord(worldPos.x(), worldPos.y(), worldPos.z());
|
||||||
@@ -103,6 +109,10 @@ void CircleTool::mouseMoveEvent(QMouseEvent *event)
|
|||||||
|
|
||||||
void CircleTool::finalizeCreation()
|
void CircleTool::finalizeCreation()
|
||||||
{
|
{
|
||||||
|
auto currentPlaneOpt = m_viewport->currentPlane();
|
||||||
|
if (!currentPlaneOpt) return;
|
||||||
|
const auto& plane = currentPlaneOpt.value();
|
||||||
|
|
||||||
QVector3D worldPos;
|
QVector3D worldPos;
|
||||||
QVector3D centerPos(m_centerPoint.X(), m_centerPoint.Y(), m_centerPoint.Z());
|
QVector3D centerPos(m_centerPoint.X(), m_centerPoint.Y(), m_centerPoint.Z());
|
||||||
|
|
||||||
@@ -117,19 +127,16 @@ void CircleTool::finalizeCreation()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (diameterFromInput) {
|
if (diameterFromInput) {
|
||||||
QVector3D mousePos = m_viewport->unproject(m_viewport->currentMousePos(), m_viewport->currentPlane());
|
QVector3D mousePos = m_viewport->unproject(m_viewport->currentMousePos(), plane);
|
||||||
QVector3D mouseDir = mousePos - centerPos;
|
QVector3D mouseDir = mousePos - centerPos;
|
||||||
if (mouseDir.lengthSquared() < 1e-9) {
|
if (mouseDir.lengthSquared() < 1e-9) {
|
||||||
if (m_viewport->currentPlane() == ViewportWidget::SketchPlane::XY || m_viewport->currentPlane() == ViewportWidget::SketchPlane::XZ) {
|
const auto& xDir = plane.XDirection();
|
||||||
mouseDir = QVector3D(1, 0, 0);
|
mouseDir = QVector3D(xDir.X(), xDir.Y(), xDir.Z());
|
||||||
} else { // YZ
|
|
||||||
mouseDir = QVector3D(0, 1, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
double radius = inputDiameter / 2.0;
|
double radius = inputDiameter / 2.0;
|
||||||
worldPos = centerPos + mouseDir.normalized() * radius;
|
worldPos = centerPos + mouseDir.normalized() * radius;
|
||||||
} else {
|
} else {
|
||||||
worldPos = m_viewport->unproject(m_viewport->currentMousePos(), m_viewport->currentPlane());
|
worldPos = m_viewport->unproject(m_viewport->currentMousePos(), plane);
|
||||||
}
|
}
|
||||||
|
|
||||||
gp_Pnt p;
|
gp_Pnt p;
|
||||||
@@ -141,7 +148,10 @@ void CircleTool::finalizeCreation()
|
|||||||
|
|
||||||
void CircleTool::paintGL()
|
void CircleTool::paintGL()
|
||||||
{
|
{
|
||||||
if (m_isDefining) {
|
auto currentPlaneOpt = m_viewport->currentPlane();
|
||||||
|
if (!m_isDefining || !currentPlaneOpt) return;
|
||||||
|
const auto& plane = currentPlaneOpt.value();
|
||||||
|
|
||||||
QVector<GLfloat> vertices;
|
QVector<GLfloat> vertices;
|
||||||
QVector3D worldPos;
|
QVector3D worldPos;
|
||||||
QVector3D centerPos(m_centerPoint.X(), m_centerPoint.Y(), m_centerPoint.Z());
|
QVector3D centerPos(m_centerPoint.X(), m_centerPoint.Y(), m_centerPoint.Z());
|
||||||
@@ -156,7 +166,7 @@ void CircleTool::paintGL()
|
|||||||
if (ok) diameterFromInput = true;
|
if (ok) diameterFromInput = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector3D mousePos = m_viewport->unproject(m_viewport->currentMousePos(), m_viewport->currentPlane());
|
QVector3D mousePos = m_viewport->unproject(m_viewport->currentMousePos(), plane);
|
||||||
|
|
||||||
double radius;
|
double radius;
|
||||||
if (diameterFromInput) {
|
if (diameterFromInput) {
|
||||||
@@ -164,7 +174,8 @@ void CircleTool::paintGL()
|
|||||||
} else {
|
} else {
|
||||||
worldPos = mousePos;
|
worldPos = mousePos;
|
||||||
if (m_viewport->isSnappingOrigin()) {
|
if (m_viewport->isSnappingOrigin()) {
|
||||||
worldPos.setX(0); worldPos.setY(0); worldPos.setZ(0);
|
const auto& origin = plane.Location();
|
||||||
|
worldPos.setX(origin.X()); worldPos.setY(origin.Y()); worldPos.setZ(origin.Z());
|
||||||
} else if (m_viewport->isSnappingVertex()) {
|
} else if (m_viewport->isSnappingVertex()) {
|
||||||
worldPos.setX(m_viewport->snapVertex().X()); worldPos.setY(m_viewport->snapVertex().Y()); worldPos.setZ(m_viewport->snapVertex().Z());
|
worldPos.setX(m_viewport->snapVertex().X()); worldPos.setY(m_viewport->snapVertex().Y()); worldPos.setZ(m_viewport->snapVertex().Z());
|
||||||
}
|
}
|
||||||
@@ -172,34 +183,18 @@ void CircleTool::paintGL()
|
|||||||
}
|
}
|
||||||
|
|
||||||
const int segments = 64;
|
const int segments = 64;
|
||||||
|
const auto& xDir = plane.XDirection();
|
||||||
|
const auto& yDir = plane.YDirection();
|
||||||
|
QVector3D u_axis(xDir.X(), xDir.Y(), xDir.Z());
|
||||||
|
QVector3D v_axis(yDir.X(), yDir.Y(), yDir.Z());
|
||||||
|
|
||||||
for (int i = 0; i < segments; ++i) {
|
for (int i = 0; i < segments; ++i) {
|
||||||
double angle1 = i * 2.0 * M_PI / segments;
|
double angle1 = i * 2.0 * M_PI / segments;
|
||||||
double angle2 = (i + 1) * 2.0 * M_PI / segments;
|
double angle2 = (i + 1) * 2.0 * M_PI / segments;
|
||||||
|
|
||||||
QVector3D p1, p2;
|
QVector3D p1 = centerPos + radius * (qCos(angle1) * u_axis + qSin(angle1) * v_axis);
|
||||||
|
QVector3D p2 = centerPos + radius * (qCos(angle2) * u_axis + qSin(angle2) * v_axis);
|
||||||
|
|
||||||
if (m_viewport->currentPlane() == ViewportWidget::SketchPlane::XY) {
|
|
||||||
p1.setX(centerPos.x() + radius * qCos(angle1));
|
|
||||||
p1.setY(centerPos.y() + radius * qSin(angle1));
|
|
||||||
p1.setZ(centerPos.z());
|
|
||||||
p2.setX(centerPos.x() + radius * qCos(angle2));
|
|
||||||
p2.setY(centerPos.y() + radius * qSin(angle2));
|
|
||||||
p2.setZ(centerPos.z());
|
|
||||||
} else if (m_viewport->currentPlane() == ViewportWidget::SketchPlane::XZ) {
|
|
||||||
p1.setX(centerPos.x() + radius * qCos(angle1));
|
|
||||||
p1.setY(centerPos.y());
|
|
||||||
p1.setZ(centerPos.z() + radius * qSin(angle1));
|
|
||||||
p2.setX(centerPos.x() + radius * qCos(angle2));
|
|
||||||
p2.setY(centerPos.y());
|
|
||||||
p2.setZ(centerPos.z() + radius * qSin(angle2));
|
|
||||||
} else { // YZ
|
|
||||||
p1.setX(centerPos.x());
|
|
||||||
p1.setY(centerPos.y() + radius * qCos(angle1));
|
|
||||||
p1.setZ(centerPos.z() + radius * qSin(angle1));
|
|
||||||
p2.setX(centerPos.x());
|
|
||||||
p2.setY(centerPos.y() + radius * qCos(angle2));
|
|
||||||
p2.setZ(centerPos.z() + radius * qSin(angle2));
|
|
||||||
}
|
|
||||||
vertices << p1.x() << p1.y() << p1.z();
|
vertices << p1.x() << p1.y() << p1.z();
|
||||||
vertices << p2.x() << p2.y() << p2.z();
|
vertices << p2.x() << p2.y() << p2.z();
|
||||||
}
|
}
|
||||||
@@ -209,11 +204,13 @@ void CircleTool::paintGL()
|
|||||||
m_viewport->vbo().allocate(vertices.constData(), vertices.size() * sizeof(GLfloat));
|
m_viewport->vbo().allocate(vertices.constData(), vertices.size() * sizeof(GLfloat));
|
||||||
glDrawArrays(GL_LINES, 0, segments * 2);
|
glDrawArrays(GL_LINES, 0, segments * 2);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void CircleTool::paint2D(QPainter& painter, const QMatrix4x4& modelView, const QMatrix4x4& projection)
|
void CircleTool::paint2D(QPainter& painter, const QMatrix4x4& modelView, const QMatrix4x4& projection)
|
||||||
{
|
{
|
||||||
if (m_isDefining) {
|
auto currentPlaneOpt = m_viewport->currentPlane();
|
||||||
|
if (!m_isDefining || !currentPlaneOpt) return;
|
||||||
|
const auto& plane = currentPlaneOpt.value();
|
||||||
|
|
||||||
QVector3D worldPos;
|
QVector3D worldPos;
|
||||||
QVector3D centerPos(m_centerPoint.X(), m_centerPoint.Y(), m_centerPoint.Z());
|
QVector3D centerPos(m_centerPoint.X(), m_centerPoint.Y(), m_centerPoint.Z());
|
||||||
|
|
||||||
@@ -227,7 +224,7 @@ void CircleTool::paint2D(QPainter& painter, const QMatrix4x4& modelView, const Q
|
|||||||
if (ok) diameterFromInput = true;
|
if (ok) diameterFromInput = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector3D mousePos = m_viewport->unproject(m_viewport->currentMousePos(), m_viewport->currentPlane());
|
QVector3D mousePos = m_viewport->unproject(m_viewport->currentMousePos(), plane);
|
||||||
QVector3D edgePos;
|
QVector3D edgePos;
|
||||||
double diameter;
|
double diameter;
|
||||||
|
|
||||||
@@ -235,17 +232,15 @@ void CircleTool::paint2D(QPainter& painter, const QMatrix4x4& modelView, const Q
|
|||||||
diameter = inputDiameter;
|
diameter = inputDiameter;
|
||||||
QVector3D mouseDir = mousePos - centerPos;
|
QVector3D mouseDir = mousePos - centerPos;
|
||||||
if (mouseDir.lengthSquared() < 1e-9) {
|
if (mouseDir.lengthSquared() < 1e-9) {
|
||||||
if (m_viewport->currentPlane() == ViewportWidget::SketchPlane::XY || m_viewport->currentPlane() == ViewportWidget::SketchPlane::XZ) {
|
const auto& xDir = plane.XDirection();
|
||||||
mouseDir = QVector3D(1, 0, 0);
|
mouseDir = QVector3D(xDir.X(), xDir.Y(), xDir.Z());
|
||||||
} else { // YZ
|
|
||||||
mouseDir = QVector3D(0, 1, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
edgePos = centerPos + mouseDir.normalized() * (diameter / 2.0);
|
edgePos = centerPos + mouseDir.normalized() * (diameter / 2.0);
|
||||||
} else {
|
} else {
|
||||||
edgePos = mousePos;
|
edgePos = mousePos;
|
||||||
if (m_viewport->isSnappingOrigin()) {
|
if (m_viewport->isSnappingOrigin()) {
|
||||||
edgePos.setX(0); edgePos.setY(0); edgePos.setZ(0);
|
const auto& origin = plane.Location();
|
||||||
|
edgePos.setX(origin.X()); edgePos.setY(origin.Y()); edgePos.setZ(origin.Z());
|
||||||
} else if (m_viewport->isSnappingVertex()) {
|
} else if (m_viewport->isSnappingVertex()) {
|
||||||
edgePos.setX(m_viewport->snapVertex().X()); edgePos.setY(m_viewport->snapVertex().Y()); edgePos.setZ(m_viewport->snapVertex().Z());
|
edgePos.setX(m_viewport->snapVertex().X()); edgePos.setY(m_viewport->snapVertex().Y()); edgePos.setZ(m_viewport->snapVertex().Z());
|
||||||
}
|
}
|
||||||
@@ -271,4 +266,3 @@ void CircleTool::paint2D(QPainter& painter, const QMatrix4x4& modelView, const Q
|
|||||||
painter.drawText(textRect, Qt::AlignCenter, diameterText);
|
painter.drawText(textRect, Qt::AlignCenter, diameterText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user