feat: Implement sketch object base class and line geometry

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
2026-02-14 19:12:59 -07:00
parent f46590219a
commit a1cfbc2e3f
6 changed files with 159 additions and 0 deletions

View File

@@ -37,6 +37,7 @@ add_executable(OpenCAD
src/Document.cpp
src/Feature.cpp
src/SketchFeature.cpp
src/SketchLine.cpp
src/FeatureBrowser.cpp
src/ApplicationController.cpp
resources.qrc

View File

@@ -1,10 +1,19 @@
#include "SketchFeature.h"
#include "SketchObject.h"
#include "SketchLine.h"
#include <QJsonArray>
SketchFeature::SketchFeature(const QString& name)
: Feature(name)
{
}
SketchFeature::~SketchFeature()
{
qDeleteAll(m_objects);
}
QString SketchFeature::type() const
{
return "Sketch";
@@ -25,6 +34,16 @@ const TopoDS_Shape& SketchFeature::shape() const
return m_shape;
}
void SketchFeature::addObject(SketchObject* object)
{
m_objects.append(object);
}
const QList<SketchObject*>& SketchFeature::objects() const
{
return m_objects;
}
void SketchFeature::read(const QJsonObject& json)
{
Feature::read(json);
@@ -34,6 +53,23 @@ void SketchFeature::read(const QJsonObject& json)
else if (planeStr == "XZ") m_plane = SketchPlane::XZ;
else if (planeStr == "YZ") m_plane = SketchPlane::YZ;
}
if (json.contains("objects") && json["objects"].isArray()) {
QJsonArray objectsArray = json["objects"].toArray();
qDeleteAll(m_objects);
m_objects.clear();
for (const QJsonValue& value : objectsArray) {
QJsonObject objectJson = value.toObject();
if (objectJson.contains("type") && objectJson["type"].isString()) {
QString type = objectJson["type"].toString();
if (type == "Line") {
auto line = new SketchLine();
line->read(objectJson);
m_objects.append(line);
}
}
}
}
}
void SketchFeature::write(QJsonObject& json) const
@@ -46,4 +82,12 @@ void SketchFeature::write(QJsonObject& json) const
case SketchPlane::YZ: planeStr = "YZ"; break;
}
json["plane"] = planeStr;
QJsonArray objectsArray;
for (const auto& object : m_objects) {
QJsonObject objectJson;
object->write(objectJson);
objectsArray.append(objectJson);
}
json["objects"] = objectsArray;
}

View File

@@ -2,8 +2,11 @@
#define SKETCHFEATURE_H
#include <TopoDS_Shape.hxx>
#include <QList>
#include "Feature.h"
class SketchObject;
class SketchFeature : public Feature
{
public:
@@ -14,6 +17,7 @@ public:
};
SketchFeature(const QString& name);
~SketchFeature();
QString type() const override;
@@ -22,12 +26,16 @@ public:
const TopoDS_Shape& shape() const;
void addObject(SketchObject* object);
const QList<SketchObject*>& objects() const;
void read(const QJsonObject &json) override;
void write(QJsonObject &json) const override;
private:
SketchPlane m_plane;
TopoDS_Shape m_shape;
QList<SketchObject*> m_objects;
};
#endif // SKETCHFEATURE_H

58
src/SketchLine.cpp Normal file
View File

@@ -0,0 +1,58 @@
#include "SketchLine.h"
#include <QJsonObject>
SketchLine::SketchLine()
{
}
SketchLine::SketchLine(const gp_Pnt& start, const gp_Pnt& end)
: m_start(start), m_end(end)
{
}
SketchObject::ObjectType SketchLine::type() const
{
return ObjectType::Line;
}
void SketchLine::read(const QJsonObject& json)
{
if (json.contains("start") && json["start"].isObject() &&
json.contains("end") && json["end"].isObject()) {
QJsonObject startObj = json["start"].toObject();
QJsonObject endObj = json["end"].toObject();
m_start.SetX(startObj["x"].toDouble());
m_start.SetY(startObj["y"].toDouble());
m_start.SetZ(startObj["z"].toDouble());
m_end.SetX(endObj["x"].toDouble());
m_end.SetY(endObj["y"].toDouble());
m_end.SetZ(endObj["z"].toDouble());
}
}
void SketchLine::write(QJsonObject& json) const
{
QJsonObject startObj;
startObj["x"] = m_start.X();
startObj["y"] = m_start.Y();
startObj["z"] = m_start.Z();
QJsonObject endObj;
endObj["x"] = m_end.X();
endObj["y"] = m_end.Y();
endObj["z"] = m_end.Z();
json["type"] = "Line";
json["start"] = startObj;
json["end"] = endObj;
}
const gp_Pnt& SketchLine::startPoint() const
{
return m_start;
}
const gp_Pnt& SketchLine::endPoint() const
{
return m_end;
}

26
src/SketchLine.h Normal file
View File

@@ -0,0 +1,26 @@
#ifndef SKETCHLINE_H
#define SKETCHLINE_H
#include "SketchObject.h"
#include <gp_Pnt.hxx>
class SketchLine : public SketchObject
{
public:
SketchLine();
SketchLine(const gp_Pnt& start, const gp_Pnt& end);
ObjectType type() const override;
void read(const QJsonObject& json) override;
void write(QJsonObject& json) const override;
const gp_Pnt& startPoint() const;
const gp_Pnt& endPoint() const;
private:
gp_Pnt m_start;
gp_Pnt m_end;
};
#endif // SKETCHLINE_H

22
src/SketchObject.h Normal file
View File

@@ -0,0 +1,22 @@
#ifndef SKETCHOBJECT_H
#define SKETCHOBJECT_H
#include <QJsonObject>
class SketchObject
{
public:
enum class ObjectType {
Line
};
SketchObject() = default;
virtual ~SketchObject() = default;
virtual ObjectType type() const = 0;
virtual void read(const QJsonObject& json) = 0;
virtual void write(QJsonObject& json) const = 0;
};
#endif // SKETCHOBJECT_H