diff --git a/application/editormode.h b/application/editormode.h index 5b047662..b4abd0c3 100644 --- a/application/editormode.h +++ b/application/editormode.h @@ -814,7 +814,7 @@ class editor_mode : public application_mode, private editor_track::observer void render_route_stored(); void route_update() { m_route.result = alignment::compute(m_route.design); } void route_apply(); - bool route_relay_through_switches(editor_track::chain const &Chain, std::vector> &States, std::vector &Created); + bool route_relay_through_switches(editor_track::chain const &Chain, std::vector> &States, std::vector &Created, TTrack *&Last); void route_recommend(alignment::vertex &Vertex) const; void draw_route_overlay() const; void render_route_gizmo(); diff --git a/application/editormodetrack.cpp b/application/editormodetrack.cpp index 070a6a59..b18fae1e 100644 --- a/application/editormodetrack.cpp +++ b/application/editormodetrack.cpp @@ -2943,9 +2943,9 @@ void editor_mode::route_apply() { auto pieces{alignment::pieces(route.result, route.design, chain.tracks.size())}; editor_track::keep_heights(chain, pieces); - relaid = editor_track::relay(chain, pieces); + relaid = editor_track::relay(chain, pieces, &to); } - else if (false == route_relay_through_switches(chain, states, relaid)) + else if (false == route_relay_through_switches(chain, states, relaid, to)) { undo(); return; @@ -2978,7 +2978,7 @@ void editor_mode::route_apply() } // the switches of the chain are moved as a whole onto the designed line, the regular paths between them re-laid -bool editor_mode::route_relay_through_switches(editor_track::chain const &Chain, std::vector> &States, std::vector &Created) +bool editor_mode::route_relay_through_switches(editor_track::chain const &Chain, std::vector> &States, std::vector &Created, TTrack *&Last) { auto &route{m_route}; auto const &result{route.result}; @@ -3100,7 +3100,10 @@ bool editor_mode::route_relay_through_switches(editor_track::chain const &Chain, { auto group{groups[i]}; editor_track::keep_heights(parts[i], group); - auto const added{editor_track::relay(parts[i], group)}; + TTrack *last{nullptr}; + auto const added{editor_track::relay(parts[i], group, &last)}; + if (last != nullptr && parts[i].tracks.back() == Chain.tracks.back()) + Last = last; Created.insert(Created.end(), added.begin(), added.end()); } return true; @@ -4402,7 +4405,7 @@ void editor_mode::straight_reshape(editor_track::straight const &Line, double co } auto pieces{alignment::pieces(m_route.result, m_route.design, m_route.chain.tracks.size())}; editor_track::keep_heights(m_route.chain, pieces); - auto created{editor_track::relay(m_route.chain, pieces)}; + auto created{editor_track::relay(m_route.chain, pieces, &m_route.to)}; editor_track::commit(tracks); for (auto const &entry : splitstates) { diff --git a/editor/editorTrack.cpp b/editor/editorTrack.cpp index 075709e2..4a29c3ba 100644 --- a/editor/editorTrack.cpp +++ b/editor/editorTrack.cpp @@ -2912,7 +2912,7 @@ void editor_track::move_straight(straight const &Line, glm::dvec3 const &Start, } } -std::vector editor_track::relay(chain const &Chain, std::vector const &Pieces) +std::vector editor_track::relay(chain const &Chain, std::vector const &Pieces, TTrack **Last) { std::vector created; auto const count{Chain.tracks.size()}; @@ -2943,6 +2943,8 @@ std::vector editor_track::relay(chain const &Chain, std::vector const &Paths, TTrack const &Style, std::string const &Name = {}); static TTrack *create_turntable(segment_data const &Path, TTrack const *Style, std::string const &Name); static void move_straights(std::vector const &Lines, std::vector> const &Ends); - static std::vector relay(chain const &Chain, std::vector const &Pieces); + static std::vector relay(chain const &Chain, std::vector const &Pieces, TTrack **Last = nullptr); static void retire(TTrack &Track); static std::string material_name(material_handle const Material);