src/model.cpp

changeset 232
8efa3a33172e
parent 208
930928b760a2
child 242
16855456992d
--- 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 <QPixmap>
 #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<ConditionalEdge>&) {
 			return ":/icons/linetype-conditionaledge.png";
 		},
+		[](const Colored<CircularPrimitive>&) {
+			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<CircularPrimitive>& 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;
 		},

mercurial