From 40f179f51e19495f531862ae73519f9a7b289036 Mon Sep 17 00:00:00 2001 From: godardma Date: Tue, 1 Jul 2025 00:30:43 +0200 Subject: [PATCH 1/4] happy birthday VIBes --- client-api/C++/examples/all_commands.cpp | 7 + client-api/C++/src/vibes.cpp | 16 ++ client-api/C++/src/vibes.h | 3 + client-api/python/vibes/vibes.py | 20 +++ viewer/vibesgraphicsitem.cpp | 200 +++++++++++++++++++++++ viewer/vibesgraphicsitem.h | 13 +- 6 files changed, 258 insertions(+), 1 deletion(-) diff --git a/client-api/C++/examples/all_commands.cpp b/client-api/C++/examples/all_commands.cpp index e0a7254..bc9ee92 100644 --- a/client-api/C++/examples/all_commands.cpp +++ b/client-api/C++/examples/all_commands.cpp @@ -330,6 +330,13 @@ int main() cout << "3." << endl; + VIBES_TEST( vibes::newFigure("Happy birthday") ); + VIBES_TEST( vibes::drawCake(1, -1, 0, 3, "black[red]") ); + VIBES_TEST( vibes::drawCake(3, 1, 45., 1, "black[blue]") ); + VIBES_TEST( vibes::drawCake(-1, -3, -20., 2, "black[green]") ); + VIBES_TEST( vibes::drawCake(3, -2, -180., 2.5, "black[yellow]") ); + VIBES_TEST( vibes::axisAuto() ); + /* vibes::Params p2 = vibesParams("action", "draw", "figure", "fig_name", diff --git a/client-api/C++/src/vibes.cpp b/client-api/C++/src/vibes.cpp index 968d686..dae2963 100644 --- a/client-api/C++/src/vibes.cpp +++ b/client-api/C++/src/vibes.cpp @@ -763,6 +763,22 @@ namespace vibes fflush(channel.get()); } + void drawCake(const double &cx, const double &cy, const double &rot, const double &length, Params params) + { + beginDrawingIfNeeded(); + Vec2d vc = { cx, cy }; + Params msg; + msg["action"] = "draw"; + msg["figure"] = params.pop("figure",current_fig); + msg["shape"] = (params, "type", "cake", + "center", vc, + "length", length, + "orientation", rot); + + fputs(Value(msg).toJSONString().append("\n\n").c_str(), channel.get()); + fflush(channel.get()); + } + void newGroup(const std::string &name, Params params) { diff --git a/client-api/C++/src/vibes.h b/client-api/C++/src/vibes.h index bcc782f..4f6c705 100644 --- a/client-api/C++/src/vibes.h +++ b/client-api/C++/src/vibes.h @@ -393,6 +393,9 @@ namespace vibes { const double &,ulb, const double &, yub, const double &,width, const double &, height, const double &, rot); + /// Draw a Cake at position (cx,cy) + VIBES_FUNC_COLOR_PARAM_4(drawCake,const double &,cx, const double &,cy, const double &,rot, const double &,length) + /// @} /// @name Objects grouping and deletion /// @{ diff --git a/client-api/python/vibes/vibes.py b/client-api/python/vibes/vibes.py index da6fa52..e307be8 100644 --- a/client-api/python/vibes/vibes.py +++ b/client-api/python/vibes/vibes.py @@ -581,3 +581,23 @@ def drawRaster(cls, filename, xlb, yub, width, height, rot=0, **kwargs): if "color" in kwargs: msg["shape"]["format"] = kwargs['color'] cls._write(msg, **kwargs) + + @classmethod + def drawCake(cls, cx, cy, length, color='r', **kwargs): + """Draw a cake centered at (cx, cy) with heading and size length + + Args: + cx,cy (double): position of the Cake + heading (double): heading of the vehicle in degree + lenght (double): length of the vehicle + + """ + msg = {'action': 'draw', + 'shape': {'type': 'cake', + 'center': [cx, cy], + 'length': length, + 'orientation': oritentation, + 'format': color + } + } + cls._write(msg, **kwargs) diff --git a/viewer/vibesgraphicsitem.cpp b/viewer/vibesgraphicsitem.cpp index cc1126b..d2bfe8c 100644 --- a/viewer/vibesgraphicsitem.cpp +++ b/viewer/vibesgraphicsitem.cpp @@ -247,6 +247,10 @@ VibesGraphicsItem * VibesGraphicsItem::newWithType(const QString type) { return new VibesGraphicsRaster(); } + else if (type == "cake") + { + return new VibesGraphicsCake(); + } return 0; } @@ -2268,3 +2272,199 @@ bool VibesGraphicsRaster::computeProjection(int dimX, int dimY) // Update successful return true; } + +// +// VibesGraphicsCake +// + +bool VibesGraphicsCake::parseJsonGraphics(const QJsonObject &json) +{ + // Now process shape-specific properties + // (we can only update properties of a shape, but mutation into another type is not supported) + if (json.contains("type")) + { + // Retrieve type + QString type = json["type"].toString(); + + // JSON type for VibesGraphicsCake is "cake" + if (type == "cake") + { + if (json.contains("center") && json.contains("length") && json.contains("orientation")) + { + int center_size = json["center"].toArray().size(); + if (center_size == 2 && json["length"].toDouble() > 0.) + { + // Set dimension + this->_nbDim = center_size; + + // Update successful + return true; + } + } + } + } + + // Unknown or empty JSON, update failed + return false; +} + +bool VibesGraphicsCake::computeProjection(int dimX, int dimY) +{ + const QJsonObject & json = this->_json; + + QJsonArray center = json["center"].toArray(); + double length = json["length"].toDouble(); + double orientation = json["orientation"].toDouble(); + + // Get shape color (or default if not specified) + const QBrush & brush = vibesDefaults.brush(jsonValue("FaceColor").toString()); + const QPen & pen = vibesDefaults.pen(jsonValue("EdgeColor").toString(),jsonValue("LineStyle").toString(), QString::number(7.0*jsonValue("LineWidth").toString().toDouble()/length)); + + const QBrush & cake_brush = vibesDefaults.brush("#ffde85"); + const QPen & cake_pen = vibesDefaults.pen("black","-", "0.1"); + + const QBrush & cream_brush = vibesDefaults.brush("#fcf7e8"); + + const QPen & empty_pen = vibesDefaults.pen("transparent","-", jsonValue("LineWidth").toString()); + + + Q_ASSERT(json.contains("type")); + Q_ASSERT(json["type"].toString() == "cake"); + + Q_ASSERT(center.size() == 2); + Q_ASSERT(this->_nbDim == center.size()); + Q_ASSERT(length > 0.); + + // Get center + const QPointF & centerPoint = QPointF(center[dimX].toDouble(), center[dimY].toDouble()); + + /* This shape is inspired by the MOOS middleware GUI (see pMarineViewer) */ + + // If the shape has already been drawn, it has at least one child + // Update child items if they exist + if (this->childItems().size() > 0) + { + // This cake is already perfect, please don't change it + } + // Else draw the shape for the first time + else{ + // Set body shape + { + QGraphicsEllipseItem * disk = new QGraphicsEllipseItem(center[dimX].toDouble()-length/2.0, center[dimY].toDouble()-length/8.0, length, length/4.); + + disk->setPen(cake_pen); + disk->setBrush(cake_brush); + disk->setTransformOriginPoint(centerPoint); + disk->setRotation(orientation); + this->addToGroup(disk); + } + + { + QGraphicsRectItem * rect = new QGraphicsRectItem(center[dimX].toDouble()-length/2.0, center[dimY].toDouble(), length, length/2.); + rect->setPen(empty_pen); + rect->setBrush(cake_brush); + rect->setTransformOriginPoint(centerPoint); + rect->setRotation(orientation); + this->addToGroup(rect); + + } + + { + QPainterPath lef_line_details; + lef_line_details.moveTo(center[dimX].toDouble()-length/2.0, center[dimY].toDouble()); + lef_line_details.lineTo(center[dimX].toDouble()-length/2.0, center[dimY].toDouble()+length/2.); + + QGraphicsPathItem * left_line = new QGraphicsPathItem(lef_line_details); + + QPainterPath right_line_details; + right_line_details.moveTo(center[dimX].toDouble()+length/2.0, center[dimY].toDouble()); + right_line_details.lineTo(center[dimX].toDouble()+length/2.0, center[dimY].toDouble()+length/2.); + + QGraphicsPathItem * right_line = new QGraphicsPathItem(right_line_details); + + left_line->setPen(cake_pen); + right_line->setPen(cake_pen); + + left_line->setTransformOriginPoint(centerPoint); + right_line->setTransformOriginPoint(centerPoint); + + left_line->setRotation(orientation); + right_line->setRotation(orientation); + + this->addToGroup(left_line); + this->addToGroup(right_line); + } + + { + QGraphicsEllipseItem * disk = new QGraphicsEllipseItem(center[dimX].toDouble()-length/2.0, center[dimY].toDouble()+length/2.-length/8.0, length, length/4.); + + disk->setPen(cake_pen); + disk->setBrush(cream_brush); + disk->setTransformOriginPoint(centerPoint); + disk->setRotation(orientation); + this->addToGroup(disk); + } + + { + QGraphicsEllipseItem * disk_1 = new QGraphicsEllipseItem(center[dimX].toDouble()-length/2.0, center[dimY].toDouble()+length/2.-length/16., length/8., length/8.); + QGraphicsEllipseItem * disk_2 = new QGraphicsEllipseItem(center[dimX].toDouble()+length/2.0-length/8., center[dimY].toDouble()+length/2.-length/16., length/8., length/8.); + QGraphicsEllipseItem * disk_3 = new QGraphicsEllipseItem(center[dimX].toDouble()-length/2.0+length/4., center[dimY].toDouble()+length/2.+length/16., length/8., length/8.); + QGraphicsEllipseItem * disk_4 = new QGraphicsEllipseItem(center[dimX].toDouble()+length/8., center[dimY].toDouble()+length/2.+length/16., length/8., length/8.); + QGraphicsEllipseItem * disk_5 = new QGraphicsEllipseItem(center[dimX].toDouble()-length/2.0+length/4., center[dimY].toDouble()+length/2.-length/8., length/8., length/8.); + QGraphicsEllipseItem * disk_6 = new QGraphicsEllipseItem(center[dimX].toDouble()+length/8., center[dimY].toDouble()+length/2.-length/8., length/8., length/8.); + + QGraphicsSimpleTextItem * text = new QGraphicsSimpleTextItem("10"); + text->setTransform(QTransform(1, 0, 0, -1, center[dimX].toDouble()-length/4.0-length/8.0,center[dimY].toDouble()+length)); + text->setScale(0.04*length); + text->setPen(cake_pen); + text->setBrush(brush); + + disk_1->setPen(pen); + disk_2->setPen(pen); + disk_3->setPen(pen); + disk_4->setPen(pen); + disk_5->setPen(pen); + disk_6->setPen(pen); + + disk_1->setBrush(brush); + disk_2->setBrush(brush); + disk_3->setBrush(brush); + disk_4->setBrush(brush); + disk_5->setBrush(brush); + disk_6->setBrush(brush); + + disk_1->setTransformOriginPoint(centerPoint); + disk_2->setTransformOriginPoint(centerPoint); + disk_3->setTransformOriginPoint(centerPoint); + disk_4->setTransformOriginPoint(centerPoint); + disk_5->setTransformOriginPoint(centerPoint); + disk_6->setTransformOriginPoint(centerPoint); + + disk_1->setRotation(orientation); + disk_2->setRotation(orientation); + disk_3->setRotation(orientation); + disk_4->setRotation(orientation); + disk_5->setRotation(orientation); + disk_6->setRotation(orientation); + + this->addToGroup(disk_1); + this->addToGroup(disk_2); + this->addToGroup(disk_3); + this->addToGroup(disk_4); + + if (orientation == 0) + this->addToGroup(text); + + this->addToGroup(disk_5); + this->addToGroup(disk_6); + + } + + + } + + + + // Update successful + return true; +} \ No newline at end of file diff --git a/viewer/vibesgraphicsitem.h b/viewer/vibesgraphicsitem.h index 72f0708..8aec42c 100644 --- a/viewer/vibesgraphicsitem.h +++ b/viewer/vibesgraphicsitem.h @@ -140,7 +140,9 @@ class VibesGraphicsItem VibesGraphicsTextType, // Do not remove the following value! It signals the end of VibesGraphicsItem types VibesGraphicsLastType, - VibesGraphicsRasterType + VibesGraphicsRasterType, + // Happy birthday + VibesGraphicsCakeType }; // Constructor VibesGraphicsItem(QGraphicsItem * qGraphicsItem); @@ -436,4 +438,13 @@ class VibesGraphicsRaster : public QGraphicsItemGroup, public VibesGraphicsItem bool computeProjection(int dimX, int dimY); }; +class VibesGraphicsCake : public QGraphicsItemGroup, public VibesGraphicsItem +{ + VIBES_GRAPHICS_ITEM(VibesGraphicsCake, QGraphicsItemGroup) + VIBES_GEOMETRY_CHANGING_PROPERTIES("center","length","orientation") +protected: + bool parseJsonGraphics(const QJsonObject &json); + bool computeProjection(int dimX, int dimY); +}; + #endif // VIBESGRAPHICSITEM_H From 62d26a72a8ab4a3639de8c73d922459514a30feb Mon Sep 17 00:00:00 2001 From: godardma Date: Tue, 1 Jul 2025 01:36:19 +0200 Subject: [PATCH 2/4] improved cake --- viewer/vibesgraphicsitem.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/viewer/vibesgraphicsitem.cpp b/viewer/vibesgraphicsitem.cpp index d2bfe8c..cc460ea 100644 --- a/viewer/vibesgraphicsitem.cpp +++ b/viewer/vibesgraphicsitem.cpp @@ -2369,6 +2369,25 @@ bool VibesGraphicsCake::computeProjection(int dimX, int dimY) } + { + QGraphicsEllipseItem * disk = new QGraphicsEllipseItem(center[dimX].toDouble()-length/2.0, center[dimY].toDouble()+length/4., length, length/4.); + + disk->setPen(empty_pen); + disk->setBrush(cream_brush); + disk->setTransformOriginPoint(centerPoint); + disk->setRotation(orientation); + this->addToGroup(disk); + } + + { + QGraphicsRectItem * rect = new QGraphicsRectItem(center[dimX].toDouble()-length/2.0, center[dimY].toDouble()+length/4. + length/8., length, length/8.); + rect->setPen(empty_pen); + rect->setBrush(cream_brush); + rect->setTransformOriginPoint(centerPoint); + rect->setRotation(orientation); + this->addToGroup(rect); + } + { QPainterPath lef_line_details; lef_line_details.moveTo(center[dimX].toDouble()-length/2.0, center[dimY].toDouble()); From e798bdf48dabf2a92c01c3ed69f1a73cb37daa8f Mon Sep 17 00:00:00 2001 From: godardma Date: Tue, 1 Jul 2025 02:00:04 +0200 Subject: [PATCH 3/4] improved cake --- client-api/C++/examples/.vscode/settings.json | 78 ++ vibes_test.bmp | Bin 0 -> 60054 bytes vibes_test.jpg | Bin 0 -> 6708 bytes vibes_test.png | Bin 0 -> 4242 bytes vibes_test.svg | 1142 +++++++++++++++++ viewer/vibes_test.bmp | Bin 0 -> 60054 bytes viewer/vibes_test.jpg | Bin 0 -> 6708 bytes viewer/vibes_test.png | Bin 0 -> 4242 bytes viewer/vibes_test.svg | 1142 +++++++++++++++++ viewer/vibesgraphicsitem.cpp | 3 +- 10 files changed, 2364 insertions(+), 1 deletion(-) create mode 100644 client-api/C++/examples/.vscode/settings.json create mode 100644 vibes_test.bmp create mode 100644 vibes_test.jpg create mode 100644 vibes_test.png create mode 100644 vibes_test.svg create mode 100644 viewer/vibes_test.bmp create mode 100644 viewer/vibes_test.jpg create mode 100644 viewer/vibes_test.png create mode 100644 viewer/vibes_test.svg diff --git a/client-api/C++/examples/.vscode/settings.json b/client-api/C++/examples/.vscode/settings.json new file mode 100644 index 0000000..3159e54 --- /dev/null +++ b/client-api/C++/examples/.vscode/settings.json @@ -0,0 +1,78 @@ +{ + "files.associations": { + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "csignal": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "any": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "bitset": "cpp", + "chrono": "cpp", + "codecvt": "cpp", + "compare": "cpp", + "complex": "cpp", + "concepts": "cpp", + "condition_variable": "cpp", + "coroutine": "cpp", + "cstdint": "cpp", + "deque": "cpp", + "forward_list": "cpp", + "list": "cpp", + "map": "cpp", + "set": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "source_location": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "semaphore": "cpp", + "shared_mutex": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "cfenv": "cpp", + "cinttypes": "cpp", + "typeindex": "cpp", + "typeinfo": "cpp", + "variant": "cpp" + } +} \ No newline at end of file diff --git a/vibes_test.bmp b/vibes_test.bmp new file mode 100644 index 0000000000000000000000000000000000000000..35a8ec70b57f06f8a64c310254bdc30b1d25b535 GIT binary patch literal 60054 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 L4E|3oe(t{keDb`| literal 0 HcmV?d00001 diff --git a/vibes_test.png b/vibes_test.png new file mode 100644 index 0000000000000000000000000000000000000000..934e6f84f4987b4e2544338f3859effd324cc2b7 GIT binary patch literal 4242 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 literal 0 HcmV?d00001 diff --git a/vibes_test.svg b/vibes_test.svg new file mode 100644 index 0000000..ea348a5 --- /dev/null +++ b/vibes_test.svg @@ -0,0 +1,1142 @@ + + +VIBes figure +Graphics generated with VIBes on Tue Jul 1 01:22:08 2025. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0 + + + + + + + +20 + + + + + + + +40 + + + + + + + +60 + + + + + + + +0 + + + + + + + +50 + + + + + + diff --git a/viewer/vibes_test.bmp b/viewer/vibes_test.bmp new file mode 100644 index 0000000000000000000000000000000000000000..35a8ec70b57f06f8a64c310254bdc30b1d25b535 GIT binary patch literal 60054 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 L4E|3oe(t{keDb`| literal 0 HcmV?d00001 diff --git a/viewer/vibes_test.png b/viewer/vibes_test.png new file mode 100644 index 0000000000000000000000000000000000000000..934e6f84f4987b4e2544338f3859effd324cc2b7 GIT binary patch literal 4242 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 literal 0 HcmV?d00001 diff --git a/viewer/vibes_test.svg b/viewer/vibes_test.svg new file mode 100644 index 0000000..55cac26 --- /dev/null +++ b/viewer/vibes_test.svg @@ -0,0 +1,1142 @@ + + +VIBes figure +Graphics generated with VIBes on Tue Jul 1 01:54:00 2025. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0 + + + + + + + +20 + + + + + + + +40 + + + + + + + +60 + + + + + + + +0 + + + + + + + +50 + + + + + + diff --git a/viewer/vibesgraphicsitem.cpp b/viewer/vibesgraphicsitem.cpp index cc460ea..441e992 100644 --- a/viewer/vibesgraphicsitem.cpp +++ b/viewer/vibesgraphicsitem.cpp @@ -2322,6 +2322,7 @@ bool VibesGraphicsCake::computeProjection(int dimX, int dimY) const QBrush & cake_brush = vibesDefaults.brush("#ffde85"); const QPen & cake_pen = vibesDefaults.pen("black","-", "0.1"); + const QPen & text_pen = vibesDefaults.pen("#525252","-", "0.5"); const QBrush & cream_brush = vibesDefaults.brush("#fcf7e8"); @@ -2435,7 +2436,7 @@ bool VibesGraphicsCake::computeProjection(int dimX, int dimY) QGraphicsSimpleTextItem * text = new QGraphicsSimpleTextItem("10"); text->setTransform(QTransform(1, 0, 0, -1, center[dimX].toDouble()-length/4.0-length/8.0,center[dimY].toDouble()+length)); text->setScale(0.04*length); - text->setPen(cake_pen); + text->setPen(text_pen); text->setBrush(brush); disk_1->setPen(pen); From 78beefcefa551097a18e0cfe97471969a31ec972 Mon Sep 17 00:00:00 2001 From: godardma Date: Tue, 1 Jul 2025 02:02:45 +0200 Subject: [PATCH 4/4] improved cake --- client-api/C++/examples/.vscode/settings.json | 78 -- vibes_test.bmp | Bin 60054 -> 0 bytes vibes_test.jpg | Bin 6708 -> 0 bytes vibes_test.png | Bin 4242 -> 0 bytes vibes_test.svg | 1142 ----------------- viewer/vibes_test.bmp | Bin 60054 -> 0 bytes viewer/vibes_test.jpg | Bin 6708 -> 0 bytes viewer/vibes_test.png | Bin 4242 -> 0 bytes viewer/vibes_test.svg | 1142 ----------------- 9 files changed, 2362 deletions(-) delete mode 100644 client-api/C++/examples/.vscode/settings.json delete mode 100644 vibes_test.bmp delete mode 100644 vibes_test.jpg delete mode 100644 vibes_test.png delete mode 100644 vibes_test.svg delete mode 100644 viewer/vibes_test.bmp delete mode 100644 viewer/vibes_test.jpg delete mode 100644 viewer/vibes_test.png delete mode 100644 viewer/vibes_test.svg diff --git a/client-api/C++/examples/.vscode/settings.json b/client-api/C++/examples/.vscode/settings.json deleted file mode 100644 index 3159e54..0000000 --- a/client-api/C++/examples/.vscode/settings.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "files.associations": { - "cctype": "cpp", - "clocale": "cpp", - "cmath": "cpp", - "csignal": "cpp", - "cstdarg": "cpp", - "cstddef": "cpp", - "cstdio": "cpp", - "cstdlib": "cpp", - "cstring": "cpp", - "ctime": "cpp", - "cwchar": "cpp", - "cwctype": "cpp", - "any": "cpp", - "array": "cpp", - "atomic": "cpp", - "bit": "cpp", - "bitset": "cpp", - "chrono": "cpp", - "codecvt": "cpp", - "compare": "cpp", - "complex": "cpp", - "concepts": "cpp", - "condition_variable": "cpp", - "coroutine": "cpp", - "cstdint": "cpp", - "deque": "cpp", - "forward_list": "cpp", - "list": "cpp", - "map": "cpp", - "set": "cpp", - "string": "cpp", - "unordered_map": "cpp", - "unordered_set": "cpp", - "vector": "cpp", - "exception": "cpp", - "algorithm": "cpp", - "functional": "cpp", - "iterator": "cpp", - "memory": "cpp", - "memory_resource": "cpp", - "numeric": "cpp", - "optional": "cpp", - "random": "cpp", - "ratio": "cpp", - "source_location": "cpp", - "string_view": "cpp", - "system_error": "cpp", - "tuple": "cpp", - "type_traits": "cpp", - "utility": "cpp", - "fstream": "cpp", - "future": "cpp", - "initializer_list": "cpp", - "iomanip": "cpp", - "iosfwd": "cpp", - "iostream": "cpp", - "istream": "cpp", - "limits": "cpp", - "mutex": "cpp", - "new": "cpp", - "numbers": "cpp", - "ostream": "cpp", - "semaphore": "cpp", - "shared_mutex": "cpp", - "sstream": "cpp", - "stdexcept": "cpp", - "stop_token": "cpp", - "streambuf": "cpp", - "thread": "cpp", - "cfenv": "cpp", - "cinttypes": "cpp", - "typeindex": "cpp", - "typeinfo": "cpp", - "variant": "cpp" - } -} \ No newline at end of file diff --git a/vibes_test.bmp b/vibes_test.bmp deleted file mode 100644 index 35a8ec70b57f06f8a64c310254bdc30b1d25b535..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60054 zcmeHQYiJeM79QKH(nn%{*!1?HN$T~%HP%|JDPlpdXbbVu{*d~>+6xI)kVe{4D`G=w zFF_OoMZD;rP;7}>uKJ@?r6@KK;c7~wrADGZiYREs8lg39Q*G}zv(H{<&tuPX&zw0Y zdpMc1_S$Q&z1FwCd1m&RfBf@5*9~i#gY`80{SSXF_#0*X6>G!z7wUVe*`KAr>QB9B z1T+E~0gZr0KqC+x0e&DgzoWO-Ek-l~B6(c$pCAK0?q`bp;!;B3xEu33p)1`yO9ZTebFj!!Eb)K}5tcZTEXSqX z`w~XYK_@DjCLz@5FLqT3H`I zV`k~^4YlDNdb{GG6f^O*)7lgfum-U>0*o7cWD6vrqC_AjnD!DIQ|*(6y;aePPZPf? zPH}X}Vlp$-OSTBu$J7IVhk?7OBwo?25{D+2;MAg)W|taBqj>sDi9gwvM ztE*3*JQ<~R?rq)d%6-U{5nxM8OG87$&p-c+bT(|*P*YPgJUm<(sTH%Z*v0l>MWvQf zLttoVsH&=}v$K=+FgQ4P@4fdPI&>(t4z=SEfk0nhAI?Dr1_mhG88c>V-n^NLTF?l@ zK;X!cBjDA|n>VTL{Q2{no13Yq1&u%q1U~!hGw|w{Uw)ysO-)V9mMx>A7Bm7e5a{mi z2CuGNyGCv2&70TS+Db(&Xar&)aN)uQ@T#}Bm)h3W*0#5|Q&9^Vffxwfy?eL5zW)99 z-)C+6`};w&)2C0zaHX4Q1VjWnIy&yV@4l|CuAZKrXPDH`ECDAfO561CFjrjsPQAazENb_6QipEc=HY_@HzPWa+LV4Q!lC z!lcMuLO;5BmIzp+VysZLHqY~k3=mYMLq1hG)PB-KKsm46p(^Kta)<7iwI(3~8SsiC zWPG4vazVMn z${mK!MO)?&0p)y9?l6a->5#%B!1xf}KG0IR!@wT3L2eOHzPFJ%Bs~ea#UyfIKIhGm zedVG7#z<8hQHPuCLksS!mC#MqrKt)on;#jkY(`~Pps`UEx7#6U?1GyoscP(<^OCBp zwI3M*3~593BBeIeZgXQY$Wm9Byvz`|T5nZ#%Iv zWIVP+eEQW@u@RtA@$o=5vJ(VBFW7R?$Ftfh-l5|=kZeVJwee_gK!CtyXi(7-e1^tm zC?ZJ}qB47#!r+2WE=~}#kG4{Kci@w73Duysrh;l|4Npxj~d@!}zQ1Hx;SA&@-a(t2Fo4xJx<_#u4E*3F>s=BZfvBf}`6s$;d@R7I804@*k2VTRgkeg669c&X*s zv17-NACI5f-nDBN3kko!y>{)|(W6ICn>Ov9d+yn>V~0(;x9+E(enO6W_wL2}2Tz?k1^LrYKYieV2hN>42l?JCgv zE?l^J^=h(w=9y>KuU}6^Pk{(V`zsPW?bA@op$OQ-l=DHk!!+Ou^eM;FdpngmeD&2= zUwGjK)Z*Z{d-rZKd*h8a@TxB=1`2MD1vW`;AO|6URASf4`9KbtAof)jatu^)5{37M zW6ctTFn#*;HEY)3jfC)a@Zdp89B($6G-(nQ!wZaH;q7Bv%F~awWl;c1XuzBl*VbJ% z>Y^-!7{KDR3awsx>80`n|VQ1ye z%W`Y3+*L6&YQ4n>AYKzIY|lFnQdk~-_+h-p3uo_W``BZT?ccv2UE}?6IDy}{Zy$w$ zmp(uB)KgTa9liG2Yl{~zreY3- z7`eyGVgwQ_2DU3#u6+IV*WC!?Vi4~TXZqiN|NZgD9~WunwlBFRM(zn?W&}&+55=<9cxN z-DNqFsxX4dQI+nj9Dr0nF;^fkf|WI@xx%xwNahU+#xAT&3rmdNqasO}k`SZQJU597 zNH)2Y7us?RGd-!uW@y6qB8SDS3GXKj%aR8Wn3Nnn8>#Z2NMNQh3_^kv!*c~Uu|PBV z;`K2rDR*vJ)KFE$3q1E=lqw#IFbP_4d17VTO_3``Gqxt>$PxVE8nLj51h617k?{JM zm7+1pGCdhoykJ7(4H`qzs;+nxTnSpRu$3pH3cD#2JFi8i_p+^6T^I~U4p1Bo8J$c< zVPR|_!9fn0-eDG_h$m{!oH=v+_;F0?iP5|yO-#JZ<*s3zF^uDeaofHtW3}E}XvP8m z_~Va9j~=~v@uI4J3%QwJGDdl%4^>Z3&sSf4#pXd!Fwn=Cu|>^g0-iN(Y;436%XM{i z)z#IQEGDxoiT;&WUiph_*|~Ekf4Nks5Xp~UO00TzS*Xo#q8O$H*VZWyIDrQS9U%ouaKh%nuNa z^x_wJb?MS2JiGhx#~-6R$QaO%KKdw9*TslUi4t)O1w&8gI3Cs3*23b>ojZ`?1P*t0cCv1nxkrxm*zr=x%$$~i-sV{#46aw>~;0ul^*i=!veEBja9jsWf zf|?&VZ~%|P(cysi8tx^_Y5hcQ@Q#yLOE{W8x~ppkm$x91}sUZ@>LkRpibgES5b-+()_6FjiTF5qY)1 zFxCnzI%c`Q$u-5!L`ga3?d|ROfev)Bbm>xzFD_Tvtp-pFM{ww=M^&dlxUhm-T!fNm z9EcGH6-yjO6(N=+uGVNzaH#b zvSf*4W^0mOVz(8;gA-h^zxd*dIP=6MJWdbrFDK@?w2?c4WFcW{FlLk!ub{*s0GlfI zu{bW!eL`lO>e?M1G>8G~=bwLGyt4$2su^4EPLU&S#-^HSc;}wsfkm=^f|Mk3&mfT_ zs3l%sv#e#2hsPwUr6W8P+2W1_dN_CMqxJ}U<|;NkBf!nj>O%2_k~17 zMQ_8UWF>_W0wSWq|2_gDB_*XGr+`vYLWMb4IE4S73%(7YApxv_K0**DKtKZ`qygc( zfZG57BD!AfzXkti0TB>_iHIR2q-5mR15nfe0f>;008B_k1O{J^_Pg!}z%)d(96}1j zbXpb=P8WLNKx8%v*Tc$o2JNwZn8-`lAX2iMj8LXq+&u6*cX>s{#3dx9q#r$2R8m$^ zeWLSRS5M!-(8$ut`jyRV+c$3R9-dy_KEA;rp<&@4A|ewKlafL!d3S>4hYR4nXg_fH|+3r&rfbVn%vtd(NUV=!IdVkU%g{a&gAig z+c}c=0p=B3rs%PI`>N!ZbM%F0G?9nj`IKk4tM}`|_e2}`mqu+=;Vrh*-O?S=NFQ^d zm&Uvr@;y{2z?Yw1OP=VTe9rBTGZ{zs?9IpiGG`cU>TBK-$Z)yG!PA(a7~g+OIGJSW zgSPRB^9}hwWQR@>tv5;#%Jyf;E#cyMC4C2v*2&i&QLtZhGpri46G}pR*83sp0eb$C zUcRrV?(LOi9zF|X7mp!M_Hr!4RVu2|OjfZ(2Pf7$w@NS+=3FQwo@;EW&G0+UdoQal zea1X)))a!qD?}hOJdwwZEYYqcW#p!sRJQYem*`sGl+-ds*=9_#c*`-J>67U4^R6(P zJKaj)X!^U>9N`QjFTB64Z*)@@*m|ZOA<-{KelRy19WDEe9B~m#O$FK);My(XT@r_F zq$|R^M$iu+G#~Wyh-ds#hnu*MGcWM~X-X;{c+j|UMN;m6GORP%0`s;}sxyw!c6ic5 z>>R~Cjr5{TX_q9*A(RBK%+4hIy1IFiT6pi342D*jJ}+|djS;$nsK?uia{Y!9WcRdB z_J*CE+6j$w=JT1)sF<|MuF*NeJr1`%LxXY{#cFTBTXCr@TljwW#UBZ8UV1zb^+N7w z(-jYJpJarXF`)@%7{X0_pcL^bjNq01*n&+n76iYgbEWazmQfHrg*B>@_si-<{?Hw_ z9$!l&#^k{awl3VFUR6Mh@&%3~V^j_Cy0q8r7FV>#Qn-ezFrV@j13akp7o!Uv2=nn}GN%U3$-^pinZN$}LL_Sp3*b{TIAL8XReBAps-F}cqn0u# z`@vj9?9TbV3vcfJ&Z{%n zGh9W5uaT8DWH5cuR^_N{1@=iCbN7Wi?3@G!P0=?D9M9j;m?-IAPST`ru&lvIA#;>EDrlKNSI4D}PUx|VDzT154%f z1f{l!U-_V5qh4!&_3Ym?=BQ@<&Itv!lN~Y0XSaIF4-PibY`zyGxp8JsXCQKsV)-W- z%TRYeqj{AQi`qc<3?)Uy#`rz{BR5>KMUb$URi-z2-J?e*o!MqZy(P*5NLK?v%qMdx zIFh$~0O(N*A(U<7X-F%lLSMlTno(iNY*mOyHg+DCKFmEYYiUUXkQr(0jzod-b7a!A zdk71r@Y^Kn)EE)9b{7d&fp3(Ic`uIUhUF<;zrE4fbWXmG;-#j0>_D^#_WUc_1H0@ADcXgxEvZeC)UP z5Qcs(-@GMETB{QW8&MOxJfTOysA+LtXKzV%kMdM2;_3G8MyqZb+(csf4M<@b!qish ziO}~f#m)xnd)BH`oO1tZ^X-NRfAkS*_@|pK2mBvfCv_hH0?Y)OfGj?VxRE zXjY4EN^@~%CdDZF-lqxs-uX}Bsy;$L5y8``MiVg9kcHZ9IBnZ2U^S4)1ZYsR_DP_w|!w_a8RcZ^R{6_;;}8 zEndv`W|j8&IPFLrTEeSI0P0*&&zihTdV*nu;DyJMgUAl&%8Lr&`Q5|Pr6hG>hx5}2 zVLTu}>L>{$22fHi=n=0Hzp9HUp z`WRVtA8eCsPL}l&#Jc$exRVnJ@HYPq&CIvq&ba)_=vig?PNWB>)DE`Rgn$W8bR+K& z4xmlZ%2AD?iv1L8g$Fwq7qT-gt#!$RQYAUeC`SVJ-Av7LvKeeM`aS4t~ zgNHL{&Xqf8DxYTQAeUPj#8Q`M5Ue|X%i}F^{#z)F&i>hVyU(Ww4rRF{W98fYDSXdE zeA?rOKdw0p5l<&qF+!ZloN3S<4Yz|Bb(r2gvTnU(r9^dngV0JMp&R9V^p>m-%-j+h ze`{uvnPLc8!_LY$-38z4TaJlk$QaZ&qR?X~gB|WrLpJh{Pb;35#-X#5!l2mT#aK6k z$`hW=5gC~Uer>s(K7stkgmpXDm+8Y-l}{}K$vZ45krf{6P13w0I$WKNcSrx6zD(KJ zk?@kBH8sIhnNYXjn2)6uJ#kA8)ZX58^75^*u~bmF;gU{-gDn1FD?D+vonf zBi+ZmBq;Ju@jbqc+YxMR)%&kn5XB$xK=q!%Aj_NjbBHC#R(tIEXXIA>%63eqq}NPKt)$L_cZdm~1i;>a3d1aHL=)&>a`O6>|VkC6!m zw9sS-qvn2H9GZ(_rdHaj(nJ$T@tW9(boi)E&?rt3+koJ$Uv+>TXi{qAOK>ZdB+mRf z%?#s|dN0*jW4-r#U7OJQ8YfYH*>+csb$RnkVwsA7jhY!!hYyV`O~}? zY2!zKN3n$|FR={`0!_U?%zPWh{jIhdhc#5tXr-jTr zp^k8R3W;H1`~%hy+Yuw-rX=j;eAc;U`*Evy!vR6BHiqZtxi<4#i!5~Jb9+P|M!lLz z652oLI41g6nLhW<14BNM(K|&)w=J(mYOh9c4?5T2b61!+!NInLY8Hncp;#fq;~)3- ze|+-c&cFj7M2po54qBM@EMsQaX_Dbw?7=4!u-Tl3{&)V^6AK^BNKr46yxMLbme|?t zqOaAru#_NH4RC%f=lTBJY_WrY72wxdhjx$Rw@UE+V8mX7msAKRg&_PP=@$eOj%u;q*mV zifJ}Du&oW?4e~7fBY5M29?7K9`WEc@Ytis`$Wo8O=~ruQ&}pFVGhgbJJm1)eFTXQc zCPKp!-|+7or*gT;h_K~-ig+anSS7X*ej%t#W}5a#k9o?HF~u_83qH$g)hc!qvueJH z2mCJxvO?bR+bywD+aBRW$5qztKFwMVCk2objnG>>2mK;em4cOS@|D7pk%trM`EV(j zy5jp6ic94uD({E!09~`qQ=Eil`$k04 zt@NU`P*X=z69;PT*%GXV2LayI>6w1D?=uQ+)1z&}d+jMmOG+=A1|`|v#fj`4k`j5U9|2YY6f zm^jQU-r>CRaKxLqqSDFFs9cHEBf~uZ>Tkd)+v1XH|IhPo{uD3^xR(hJkf|Q~_jT1{ zG%JpJFWvv*0okn=gKa-V#{U$Eei!LIFf#7g?W21fGr|n9739FOc6ptSs6q*iv`c>O z(W)F)lSx@i+hRALXt(M*JXkCLYgs>ua*+7v<8+?YR0gJV_In6-rZktgIF_~P$3Ll zryl8Gl|XC}@W4}v_))JO4CklebXnfjn04VZtB}*vY&F@j*w;I%NRjq1JuZDPJxJU< zEcc3rS*FY*ZE(k~F4g}I&hRa9keG@YB;JtRhUKC-WZYLc_pZXB;#{Ve4>pVNjR@h= zV211A+C1l&wed&8#*7&{;uw}2Pil&L?hALi8eGt)Y~p0nN?)Dz^rp`xQcP5|&l_po z$`Mx?Ac}vNf5Q#AUGrR8^v8jj%M8mPGsElY1hZxTb?-Gi(8kOpATevli$tcLduAr~ z8N=bO&>m@*Ah%4Pwz1k1=A2Fk7N^oT?Hw^!@?t;k#4;&2a6l80EtBpL5 z$dqHySt*8Z{yhEU>l9YQdTXgnw3$x5G9x}$)$R>a$Rs%EIbn2w%Ql~OB;TX>f7iT! z>a9HB56kvpEfGH}QaNqUQf&++1|gby=-qdHeoq&iEOd{b$f-r{^3xvc*nY(&8C$-Q zFiVfF0252;IyD7HN9TVK^x%u5wS9kkLNF%SL_zF(_xR%k>0Ty9vg~$~lz3MK?Au8; zx-{LXnuY8FI|*Xk$k|&dBdEo5fBrr_Ae)P?CewF4scbs1TyqO|fe~#yY4SX_@9fYM z@2Af(u79EQS=E%;anXW8yD$ps0pDe@WZFV-9WWXmTy_sh^Q7A5Q$Z=4OC3tkY*t-8%$1!JQ!96MIbP~&nn@c1a}CTkt{ zHQoEq;(6E|2st8GEg8n!!Q!GnT!2~MJq--VxPG~D><$Y1Rp^n~aVro&{_u@-}%Dr+_3OZp>eO!Fy z_Q8F0G8mv1)}@J#ZOf|fxbImvA_;#PnM;^;eKGRHov%-OY;8p!t{O;Hh8ln2wS3^E zk)3A^OAN$?&Q?}bPuyFnuBZtbpGItlk#xOofTiETS|#}3s#FB%wG;t{5%1vcpRk`iQEth5LHu@Ey4W z*t9!_%jqIy=UtYF=lcz~WbcDd3=N9(x=GeN*penklIvI=vQVVIHm(05NXo^-gN*X9 zcb0iSZ1=@;3+EN?F?xR3jI30v46u>&z(uwJ-iQ@mwF{;d%#FF%`UG|xiG~e6DAMie z?_*yxmA)T&s|8faaWLpcycCu!^Y8gd@i$6c8xQD>b4te~4~?6u(n_2?e!7;ikA^&R zi^=yNVzlj9=`gTM^j7QAGP_fYnsQ)BdQ{lw*ps9C^5@p5!lO7@&ENkIq7@ zQ`8?AGZ`&0X^=T6nvXz+bXCnkFv`+ciVL?X_ypD5pHhAsMNm2Ageo-`QCt$hPLqik z5tg!d>)U*Rm_#d=8JVGa;yom5l^u>`#YwFep-FS=B~^}#-ekTjgi>(jh;OxCry`M= zs!<8(<(#GlMZptztAB^hS3%)##bC>n&nwDJk&?aFFW^Brv3VZ@Ah1B=cumSFwEj(8 zuPE&o@70)KzCtE2O*`1_GZsNpbn$q~(c$ZK$vyr*?%Gv@ZjSq=!=dIR>a!4M<~mM- z8_%h|_m+Z~t?q)gx+4daz9bX&!t9w$Rr=Ut zNx0IdsHk73Tyc$-)kGCqM=~dqjX$Pt#0Dq-C;_bmN5|%Z2{`wA!*&pNbH1fo%TA8* zq0@G)D7q^9u|Sb*5-2?}L6xTtN9C4SF0tgaHM453f4lgd;@I|Ira#4`Uz#VE`~_5^ zm&Nq2)}2jfaRgnlUX))2>?#U|XheTYMNssWL~&>}=zf3^P7>(4%3yuLSPMN~;wboKVRdoXF%I@tV{N|6$~-|y`qt=wCV~Hv L4E|3oe(t{keDb`| diff --git a/vibes_test.png b/vibes_test.png deleted file mode 100644 index 934e6f84f4987b4e2544338f3859effd324cc2b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4242 zcmV;D5N+>?P) z-h|_LyW9Q&4?g$YbN4*=-1BpWW}XFVF5i2xAOlf)K(OVj(TrRzw;mHBU7!3^#8T|Rta=QEb`@{SC`Xboe zxYDgAsKSpB!d&sDyGt$*j4{g3&)=DlkkD*4o4X%=_~9eBZrzHPI$Wt~Y;2soa^=cn zF)=Y6k&%(TOP4PF=Iq(C_fqbmknaBe{_q707T9<0+?h|ezj*Ot+Tz8FtBgjYbL!No z*WP*OoyV1mBVVW{S88f%eOOr7-~$gl@O52X-AtyxnKNhBMMOmO*=)9&>gwuDz!-~a zhU0SQcVS`S7NgPFTU=bczOu4%ab{+webJ&tRbq!LrD3MY;c!G+t=5|h7cTtv`0?Xe zcDp@u#flZ5CMG6+|HBVIOwdxgnQ5b&=bwN6&j5g5dg-Ozl%3P*jEIkqZ&|&1b-CSc z&)lVZ{H5u|7hn7%0O0cS^3@d;71;|GEI2V|&Yb_c-EM?2hLa~x zrUL-pv17-slP6E6Z`!o!U{q98x1^DCxm>!`)YNMQ1qJz(U2Sb`8USFs-JYrRg%odcl$3h9K#Gcr z9yggxJv}`=CdzK@+O;3%3s5)U!9$umdMCR2i?A=rslr+^XH$wa^=c&j4|Zp z<-JRH9~>MsOqw*QQPPOk)z!@a09;*Nok6!xPENl5`s=T6Q~E-RQMicVFFK{nd+)vX zn8{@7@fWY8q@?ed?wdAkIw)x$q^YSX5dgqywKmZ0tyXJ8b8~Zolwpev#u)iC`}gnP zj1a=-&Yhe0)mLBr2mqkDxjBLEXUUQ!mCrr*++VoP#br3-8l>3(0FRA)&j5gzXl_3S zfXxj56(ixc)9esJ*q;e5Hv*%fp}|U(!8L2ve6)1w(r>nH+qS!>rzZ*k!0mSHT3T8r zGLN%btqqb2gbLJRv2@YxEfz}`TZGgOTSoWw^+mk$$}78`dFGk7ckSBs%G|kg&x@IE zwlKL0crbhb0AB;ZJ|FHa0AOL*S!iw)Tyd0BIL*z?3DnJc-n@C|9(m-Ee-;-PZ^+Kh z{@m?$>)P7dCa{e(S}c|>NvpPF$Bz930C0PIdkoz^D=X{x6Hh$xccrV|Kn#yOm!_#A z&?psOvEwa9-fh{kr4S+Hrl0Tf<;yb>Lhd6+jy&XaIwRP^D<~+)m$U{+NJwY~0BCJ( zjicMQwY5!1OiXN&GHkJ7Yf_CHH*R3ZjvcQ$olYa&?eyu>_W=N0zI=HW-G1)ex#zcU z-~O7f=2D=w0rF#nG~LR|%6_ib>s^y4Pi~}4SXkJg*=+8fJb7|sLqmgg)v8q=uV25u zgnr!N!-sPbLU>?cU>s%VFK&LXGsB2c!%Unwv1Q7XDL3hMGiT1MOG--m{=$U|b0Q)l z`k1vnz;HR0^sd|6+iNtN&9{q+iXNxzIyyR{^?LnKd3pJ2rE3MD=HkVRv-NuYP)SM2 zxw-AtW2_3G-?tINyE%5ohJN93!ozPf$Nlqomp$8FuZ zb7l;nl! z$tR!u+dcQ(bDkO&eBp%`{uCb{-!d>T5TMX zH-njOdZrF2*wheWGBPr%>BGD?Zrqrn)9G9X4<6h^{f>=|ZQZ+f?{mR~BSbKKuaC>+ z(j_M+Uk3m@G&H1lxm>y}TecKNM@M(Gw6w%yjN$$F-~R;w;0qTn+>PjESAocl$84MKY=Yu2Uk@bJEM>(-SF4h|Z`3|FXFe4Velx;g^@u-RHm{5 zEPCIAPrq!`FXNgbgm7hL<&vSHAwzn4`l+a>s2-+!eSLlErAwD)+ibR)`1tr+vIt}> zAS4sDCJHq`U1vU}mU*4IropqhYi2g4nxUReaQYkhB*G95y|9nk`SLsR8O-_+B9I{A zBMu@A@u6Q!u37~HaIOXM1rdlq_*C^o81mrJg!1KQAAVNhqrIv{@SWlt3KYhZ{Kg0EnD`*&6_u; z#KgpO$Q5xpPVU6Vk$HJ}?`CCX9jAU% zyFa|~#v8wvd#0(>26)UMRVrReg{@^HBtN~HSl6yyn>u60j4S>9{o!mIomEs+EYHcw zIZFLD7z{(pmoKmQ?6c2S2-7x!52RnA3|<1cdiCnG($dnkX0y3_;>3w9lO|32uC%mt zEx?`KA3|Z55-mXb70Tlwke;5NsMgljxTK_{?@ymTeP4ZjeQIuQ?&0<8*O%Ds_65}L z523P4i5ihh6iRKuqcuD_=_ZrO(b?GK8F7yzNM)43Nq;Nl?=gb-%d4hSJ^ zv)O8{U%#G0?fxM4E+v#GDAXbj%rWv2EOL!PQR(mud+dmV559)$J(^fwe)(nA#*G`_ zb2uC(x_x6~<78@CWkyEE$*QWV#dPFKBVM+RZK!GIAZ3blxX0tfMsi48gX z6~4k6YkirZZgTV?t@`@pJCFEEo2xNIJfb?yAG7-@?d>2k}T{|+H zH$aqLO-QDfa3f|Oh5T$>DHvU{>BF7gaTlWy6H)Mk@0LJ;+`vc;5&*-aLBm6&6nvXp zffj5ciolR+cNroOp7<)Tf!wv2$NCFL4pC^m4-@ESeL~Vn1R@grcl^WD2j`9&QVI}G_e#$4Yd-RI~}bT@?anWQ3x{U zN*j>r?lPjL+Je9jZ3_e;Yy*Irk)O=(bbR^Y?O*6*HzEp6qwOY^jGLYzfYTUbrjFSC z5>bQJau60m7U+tcifv+HaQqk<=gzA_{FHLLX!#;}LiY!Q;0)&jpw@ z#c1d%5C##2HW9It&Njj$f1yxAfh4s>=%DUVEQIjr6Kr2YtSTvhL=>Tk=mMcHxME#c zCG=T>3JV<(Md%~Ela3H;iSQ`>T&oi`TBy{}j3dZHzyk5LRSjE7QTu}YKnR7}f-I*F z9Ol^5DE8%=tT$T+bpx;Z9Fb4?%a*`A*=I zWZzVdeWQfF6M{gX@Y@G*xmJiD zO#84m<==VDW&rNIBV5h#Bu1OYD(dc~i(MLZlEG*pWa5zi=0K0eZ-Zo*vgf{xf z7U2#E0j3+J<3kV^uP5nUU0s$3AAIoNmo8nJ9TOAN(ca#E*Rf;ARxVn!=sya@QI$|) zpg*i1UI0mE!-f(puV7=J%FcRl0ILIiokI+~w)v4XEOucG+Yxbu8Xf{+&TAUAXZ)rL zAn%#H;5|o*&#`<8I@=ytQq0F9!Wf&33dENqYoZLl?5NRcKiL&*^JX z84*UPgD}RDio@erflVPHZgnD2r5U^&8y{{@Kae2Wieg=C#t=x&QzG07*qoM6N<$g5e}CF#rGn diff --git a/vibes_test.svg b/vibes_test.svg deleted file mode 100644 index ea348a5..0000000 --- a/vibes_test.svg +++ /dev/null @@ -1,1142 +0,0 @@ - - -VIBes figure -Graphics generated with VIBes on Tue Jul 1 01:22:08 2025. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -0 - - - - - - - -20 - - - - - - - -40 - - - - - - - -60 - - - - - - - -0 - - - - - - - -50 - - - - - - diff --git a/viewer/vibes_test.bmp b/viewer/vibes_test.bmp deleted file mode 100644 index 35a8ec70b57f06f8a64c310254bdc30b1d25b535..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60054 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 L4E|3oe(t{keDb`| diff --git a/viewer/vibes_test.png b/viewer/vibes_test.png deleted file mode 100644 index 934e6f84f4987b4e2544338f3859effd324cc2b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4242 zcmV;D5N+>?P) z-h|_LyW9Q&4?g$YbN4*=-1BpWW}XFVF5i2xAOlf)K(OVj(TrRzw;mHBU7!3^#8T|Rta=QEb`@{SC`Xboe zxYDgAsKSpB!d&sDyGt$*j4{g3&)=DlkkD*4o4X%=_~9eBZrzHPI$Wt~Y;2soa^=cn zF)=Y6k&%(TOP4PF=Iq(C_fqbmknaBe{_q707T9<0+?h|ezj*Ot+Tz8FtBgjYbL!No z*WP*OoyV1mBVVW{S88f%eOOr7-~$gl@O52X-AtyxnKNhBMMOmO*=)9&>gwuDz!-~a zhU0SQcVS`S7NgPFTU=bczOu4%ab{+webJ&tRbq!LrD3MY;c!G+t=5|h7cTtv`0?Xe zcDp@u#flZ5CMG6+|HBVIOwdxgnQ5b&=bwN6&j5g5dg-Ozl%3P*jEIkqZ&|&1b-CSc z&)lVZ{H5u|7hn7%0O0cS^3@d;71;|GEI2V|&Yb_c-EM?2hLa~x zrUL-pv17-slP6E6Z`!o!U{q98x1^DCxm>!`)YNMQ1qJz(U2Sb`8USFs-JYrRg%odcl$3h9K#Gcr z9yggxJv}`=CdzK@+O;3%3s5)U!9$umdMCR2i?A=rslr+^XH$wa^=c&j4|Zp z<-JRH9~>MsOqw*QQPPOk)z!@a09;*Nok6!xPENl5`s=T6Q~E-RQMicVFFK{nd+)vX zn8{@7@fWY8q@?ed?wdAkIw)x$q^YSX5dgqywKmZ0tyXJ8b8~Zolwpev#u)iC`}gnP zj1a=-&Yhe0)mLBr2mqkDxjBLEXUUQ!mCrr*++VoP#br3-8l>3(0FRA)&j5gzXl_3S zfXxj56(ixc)9esJ*q;e5Hv*%fp}|U(!8L2ve6)1w(r>nH+qS!>rzZ*k!0mSHT3T8r zGLN%btqqb2gbLJRv2@YxEfz}`TZGgOTSoWw^+mk$$}78`dFGk7ckSBs%G|kg&x@IE zwlKL0crbhb0AB;ZJ|FHa0AOL*S!iw)Tyd0BIL*z?3DnJc-n@C|9(m-Ee-;-PZ^+Kh z{@m?$>)P7dCa{e(S}c|>NvpPF$Bz930C0PIdkoz^D=X{x6Hh$xccrV|Kn#yOm!_#A z&?psOvEwa9-fh{kr4S+Hrl0Tf<;yb>Lhd6+jy&XaIwRP^D<~+)m$U{+NJwY~0BCJ( zjicMQwY5!1OiXN&GHkJ7Yf_CHH*R3ZjvcQ$olYa&?eyu>_W=N0zI=HW-G1)ex#zcU z-~O7f=2D=w0rF#nG~LR|%6_ib>s^y4Pi~}4SXkJg*=+8fJb7|sLqmgg)v8q=uV25u zgnr!N!-sPbLU>?cU>s%VFK&LXGsB2c!%Unwv1Q7XDL3hMGiT1MOG--m{=$U|b0Q)l z`k1vnz;HR0^sd|6+iNtN&9{q+iXNxzIyyR{^?LnKd3pJ2rE3MD=HkVRv-NuYP)SM2 zxw-AtW2_3G-?tINyE%5ohJN93!ozPf$Nlqomp$8FuZ zb7l;nl! z$tR!u+dcQ(bDkO&eBp%`{uCb{-!d>T5TMX zH-njOdZrF2*wheWGBPr%>BGD?Zrqrn)9G9X4<6h^{f>=|ZQZ+f?{mR~BSbKKuaC>+ z(j_M+Uk3m@G&H1lxm>y}TecKNM@M(Gw6w%yjN$$F-~R;w;0qTn+>PjESAocl$84MKY=Yu2Uk@bJEM>(-SF4h|Z`3|FXFe4Velx;g^@u-RHm{5 zEPCIAPrq!`FXNgbgm7hL<&vSHAwzn4`l+a>s2-+!eSLlErAwD)+ibR)`1tr+vIt}> zAS4sDCJHq`U1vU}mU*4IropqhYi2g4nxUReaQYkhB*G95y|9nk`SLsR8O-_+B9I{A zBMu@A@u6Q!u37~HaIOXM1rdlq_*C^o81mrJg!1KQAAVNhqrIv{@SWlt3KYhZ{Kg0EnD`*&6_u; z#KgpO$Q5xpPVU6Vk$HJ}?`CCX9jAU% zyFa|~#v8wvd#0(>26)UMRVrReg{@^HBtN~HSl6yyn>u60j4S>9{o!mIomEs+EYHcw zIZFLD7z{(pmoKmQ?6c2S2-7x!52RnA3|<1cdiCnG($dnkX0y3_;>3w9lO|32uC%mt zEx?`KA3|Z55-mXb70Tlwke;5NsMgljxTK_{?@ymTeP4ZjeQIuQ?&0<8*O%Ds_65}L z523P4i5ihh6iRKuqcuD_=_ZrO(b?GK8F7yzNM)43Nq;Nl?=gb-%d4hSJ^ zv)O8{U%#G0?fxM4E+v#GDAXbj%rWv2EOL!PQR(mud+dmV559)$J(^fwe)(nA#*G`_ zb2uC(x_x6~<78@CWkyEE$*QWV#dPFKBVM+RZK!GIAZ3blxX0tfMsi48gX z6~4k6YkirZZgTV?t@`@pJCFEEo2xNIJfb?yAG7-@?d>2k}T{|+H zH$aqLO-QDfa3f|Oh5T$>DHvU{>BF7gaTlWy6H)Mk@0LJ;+`vc;5&*-aLBm6&6nvXp zffj5ciolR+cNroOp7<)Tf!wv2$NCFL4pC^m4-@ESeL~Vn1R@grcl^WD2j`9&QVI}G_e#$4Yd-RI~}bT@?anWQ3x{U zN*j>r?lPjL+Je9jZ3_e;Yy*Irk)O=(bbR^Y?O*6*HzEp6qwOY^jGLYzfYTUbrjFSC z5>bQJau60m7U+tcifv+HaQqk<=gzA_{FHLLX!#;}LiY!Q;0)&jpw@ z#c1d%5C##2HW9It&Njj$f1yxAfh4s>=%DUVEQIjr6Kr2YtSTvhL=>Tk=mMcHxME#c zCG=T>3JV<(Md%~Ela3H;iSQ`>T&oi`TBy{}j3dZHzyk5LRSjE7QTu}YKnR7}f-I*F z9Ol^5DE8%=tT$T+bpx;Z9Fb4?%a*`A*=I zWZzVdeWQfF6M{gX@Y@G*xmJiD zO#84m<==VDW&rNIBV5h#Bu1OYD(dc~i(MLZlEG*pWa5zi=0K0eZ-Zo*vgf{xf z7U2#E0j3+J<3kV^uP5nUU0s$3AAIoNmo8nJ9TOAN(ca#E*Rf;ARxVn!=sya@QI$|) zpg*i1UI0mE!-f(puV7=J%FcRl0ILIiokI+~w)v4XEOucG+Yxbu8Xf{+&TAUAXZ)rL zAn%#H;5|o*&#`<8I@=ytQq0F9!Wf&33dENqYoZLl?5NRcKiL&*^JX z84*UPgD}RDio@erflVPHZgnD2r5U^&8y{{@Kae2Wieg=C#t=x&QzG07*qoM6N<$g5e}CF#rGn diff --git a/viewer/vibes_test.svg b/viewer/vibes_test.svg deleted file mode 100644 index 55cac26..0000000 --- a/viewer/vibes_test.svg +++ /dev/null @@ -1,1142 +0,0 @@ - - -VIBes figure -Graphics generated with VIBes on Tue Jul 1 01:54:00 2025. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -0 - - - - - - - -20 - - - - - - - -40 - - - - - - - -60 - - - - - - - -0 - - - - - - - -50 - - - - - -