feat: Add origin snap for sketch points and preview

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
2026-02-14 22:04:21 -07:00
parent 2d3df3097b
commit d3cb5e36f9
2 changed files with 52 additions and 2 deletions

View File

@@ -137,8 +137,39 @@ void ViewportWidget::paintGL()
}
}
if (m_isSnappingOrigin) {
const float rectSize = 0.2f;
glColor4f(1.0, 1.0, 0.0, 0.5f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBegin(GL_QUADS);
if (m_currentPlane == SketchPlane::XY) {
glVertex3f(-rectSize, -rectSize, 0);
glVertex3f( rectSize, -rectSize, 0);
glVertex3f( rectSize, rectSize, 0);
glVertex3f(-rectSize, rectSize, 0);
} else if (m_currentPlane == SketchPlane::XZ) {
glVertex3f(-rectSize, 0, -rectSize);
glVertex3f( rectSize, 0, -rectSize);
glVertex3f( rectSize, 0, rectSize);
glVertex3f(-rectSize, 0, rectSize);
} else if (m_currentPlane == SketchPlane::YZ) {
glVertex3f(0, -rectSize, -rectSize);
glVertex3f(0, rectSize, -rectSize);
glVertex3f(0, rectSize, rectSize);
glVertex3f(0, -rectSize, rectSize);
}
glEnd();
glDisable(GL_BLEND);
}
if (m_isDefiningLine && m_activeTool == static_cast<int>(ApplicationController::ToolType::Line)) {
QVector3D worldPos = unproject(m_currentMousePos);
if (m_isSnappingOrigin) {
worldPos.setX(0);
worldPos.setY(0);
worldPos.setZ(0);
}
glBegin(GL_LINES);
glColor3f(1.0, 1.0, 0.0);
glVertex3d(m_firstLinePoint.X(), m_firstLinePoint.Y(), m_firstLinePoint.Z());
@@ -175,8 +206,13 @@ void ViewportWidget::resizeGL(int w, int h)
void ViewportWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton && m_currentPlane != SketchPlane::NONE && m_activeTool == static_cast<int>(ApplicationController::ToolType::Line)) {
QVector3D worldPos = unproject(event->pos());
gp_Pnt p(worldPos.x(), worldPos.y(), worldPos.z());
gp_Pnt p;
if (m_isSnappingOrigin) {
p.SetCoord(0, 0, 0);
} else {
QVector3D worldPos = unproject(event->pos());
p.SetCoord(worldPos.x(), worldPos.y(), worldPos.z());
}
if (!m_isDefiningLine) {
m_firstLinePoint = p;
@@ -194,6 +230,19 @@ void ViewportWidget::mousePressEvent(QMouseEvent *event)
void ViewportWidget::mouseMoveEvent(QMouseEvent *event)
{
m_currentMousePos = event->pos();
bool shouldSnap = false;
if (m_currentPlane != SketchPlane::NONE) {
QVector3D worldPos = unproject(m_currentMousePos);
const float snapThreshold = 0.5f;
shouldSnap = worldPos.length() < snapThreshold;
}
if (shouldSnap != m_isSnappingOrigin) {
m_isSnappingOrigin = shouldSnap;
update();
}
int dx = event->pos().x() - lastPos.x();
int dy = event->pos().y() - lastPos.y();

View File

@@ -90,6 +90,7 @@ private:
bool m_isDefiningLine = false;
gp_Pnt m_firstLinePoint;
QPoint m_currentMousePos;
bool m_isSnappingOrigin = false;
QMap<int, QSvgRenderer*> m_toolIcons;
QSvgRenderer* m_cursorRenderer = nullptr;