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

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