feat: Implement feature graph and JSON document save/load

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
2026-02-09 17:16:32 -07:00
parent bc851585f7
commit d2d49726d6
9 changed files with 340 additions and 0 deletions

90
src/Document.cpp Normal file
View File

@@ -0,0 +1,90 @@
#include "Document.h"
#include "Feature.h"
#include "SketchFeature.h"
#include <QFile>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
Document::Document(QObject *parent) : QObject(parent)
{
}
Document::~Document()
{
clear();
}
void Document::addFeature(Feature* feature)
{
m_features.append(feature);
}
void Document::clear()
{
qDeleteAll(m_features);
m_features.clear();
}
bool Document::save(const QString& path) const
{
QJsonArray featuresArray;
for (const Feature* feature : m_features) {
QJsonObject featureObject;
feature->write(featureObject);
featuresArray.append(featureObject);
}
QJsonObject rootObject;
rootObject["features"] = featuresArray;
QJsonDocument doc(rootObject);
QFile file(path);
if (!file.open(QIODevice::WriteOnly)) {
return false;
}
file.write(doc.toJson());
return true;
}
bool Document::load(const QString& path)
{
QFile file(path);
if (!file.open(QIODevice::ReadOnly)) {
return false;
}
QByteArray data = file.readAll();
QJsonDocument doc = QJsonDocument::fromJson(data);
if (doc.isNull() || !doc.isObject()) {
return false;
}
clear();
QJsonObject rootObject = doc.object();
if (rootObject.contains("features") && rootObject["features"].isArray()) {
QJsonArray featuresArray = rootObject["features"].toArray();
for (const QJsonValue& value : featuresArray) {
QJsonObject obj = value.toObject();
if (obj.contains("type") && obj["type"].isString()) {
QString type = obj["type"].toString();
Feature* feature = nullptr;
if (type == "Sketch") {
feature = new SketchFeature("");
}
if (feature) {
feature->read(obj);
addFeature(feature);
}
}
}
}
return true;
}