mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-29 23:17:30 +01:00
Plan tool: cofanie, złącza, przejścia rozjazdowe, and a demo to open
What the plan tool was missing was not geometry but the ordinary business of editing: taking a mistake back, dividing what is drawn, and seeing what the next click will do before making it. Cofanie. The document is plain data, so a step is a copy of it. What counts as one step is decided by watching the document - a fingerprint over the tracks, turnouts and catalogue - rather than by dressing every edit with a call: a frame that changes anything opens a step, and the step closes when the drawing settles. That is what makes a drag, or a number typed digit by digit, one step and not thirty, and nothing can be forgotten on the way in. Ctrl+Z / Ctrl+Y; the scene editor listens for the same keys, so it hands them over while the plan has the keyboard. Złącze i wycięcie. `insert_joint` divides whichever element a station lands in and leaves one chain: the ground does not move, the curvature at the new joint is the one that was always there, and the fit reads the chain the same way afterwards. It is refused on a straight, because two straights end to end are one straight and the skeleton will not read that, and under a turnout, which is one piece of geometry on one element. `cut_track` takes a piece out and does leave two tracks - a gap is the ground between them, not a hole in a chain. Przejście rozjazdowe. A turnout may now stand against another one: where it stands is then worked out from that one's frog, not authored, so moving either carries the other with it and a trapez stays shut. The frog has to land on the line leaving the other frog - not on the track's axis, which is 1,469 m further on for a 1:9 - so the station is settled by laying the turnout and walking it along until it does. Drawing is a tool now, not what a click happens to do: until Rysuj is on, a click picks what is under it. With it on, the cursor at the growing end shows the corner and the straight the next click would lay, worked out by the same fit_corner the click itself uses. A chain only grows at a loose end, and the first element of a track is put down by two clicks instead of landing on the plan's zero. Also here: the curvature strip under the panel, pikietaż in the rows and at the cursor, how far the laid axis runs from the clicks it was drawn from, the file format saying which frame and which units it is in (v9), plans chosen from the directory instead of typed, and editor/samples/demo.m0s - two parallel tracks and a trapez - with the generator that wrote it and a test that opens it and demands it lays clean.
This commit is contained in:
@@ -132,6 +132,61 @@ struct Skeleton {
|
||||
[[nodiscard]] bool lay_along_skeleton(Track& track, const Skeleton& skeleton,
|
||||
std::string& why);
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Putting a joint into a chain, and taking a piece out of one
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// What putting a joint in worked out to.
|
||||
struct JointOutcome {
|
||||
bool ok{false};
|
||||
/// Why it could not be put there, ready to show; empty when it was. Nothing is
|
||||
/// written to the document unless the whole thing works out.
|
||||
std::string why;
|
||||
/// The element that took the far half. It is a new element with a new id; the
|
||||
/// near half keeps the id the whole element had.
|
||||
ElementId added{ElementId::none};
|
||||
};
|
||||
|
||||
/// Divides whichever element of @p track the station lands in, leaving one chain
|
||||
/// of one more element and exactly the same geometry on the ground.
|
||||
///
|
||||
/// The chain is relative — every element starts where the one before it ends — so
|
||||
/// there is nothing to recompute: the two halves carry the lengths they were given
|
||||
/// and the shape they always had. A transition curve divided in half eases to the
|
||||
/// radius it had reached, and the far half goes on to the radius it was always
|
||||
/// going to; the curvature at the new joint is the one that was there all along, so
|
||||
/// the fit still reads the chain the same way.
|
||||
///
|
||||
/// Refused on a straight: two straights end to end are one straight, which is what
|
||||
/// the chain would then be saying twice, and the skeleton the fit works from will
|
||||
/// not read it. Refused inside a turnout too — a turnout is one piece of geometry
|
||||
/// on one element.
|
||||
[[nodiscard]] JointOutcome insert_joint(Document& document, const Solution& solution,
|
||||
TrackId track, double station);
|
||||
|
||||
/// What taking a piece out worked out to.
|
||||
struct CutOutcome {
|
||||
bool ok{false};
|
||||
std::string why;
|
||||
/// The track carrying what was beyond the piece. It keeps the elements it took,
|
||||
/// ids and all, so a hold pointing at one of them still resolves; a turnout
|
||||
/// standing past the cut goes with it, its station measured from the new start.
|
||||
TrackId second{TrackId::none};
|
||||
};
|
||||
|
||||
/// Takes the piece between @p from and @p to out of @p track, leaving the two ends
|
||||
/// standing where they stood. What was between them is gone, and the gap is simply
|
||||
/// the ground between two tracks — there is no such thing here as a chain with a
|
||||
/// hole in it, which is why this one does make a second track and @c insert_joint
|
||||
/// does not.
|
||||
///
|
||||
/// Refused when a turnout stands in the piece, or when either end would land in the
|
||||
/// middle of a transition curve: a chain always begins running straight, and there
|
||||
/// is nowhere in the document to say otherwise.
|
||||
[[nodiscard]] CutOutcome cut_track(Document& document, const Solution& solution, TrackId track,
|
||||
double from, double to);
|
||||
|
||||
} // namespace editor::plan
|
||||
|
||||
} // export
|
||||
|
||||
Reference in New Issue
Block a user