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/Document.cpp
|
||||||
src/Feature.cpp
|
src/Feature.cpp
|
||||||
src/SketchFeature.cpp
|
src/SketchFeature.cpp
|
||||||
|
src/SketchLine.cpp
|
||||||
src/FeatureBrowser.cpp
|
src/FeatureBrowser.cpp
|
||||||
src/ApplicationController.cpp
|
src/ApplicationController.cpp
|
||||||
resources.qrc
|
resources.qrc
|
||||||
|
|||||||
@@ -1,10 +1,19 @@
|
|||||||
#include "SketchFeature.h"
|
#include "SketchFeature.h"
|
||||||
|
#include "SketchObject.h"
|
||||||
|
#include "SketchLine.h"
|
||||||
|
|
||||||
|
#include <QJsonArray>
|
||||||
|
|
||||||
SketchFeature::SketchFeature(const QString& name)
|
SketchFeature::SketchFeature(const QString& name)
|
||||||
: Feature(name)
|
: Feature(name)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SketchFeature::~SketchFeature()
|
||||||
|
{
|
||||||
|
qDeleteAll(m_objects);
|
||||||
|
}
|
||||||
|
|
||||||
QString SketchFeature::type() const
|
QString SketchFeature::type() const
|
||||||
{
|
{
|
||||||
return "Sketch";
|
return "Sketch";
|
||||||
@@ -25,6 +34,16 @@ const TopoDS_Shape& SketchFeature::shape() const
|
|||||||
return m_shape;
|
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)
|
void SketchFeature::read(const QJsonObject& json)
|
||||||
{
|
{
|
||||||
Feature::read(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 == "XZ") m_plane = SketchPlane::XZ;
|
||||||
else if (planeStr == "YZ") m_plane = SketchPlane::YZ;
|
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
|
void SketchFeature::write(QJsonObject& json) const
|
||||||
@@ -46,4 +82,12 @@ void SketchFeature::write(QJsonObject& json) const
|
|||||||
case SketchPlane::YZ: planeStr = "YZ"; break;
|
case SketchPlane::YZ: planeStr = "YZ"; break;
|
||||||
}
|
}
|
||||||
json["plane"] = planeStr;
|
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
|
#define SKETCHFEATURE_H
|
||||||
|
|
||||||
#include <TopoDS_Shape.hxx>
|
#include <TopoDS_Shape.hxx>
|
||||||
|
#include <QList>
|
||||||
#include "Feature.h"
|
#include "Feature.h"
|
||||||
|
|
||||||
|
class SketchObject;
|
||||||
|
|
||||||
class SketchFeature : public Feature
|
class SketchFeature : public Feature
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -14,6 +17,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
SketchFeature(const QString& name);
|
SketchFeature(const QString& name);
|
||||||
|
~SketchFeature();
|
||||||
|
|
||||||
QString type() const override;
|
QString type() const override;
|
||||||
|
|
||||||
@@ -22,12 +26,16 @@ public:
|
|||||||
|
|
||||||
const TopoDS_Shape& shape() const;
|
const TopoDS_Shape& shape() const;
|
||||||
|
|
||||||
|
void addObject(SketchObject* object);
|
||||||
|
const QList<SketchObject*>& objects() const;
|
||||||
|
|
||||||
void read(const QJsonObject &json) override;
|
void read(const QJsonObject &json) override;
|
||||||
void write(QJsonObject &json) const override;
|
void write(QJsonObject &json) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SketchPlane m_plane;
|
SketchPlane m_plane;
|
||||||
TopoDS_Shape m_shape;
|
TopoDS_Shape m_shape;
|
||||||
|
QList<SketchObject*> m_objects;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SKETCHFEATURE_H
|
#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