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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
58
src/SketchLine.cpp
Normal 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
26
src/SketchLine.h
Normal 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
22
src/SketchObject.h
Normal 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
|
||||
Reference in New Issue
Block a user