From bf9f025daf1b4df71ab5ca895acb3075f3f6b5c7 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 21 Mar 2010 19:47:43 +0000 Subject: [PATCH] Get the editor to generate S-bends --- src/Editor.cpp | 43 +++++++++++++++++++++++++++---------------- src/SBend.cpp | 11 +++++++++-- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/Editor.cpp b/src/Editor.cpp index cba0431..ce41b19 100644 --- a/src/Editor.cpp +++ b/src/Editor.cpp @@ -68,6 +68,7 @@ private: void drawDraggedCurve(int xLength, int yLength); bool canConnect(const Point& aFirstPoint, const Point& aSecondPoint) const; + bool canPlaceTrack(ITrackSegmentPtr track); void dragBoxBounds(int& xMin, int& xMax, int &yMin, int& yMax) const; void deleteObjects(); void plantTrees(); @@ -296,6 +297,24 @@ void Editor::drawDraggedStraight(const track::Direction& anAxis, int aLength) } } +// True if a track segment could be placed in its present location +bool Editor::canPlaceTrack(ITrackSegmentPtr track) +{ + vector > covered; + track->getEndpoints(covered); + track->getCovers(covered); + + for (vector >::iterator it = covered.begin(); + it != covered.end(); ++it) { + if (map->isValidTrack(*it)) { + warn() << "Cannot place curve here"; + return false; + } + } + + return true; +} + // Called when the user has finished dragging a rectangle for track // Connect the beginning and end up in the simplest way possible void Editor::drawDraggedTrack() @@ -390,8 +409,13 @@ void Editor::drawDraggedTrack() else if (ylen == 1) drawDraggedStraight(axis::X, xlen); else if (startDir == endDir) { - // An S-bend (not implemented) - warn() << "Sorry! No S-bends yet..."; + // An S-bend + ITrackSegmentPtr track = makeSBend(startDir, xlen, ylen); + const Point where = dragBegin; + track->setOrigin(where.x, where.y, map->heightAt(where)); + + if (canPlaceTrack(track)) + map->setTrackAt(where, track); } else { // Curves at the moment cannot be ellipses so lay track down @@ -465,20 +489,7 @@ void Editor::drawDraggedTrack() ITrackSegmentPtr track = makeCurvedTrack(startAngle, endAngle, xlen); track->setOrigin(where.x, where.y, map->heightAt(where)); - vector > exits; - track->getEndpoints(exits); - - bool ok = true; - for (vector >::iterator it = exits.begin(); - it != exits.end(); ++it) { - if (map->isValidTrack(*it)) { - warn() << "Cannot place curve here"; - ok = false; - break; - } - } - - if (ok) + if (canPlaceTrack(track)) map->setTrackAt(where, track); } } diff --git a/src/SBend.cpp b/src/SBend.cpp index 8e56e30..079d73e 100644 --- a/src/SBend.cpp +++ b/src/SBend.cpp @@ -54,12 +54,19 @@ private: int x_, y_; int xOffset, yOffset; float height; + track::Direction axis; }; SBend::SBend(track::Direction dir, int xoff, int yoff) - : x_(0), y_(0), xOffset(xoff), yOffset(yoff), height(0.0f) + : x_(0), y_(0), + xOffset(xoff), yOffset(yoff), + height(0.0f), + axis(dir) { - + assert(xoff > 0); + assert(yoff > 0); + + debug() << "SBend axis=" << axis << " xoff=" << xoff << " yoff=" << yoff; } void SBend::render() const -- 2.39.2