feat: Implement circle drawing tool

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
2026-02-17 15:15:24 -07:00
parent 4b0a903052
commit 7f6c01c8a0
8 changed files with 131 additions and 1 deletions

View File

@@ -8,10 +8,12 @@
#include "SketchFeature.h"
#include "SketchLine.h"
#include "SketchRectangle.h"
#include "SketchCircle.h"
#include "SketchObject.h"
#include "ApplicationController.h"
#include "RectangleTool.h"
#include "LineTool.h"
#include "CircleTool.h"
#include <QMouseEvent>
#include <QKeyEvent>
#include <QWheelEvent>
@@ -61,6 +63,7 @@ ViewportWidget::ViewportWidget(QWidget *parent)
m_sketchTools.insert(static_cast<int>(ApplicationController::ToolType::Line), new LineTool(this));
m_sketchTools.insert(static_cast<int>(ApplicationController::ToolType::Rectangle), new RectangleTool(this));
m_sketchTools.insert(static_cast<int>(ApplicationController::ToolType::Circle), new CircleTool(this));
m_snapping = new Snapping(this);
}
@@ -511,6 +514,39 @@ void ViewportWidget::drawSketch(const SketchFeature* sketch)
vertexCounts[start]++;
vertexCounts[end]++;
} else if (obj->type() == SketchObject::ObjectType::Circle) {
auto circle = static_cast<const SketchCircle*>(obj);
const auto& center = circle->center();
double radius = circle->radius();
QVector3D centerPos(center.X(), center.Y(), center.Z());
const int numSegments = 64;
QVector3D u_axis, v_axis;
switch (sketch->plane()) {
case SketchFeature::SketchPlane::XY:
u_axis = QVector3D(1, 0, 0);
v_axis = QVector3D(0, 1, 0);
break;
case SketchFeature::SketchPlane::XZ:
u_axis = QVector3D(1, 0, 0);
v_axis = QVector3D(0, 0, 1);
break;
case SketchFeature::SketchPlane::YZ:
u_axis = QVector3D(0, 1, 0);
v_axis = QVector3D(0, 0, 1);
break;
}
for (int i = 0; i < numSegments; ++i) {
double angle1 = 2.0 * M_PI * double(i) / double(numSegments);
QVector3D p1 = centerPos + radius * (cos(angle1) * u_axis + sin(angle1) * v_axis);
double angle2 = 2.0 * M_PI * double(i + 1) / double(numSegments);
QVector3D p2 = centerPos + radius * (cos(angle2) * u_axis + sin(angle2) * v_axis);
lineVertices << p1.x() << p1.y() << p1.z();
lineVertices << p2.x() << p2.y() << p2.z();
}
} else if (obj->type() == SketchObject::ObjectType::Rectangle) {
auto rect = static_cast<const SketchRectangle*>(obj);
const auto& p1 = rect->corner1();