mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-11-03 17:50:21 +01:00
The library was a heap of half-built services - fitting, parallelism, niwelety, an SVG writer - that never met each other. In their place is one authored Document and one solver that lays it whole: tracks as element chains, turnouts placed on them, and a Solution that is rebuilt from scratch every time and never fed back into the document. What cannot be laid comes back as a diagnostic with the number in it rather than as silence or a fitted-away error. Turnouts are dimensioned the way the drawings dimension them. The blade follows Koc's rys. 5.9 - the curve is theoretically tangent to the opornica at PR, the blade starts at a with a planed nose of d, and A is where the rail stands u thick - and a + d derived that way lands on his tablica 5.1. Bending follows 5.3.6: it rotates the triangle OBC about the centre of the turnout, so the tangent t and the crossing angle stand and both radii follow from them. That is Koc's (5.7) and (5.8) without coding either, and it puts a symmetrically bent Rz 49E1-190-1:9 on the catalogue's Rlus 49E1-380,292-1:9. A rozjazd standing on a curve is bent onto it; one on a track drawn straight can carry a bend of its own. The szyny laczace take up the difference, because the switch and the frog are only bent, not re-cut. The plan panel draws all of it: the catalogue drawing of a type with its construction points, the theoretical arc dashed where no rail runs, and the blade nose as the straight it is cut as. Dragging a straight now stops where it would pull the track out from under a turnout. File format goes to m0s 6. Versions 3 to 5 still open.
36 lines
1.3 KiB
C++
36 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <vector>
|
|
|
|
#include "maj0sted/editor/solution.hpp"
|
|
|
|
namespace maj0sted::editor {
|
|
|
|
/// One drawable rail, tagged with what it came from so the host can colour it
|
|
/// and hit-test it. Exactly one of @c element / @c turnout is set.
|
|
struct PlanPolyline {
|
|
Kind kind{Kind::Line};
|
|
ElementId element{ElementId::none};
|
|
TrackId track{TrackId::none};
|
|
TurnoutId turnout{TurnoutId::none};
|
|
/// For a turnout rail: which piece of the diverging path it is, and what part
|
|
/// that piece plays (0 przediglicowy, 1 iglica, 2 łuk, 3 krzyżownicowa), so a
|
|
/// drawing can say every element apart. -1 on a plain track rail.
|
|
int part{-1};
|
|
std::size_t piece{0};
|
|
double length{0.0};
|
|
double radius_start{0.0}; ///< 0 == infinite
|
|
double radius_end{0.0};
|
|
std::vector<PlanPoint> points;
|
|
};
|
|
|
|
/// Draws a solved layout as rails: two per element, a gauge apart. Turnout
|
|
/// diverging paths are drawn too, tagged with their turnout.
|
|
///
|
|
/// This is presentation only. It decides nothing about geometry, and the
|
|
/// exporter no longer reads it back — the axis it needs is in the Solution.
|
|
[[nodiscard]] std::vector<PlanPolyline> render_rails(const Solution& solution,
|
|
double gauge_metres = 1.5);
|
|
|
|
} // namespace maj0sted::editor
|