diff -r a9bf6bab5ea2 -r 8efa3a33172e src/model.cpp --- a/src/model.cpp Wed Jun 15 19:47:02 2022 +0300 +++ b/src/model.cpp Mon Jun 20 02:04:51 2022 +0300 @@ -19,6 +19,63 @@ #include #include "model.h" +constexpr unsigned int gcd(unsigned int a, unsigned int b) +{ + while (a != b) { + if (b > a) { + b -= a; + } + else if (a > b) { + a -= b; + } + } + return a; +} + +static_assert(gcd(16, 15) == 1); +static_assert(gcd(16, 4) == 4); +static_assert(gcd(272, 192) == 16); + +static constexpr const char* circularPrimitiveTypeString(const CircularPrimitive& circ) +{ + switch (circ.type) { + case CircularPrimitive::Circle: + return "edge"; + case CircularPrimitive::Disc: + return "disc"; + case CircularPrimitive::Cylinder: + return "cyli"; + case CircularPrimitive::CylinderOpen: + return "cylo"; + case CircularPrimitive::CylinderClosed: + return "cylc"; + case CircularPrimitive::DiscNegative: + return "ndis"; + case CircularPrimitive::Chord: + return "chrd"; + } + return ""; +} + +static QString circularPrimitiveFilePath(const CircularPrimitive& circ) +{ + QString result; + if (circ.fraction.divisions != 16) { + result += QString::number(circ.fraction.divisions) + QStringLiteral("\\"); + } + const int factor = gcd(circ.fraction.segments, circ.fraction.divisions); + int num = circ.fraction.segments / factor; + int denom = circ.fraction.divisions / factor; + if (denom < 4) { + num *= 4 / denom; + denom = 4; + } + result += QStringLiteral("%1-%2").arg(num).arg(denom); + result += QString::fromLatin1(circularPrimitiveTypeString(circ)); + result += QStringLiteral(".dat"); + return result; +} + static const char* iconPathForElement(const ModelElement& element) { return std::visit(overloaded{ @@ -37,6 +94,9 @@ [](const Colored&) { return ":/icons/linetype-conditionaledge.png"; }, + [](const Colored&) { + return ":/icons/linetype-circularprimitive.png"; + }, [](const Comment&) { return ":/icons/chatbubble-ellipses-outline.png"; }, @@ -102,6 +162,12 @@ .arg(vertexToString(cedge.c1)) .arg(vertexToString(cedge.c2)); }, + [](const Colored& circ) { + return QStringLiteral("1 %1 %2 %3") + .arg(circ.color.index) + .arg(transformToString(circ.transformation)) + .arg(circularPrimitiveFilePath(circ)); + }, [](const Comment& comment) { return "0 " + comment.text; },