]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/svgexporter.cpp
Create track length map in ExtendTool constructor
[r2c2.git] / source / designer / svgexporter.cpp
index 62e869c368215ae7b1c590f02c7f227a0caed589..bb8cf4e88eb737e31a4f851f0097a5d17f73b66e 100644 (file)
@@ -36,7 +36,7 @@ void SvgExporter::save(const string &fn)
 
        Vector minp;
        Vector maxp;
-       const set<Track *> &tracks = layout.get_tracks();
+       const set<Track *> &tracks = layout.get_all<Track>();
        for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
        {
                xmlpp::Element *elem = root->add_child("g");
@@ -67,8 +67,8 @@ void SvgExporter::save(const string &fn)
 void SvgExporter::save_track(const Track &track, xmlpp::Element &group)
 {
        const Vector &pos = track.get_position();
-       float rot = track.get_rotation();
-       string transform = format("translate(%.3f %.3f) rotate(%.3f)", pos.x*1000, -pos.y*1000, -rot*180/M_PI);
+       const Angle &rot = track.get_rotation();
+       string transform = format("translate(%.3f %.3f) rotate(%.3f)", pos.x*1000, -pos.y*1000, -rot.degrees());
        group.set_attribute("transform", transform);
 
        const TrackType &type = track.get_type();
@@ -79,46 +79,41 @@ void SvgExporter::save_track(const Track &track, xmlpp::Element &group)
                xmlpp::Element *elem = group.add_child("path");
                elem->set_attribute("class", "endpoint");
 
-               float dx = -sin(i->dir)*gauge;
-               float dy = -cos(i->dir)*gauge;
+               Vector delta = rotated_vector(Vector(0, gauge, 0), i->dir);
 
                string data = format("M %.3f %.3f L %.3f %.3f",
-                       i->pos.x*1000+dx, -i->pos.y*1000+dy,
-                       i->pos.x*1000-dx, -i->pos.y*1000-dy);
+                       i->pos.x*1000+delta.x, -i->pos.y*1000-delta.y,
+                       i->pos.x*1000-delta.x, -i->pos.y*1000+delta.y);
                elem->set_attribute("d", data);
        }
 
        const vector<TrackPart> &parts = type.get_parts();
        for(vector<TrackPart>::const_iterator i=parts.begin(); i!=parts.end(); ++i)
        {
-               TrackPoint start = i->get_point(0);
-               TrackPoint end = i->get_point(i->get_length());
+               OrientedPoint start = i->get_point(0);
+               OrientedPoint end = i->get_point(i->get_length());
                if(i->is_curved())
                {
                        xmlpp::Element *elem = group.add_child("path");
                        elem->set_attribute("class", "rail");
 
-                       float cs = cos(start.dir);
-                       float ss = sin(start.dir);
-                       float ce = cos(end.dir);
-                       float se = sin(end.dir);
-                       float dx1 = -ss*(gauge+rail_width)*0.5;
-                       float dy1 = -cs*(gauge+rail_width)*0.5;
-                       float dx2 = -se*(gauge+rail_width)*0.5;
-                       float dy2 = -ce*(gauge+rail_width)*0.5;
+                       Vector delta1 = rotated_vector(Vector(0, (gauge+rail_width)*0.5, 0), start.rotation);
+                       Vector delta2 = rotated_vector(Vector(0, (gauge+rail_width)*0.5, 0), end.rotation);
                        // Largely an educated guess, but seems to be accurate enough
                        float clen = i->get_length()*1000/2.9;
+                       Vector ctrl1 = rotated_vector(Vector(clen, 0, 0), start.rotation);
+                       Vector ctrl2 = rotated_vector(Vector(clen, 0, 0), end.rotation);
 
                        string data = format("M %.3f %.3f C %.3f %.3f %.3f %.3f %.3f %.3f")
-                               (start.pos.x*1000+dx1)(-start.pos.y*1000+dy1)
-                               (start.pos.x*1000+dx1+cs*clen)(-start.pos.y*1000+dy1-ss*clen)
-                               (end.pos.x*1000+dx2-ce*clen)(-end.pos.y*1000+dy2+se*clen)
-                               (end.pos.x*1000+dx2)(-end.pos.y*1000+dy2).str();
+                               (start.position.x*1000+delta1.x)(-start.position.y*1000-delta1.y)
+                               (start.position.x*1000+delta1.x+ctrl1.x)(-start.position.y*1000-delta1.y-ctrl1.y)
+                               (end.position.x*1000+delta2.x-ctrl2.x)(-end.position.y*1000-delta2.y+ctrl2.y)
+                               (end.position.x*1000+delta2.x)(-end.position.y*1000-delta2.y).str();
                        data += format(" M %.3f %.3f C %.3f %.3f %.3f %.3f %.3f %.3f")
-                               (start.pos.x*1000-dx1)(-start.pos.y*1000-dy1)
-                               (start.pos.x*1000-dx1+cs*clen)(-start.pos.y*1000-dy1-ss*clen)
-                               (end.pos.x*1000-dx2-ce*clen)(-end.pos.y*1000-dy2+se*clen)
-                               (end.pos.x*1000-dx2)(-end.pos.y*1000-dy2).str();
+                               (start.position.x*1000-delta1.x)(-start.position.y*1000+delta1.y)
+                               (start.position.x*1000-delta1.x+ctrl1.x)(-start.position.y*1000+delta1.y-ctrl1.y)
+                               (end.position.x*1000-delta2.x-ctrl2.x)(-end.position.y*1000+delta2.y+ctrl2.y)
+                               (end.position.x*1000-delta2.x)(-end.position.y*1000+delta2.y).str();
                        elem->set_attribute("d", data);
                }
                else
@@ -126,32 +121,30 @@ void SvgExporter::save_track(const Track &track, xmlpp::Element &group)
                        xmlpp::Element *elem = group.add_child("path");
                        elem->set_attribute("class", "rail");
 
-                       float dx = -sin(start.dir)*(gauge+rail_width)*0.5;
-                       float dy = -cos(start.dir)*(gauge+rail_width)*0.5;
+                       Vector delta = rotated_vector(Vector(0, (gauge+rail_width)*0.5, 0), start.rotation);
 
                        string data = format("M %.3f %.3f L %.3f %.3f",
-                               start.pos.x*1000+dx, -start.pos.y*1000+dy,
-                               end.pos.x*1000+dx, -end.pos.y*1000+dy);
+                               start.position.x*1000+delta.x, -start.position.y*1000-delta.y,
+                               end.position.x*1000+delta.x, -end.position.y*1000-delta.y);
                        data += format(" M %.3f %.3f L %.3f %.3f",
-                               start.pos.x*1000-dx, -start.pos.y*1000-dy,
-                               end.pos.x*1000-dx, -end.pos.y*1000-dy);
+                               start.position.x*1000-delta.x, -start.position.y*1000+delta.y,
+                               end.position.x*1000-delta.x, -end.position.y*1000+delta.y);
                        elem->set_attribute("d", data);
                }
        }
 
-       TrackPoint label_pt = parts.front().get_point(parts.front().get_length()/2);
+       OrientedPoint label_pt = parts.front().get_point(parts.front().get_length()/2);
 
-       while(rot+label_pt.dir>M_PI/2)
-               label_pt.dir -= M_PI;
-       while(rot+label_pt.dir<-M_PI/2)
-               label_pt.dir += M_PI;
+       label_pt.rotation.wrap_with_base(-Angle::quarter_turn());
+       if(label_pt.rotation>Angle::quarter_turn())
+               label_pt.rotation -= Angle::half_turn();
 
-       label_pt.pos.x = label_pt.pos.x*1000+sin(label_pt.dir)*gauge*0.25;
-       label_pt.pos.y = label_pt.pos.y*1000-cos(label_pt.dir)*gauge*0.25;
+       label_pt.position *= 1000;
+       label_pt.position += rotated_vector(Vector(0, -gauge*0.25, 0), label_pt.rotation);
 
        xmlpp::Element *elem = group.add_child("text");
        elem->set_attribute("class", "artnr");
        elem->set_attribute("transform", format("translate(%.3f %.3f) rotate(%.3f)",
-               label_pt.pos.x, -label_pt.pos.y, -label_pt.dir*180/M_PI));
+               label_pt.position.x, -label_pt.position.y, -label_pt.rotation.degrees()));
        elem->set_child_text(track.get_type().get_article_number().str());
 }