feat: Reorient sketch planes to match Fusion 360 views

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
2026-02-15 10:08:56 -07:00
parent 7785f5be1a
commit 245d2bd0b3
2 changed files with 34 additions and 34 deletions

View File

@@ -43,11 +43,11 @@ void SketchGrid::drawGridLines(SketchPlane plane)
{ {
if (i == 0 || i % 5 == 0) continue; if (i == 0 || i % 5 == 0) continue;
if (plane == XY) { if (plane == XY) {
glVertex3f(i, -gridSize, 0); glVertex3f(i, gridSize, 0);
glVertex3f(-gridSize, i, 0); glVertex3f(gridSize, i, 0);
} else if (plane == XZ) {
glVertex3f(i, 0, -gridSize); glVertex3f(i, 0, gridSize); glVertex3f(i, 0, -gridSize); glVertex3f(i, 0, gridSize);
glVertex3f(-gridSize, 0, i); glVertex3f(gridSize, 0, i); glVertex3f(-gridSize, 0, i); glVertex3f(gridSize, 0, i);
} else if (plane == XZ) {
glVertex3f(i, -gridSize, 0); glVertex3f(i, gridSize, 0);
glVertex3f(-gridSize, i, 0); glVertex3f(gridSize, i, 0);
} else { // YZ } else { // YZ
glVertex3f(0, i, -gridSize); glVertex3f(0, i, gridSize); glVertex3f(0, i, -gridSize); glVertex3f(0, i, gridSize);
glVertex3f(0, -gridSize, i); glVertex3f(0, gridSize, i); glVertex3f(0, -gridSize, i); glVertex3f(0, gridSize, i);
@@ -63,11 +63,11 @@ void SketchGrid::drawGridLines(SketchPlane plane)
{ {
if (i == 0) continue; if (i == 0) continue;
if (plane == XY) { if (plane == XY) {
glVertex3f(i, -gridSize, 0); glVertex3f(i, gridSize, 0);
glVertex3f(-gridSize, i, 0); glVertex3f(gridSize, i, 0);
} else if (plane == XZ) {
glVertex3f(i, 0, -gridSize); glVertex3f(i, 0, gridSize); glVertex3f(i, 0, -gridSize); glVertex3f(i, 0, gridSize);
glVertex3f(-gridSize, 0, i); glVertex3f(gridSize, 0, i); glVertex3f(-gridSize, 0, i); glVertex3f(gridSize, 0, i);
} else if (plane == XZ) {
glVertex3f(i, -gridSize, 0); glVertex3f(i, gridSize, 0);
glVertex3f(-gridSize, i, 0); glVertex3f(gridSize, i, 0);
} else { // YZ } else { // YZ
glVertex3f(0, i, -gridSize); glVertex3f(0, i, gridSize); glVertex3f(0, i, -gridSize); glVertex3f(0, i, gridSize);
glVertex3f(0, -gridSize, i); glVertex3f(0, gridSize, i); glVertex3f(0, -gridSize, i); glVertex3f(0, gridSize, i);
@@ -92,14 +92,14 @@ void SketchGrid::drawAxes(SketchPlane plane)
// Y Axis (Green) // Y Axis (Green)
if (plane == XY || plane == YZ) { if (plane == XY || plane == YZ) {
glColor3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0, -axisLength, 0); glVertex3f(0, 0, -axisLength);
glVertex3f(0, axisLength, 0); glVertex3f(0, 0, axisLength);
} }
// Z Axis (Blue) // Z Axis (Blue)
if (plane == XZ || plane == YZ) { if (plane == XZ || plane == YZ) {
glColor3f(0.0f, 0.0f, 1.0f); glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0, 0, -axisLength); glVertex3f(0, -axisLength, 0);
glVertex3f(0, 0, axisLength); glVertex3f(0, axisLength, 0);
} }
glEnd(); glEnd();

View File

@@ -200,8 +200,8 @@ void ViewportWidget::paintGL()
worldPos.setY(m_snapVertex.Y()); worldPos.setY(m_snapVertex.Y());
worldPos.setZ(m_snapVertex.Z()); worldPos.setZ(m_snapVertex.Z());
} else if (m_isSnappingHorizontal) { } else if (m_isSnappingHorizontal) {
if (m_currentPlane == SketchPlane::XY) worldPos.setY(m_firstLinePoint.Y()); if (m_currentPlane == SketchPlane::XY) worldPos.setZ(m_firstLinePoint.Z());
else if (m_currentPlane == SketchPlane::XZ) worldPos.setZ(m_firstLinePoint.Z()); else if (m_currentPlane == SketchPlane::XZ) worldPos.setY(m_firstLinePoint.Y());
else if (m_currentPlane == SketchPlane::YZ) worldPos.setZ(m_firstLinePoint.Z()); else if (m_currentPlane == SketchPlane::YZ) worldPos.setZ(m_firstLinePoint.Z());
} else if (m_isSnappingVertical) { } else if (m_isSnappingVertical) {
if (m_currentPlane == SketchPlane::XY) worldPos.setX(m_firstLinePoint.X()); if (m_currentPlane == SketchPlane::XY) worldPos.setX(m_firstLinePoint.X());
@@ -225,22 +225,22 @@ void ViewportWidget::paintGL()
if (m_isSnappingHorizontal) { if (m_isSnappingHorizontal) {
if (m_currentPlane == SketchPlane::XY) { if (m_currentPlane == SketchPlane::XY) {
glVertex3f(midPoint.x() - indicatorSize, midPoint.y() + indicatorOffset, midPoint.z());
glVertex3f(midPoint.x() + indicatorSize, midPoint.y() + indicatorOffset, midPoint.z());
} else if (m_currentPlane == SketchPlane::XZ) {
glVertex3f(midPoint.x() - indicatorSize, midPoint.y(), midPoint.z() + indicatorOffset); glVertex3f(midPoint.x() - indicatorSize, midPoint.y(), midPoint.z() + indicatorOffset);
glVertex3f(midPoint.x() + indicatorSize, midPoint.y(), midPoint.z() + indicatorOffset); glVertex3f(midPoint.x() + indicatorSize, midPoint.y(), midPoint.z() + indicatorOffset);
} else if (m_currentPlane == SketchPlane::XZ) {
glVertex3f(midPoint.x() - indicatorSize, midPoint.y() + indicatorOffset, midPoint.z());
glVertex3f(midPoint.x() + indicatorSize, midPoint.y() + indicatorOffset, midPoint.z());
} else if (m_currentPlane == SketchPlane::YZ) { } else if (m_currentPlane == SketchPlane::YZ) {
glVertex3f(midPoint.x(), midPoint.y() - indicatorSize, midPoint.z() + indicatorOffset); glVertex3f(midPoint.x(), midPoint.y() - indicatorSize, midPoint.z() + indicatorOffset);
glVertex3f(midPoint.x(), midPoint.y() + indicatorSize, midPoint.z() + indicatorOffset); glVertex3f(midPoint.x(), midPoint.y() + indicatorSize, midPoint.z() + indicatorOffset);
} }
} else { // m_isSnappingVertical } else { // m_isSnappingVertical
if (m_currentPlane == SketchPlane::XY) { if (m_currentPlane == SketchPlane::XY) {
glVertex3f(midPoint.x() + indicatorOffset, midPoint.y() - indicatorSize, midPoint.z());
glVertex3f(midPoint.x() + indicatorOffset, midPoint.y() + indicatorSize, midPoint.z());
} else if (m_currentPlane == SketchPlane::XZ) {
glVertex3f(midPoint.x() + indicatorOffset, midPoint.y(), midPoint.z() - indicatorSize); glVertex3f(midPoint.x() + indicatorOffset, midPoint.y(), midPoint.z() - indicatorSize);
glVertex3f(midPoint.x() + indicatorOffset, midPoint.y(), midPoint.z() + indicatorSize); glVertex3f(midPoint.x() + indicatorOffset, midPoint.y(), midPoint.z() + indicatorSize);
} else if (m_currentPlane == SketchPlane::XZ) {
glVertex3f(midPoint.x() + indicatorOffset, midPoint.y() - indicatorSize, midPoint.z());
glVertex3f(midPoint.x() + indicatorOffset, midPoint.y() + indicatorSize, midPoint.z());
} else if (m_currentPlane == SketchPlane::YZ) { } else if (m_currentPlane == SketchPlane::YZ) {
glVertex3f(midPoint.x(), midPoint.y() + indicatorOffset, midPoint.z() - indicatorSize); glVertex3f(midPoint.x(), midPoint.y() + indicatorOffset, midPoint.z() - indicatorSize);
glVertex3f(midPoint.x(), midPoint.y() + indicatorOffset, midPoint.z() + indicatorSize); glVertex3f(midPoint.x(), midPoint.y() + indicatorOffset, midPoint.z() + indicatorSize);
@@ -287,8 +287,8 @@ void ViewportWidget::mousePressEvent(QMouseEvent *event)
} else { } else {
QVector3D worldPos = unproject(event->pos()); QVector3D worldPos = unproject(event->pos());
if (m_isSnappingHorizontal) { if (m_isSnappingHorizontal) {
if (m_currentPlane == SketchPlane::XY) worldPos.setY(m_firstLinePoint.Y()); if (m_currentPlane == SketchPlane::XY) worldPos.setZ(m_firstLinePoint.Z());
else if (m_currentPlane == SketchPlane::XZ) worldPos.setZ(m_firstLinePoint.Z()); else if (m_currentPlane == SketchPlane::XZ) worldPos.setY(m_firstLinePoint.Y());
else if (m_currentPlane == SketchPlane::YZ) worldPos.setZ(m_firstLinePoint.Z()); else if (m_currentPlane == SketchPlane::YZ) worldPos.setZ(m_firstLinePoint.Z());
} else if (m_isSnappingVertical) { } else if (m_isSnappingVertical) {
if (m_currentPlane == SketchPlane::XY) worldPos.setX(m_firstLinePoint.X()); if (m_currentPlane == SketchPlane::XY) worldPos.setX(m_firstLinePoint.X());
@@ -322,10 +322,10 @@ void ViewportWidget::mouseMoveEvent(QMouseEvent *event)
switch (m_currentPlane) { switch (m_currentPlane) {
case SketchPlane::XY: case SketchPlane::XY:
shouldSnap = qAbs(worldPos.x()) < snapRectHalfSize && qAbs(worldPos.y()) < snapRectHalfSize; shouldSnap = qAbs(worldPos.x()) < snapRectHalfSize && qAbs(worldPos.z()) < snapRectHalfSize;
break; break;
case SketchPlane::XZ: case SketchPlane::XZ:
shouldSnap = qAbs(worldPos.x()) < snapRectHalfSize && qAbs(worldPos.z()) < snapRectHalfSize; shouldSnap = qAbs(worldPos.x()) < snapRectHalfSize && qAbs(worldPos.y()) < snapRectHalfSize;
break; break;
case SketchPlane::YZ: case SketchPlane::YZ:
shouldSnap = qAbs(worldPos.y()) < snapRectHalfSize && qAbs(worldPos.z()) < snapRectHalfSize; shouldSnap = qAbs(worldPos.y()) < snapRectHalfSize && qAbs(worldPos.z()) < snapRectHalfSize;
@@ -359,10 +359,10 @@ void ViewportWidget::mouseMoveEvent(QMouseEvent *event)
bool isClose = false; bool isClose = false;
switch (m_currentPlane) { switch (m_currentPlane) {
case SketchPlane::XY: case SketchPlane::XY:
isClose = qAbs(worldPos.x() - vertex.X()) < snapRectHalfSize && qAbs(worldPos.y() - vertex.Y()) < snapRectHalfSize; isClose = qAbs(worldPos.x() - vertex.X()) < snapRectHalfSize && qAbs(worldPos.z() - vertex.Z()) < snapRectHalfSize;
break; break;
case SketchPlane::XZ: case SketchPlane::XZ:
isClose = qAbs(worldPos.x() - vertex.X()) < snapRectHalfSize && qAbs(worldPos.z() - vertex.Z()) < snapRectHalfSize; isClose = qAbs(worldPos.x() - vertex.X()) < snapRectHalfSize && qAbs(worldPos.y() - vertex.Y()) < snapRectHalfSize;
break; break;
case SketchPlane::YZ: case SketchPlane::YZ:
isClose = qAbs(worldPos.y() - vertex.Y()) < snapRectHalfSize && qAbs(worldPos.z() - vertex.Z()) < snapRectHalfSize; isClose = qAbs(worldPos.y() - vertex.Y()) < snapRectHalfSize && qAbs(worldPos.z() - vertex.Z()) < snapRectHalfSize;
@@ -403,9 +403,9 @@ void ViewportWidget::mouseMoveEvent(QMouseEvent *event)
double angle = 0; double angle = 0;
if (m_currentPlane == SketchPlane::XY) { if (m_currentPlane == SketchPlane::XY) {
angle = atan2(delta.y(), delta.x());
} else if (m_currentPlane == SketchPlane::XZ) {
angle = atan2(delta.z(), delta.x()); angle = atan2(delta.z(), delta.x());
} else if (m_currentPlane == SketchPlane::XZ) {
angle = atan2(delta.y(), delta.x());
} else if (m_currentPlane == SketchPlane::YZ) { } else if (m_currentPlane == SketchPlane::YZ) {
angle = atan2(delta.z(), delta.y()); angle = atan2(delta.z(), delta.y());
} }
@@ -476,12 +476,12 @@ void ViewportWidget::onSketchModeStarted(SketchPlane plane)
float targetXRot = m_xRot; float targetXRot = m_xRot;
float targetYRot = m_yRot; float targetYRot = m_yRot;
switch (plane) { switch (plane) {
case SketchPlane::XY: // Front view case SketchPlane::XY: // Top view
targetXRot = 0; targetXRot = -90 * 16;
targetYRot = 0; targetYRot = 0;
break; break;
case SketchPlane::XZ: // Top view case SketchPlane::XZ: // Front view
targetXRot = -90 * 16; targetXRot = 0;
targetYRot = 0; targetYRot = 0;
break; break;
case SketchPlane::YZ: // Right view case SketchPlane::YZ: // Right view
@@ -617,10 +617,10 @@ void ViewportWidget::drawAxisLabels(QPainter& painter, const QMatrix4x4& modelVi
if (m_currentPlane == SketchPlane::XY) { if (m_currentPlane == SketchPlane::XY) {
drawLabelsForAxis(0); // X drawLabelsForAxis(0); // X
drawLabelsForAxis(1); // Y drawLabelsForAxis(2); // Y
} else if (m_currentPlane == SketchPlane::XZ) { } else if (m_currentPlane == SketchPlane::XZ) {
drawLabelsForAxis(0); // X drawLabelsForAxis(0); // X
drawLabelsForAxis(2); // Z drawLabelsForAxis(1); // Z
} else if (m_currentPlane == SketchPlane::YZ) { } else if (m_currentPlane == SketchPlane::YZ) {
drawLabelsForAxis(1); // Y drawLabelsForAxis(1); // Y
drawLabelsForAxis(2); // Z drawLabelsForAxis(2); // Z
@@ -705,8 +705,8 @@ QVector3D ViewportWidget::unproject(const QPoint& screenPos)
QVector3D planeNormal; QVector3D planeNormal;
switch (m_currentPlane) { switch (m_currentPlane) {
case SketchPlane::XY: planeNormal = QVector3D(0, 0, 1); break; case SketchPlane::XY: planeNormal = QVector3D(0, 1, 0); break;
case SketchPlane::XZ: planeNormal = QVector3D(0, 1, 0); break; case SketchPlane::XZ: planeNormal = QVector3D(0, 0, 1); break;
case SketchPlane::YZ: planeNormal = QVector3D(1, 0, 0); break; case SketchPlane::YZ: planeNormal = QVector3D(1, 0, 0); break;
case SketchPlane::NONE: return QVector3D(); case SketchPlane::NONE: return QVector3D();
} }