X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fsvgexporter.cpp;h=bb8cf4e88eb737e31a4f851f0097a5d17f73b66e;hb=90015ce8f2b5d10135c3386c2771ee29395e3b37;hp=a9e13f8924db6470b02e27615af3b7cada4a91f3;hpb=1ff06c5bc46a677fa389ef86c6b26664368f1653;p=r2c2.git diff --git a/source/designer/svgexporter.cpp b/source/designer/svgexporter.cpp index a9e13f8..bb8cf4e 100644 --- a/source/designer/svgexporter.cpp +++ b/source/designer/svgexporter.cpp @@ -1,12 +1,5 @@ -/* $Id$ - -This file is part of R²C² -Copyright © 2010 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - #include -#include +#include #include "libr2c2/catalogue.h" #include "libr2c2/track.h" #include "libr2c2/tracktype.h" @@ -27,8 +20,8 @@ void SvgExporter::save(const string &fn) gauge = layout.get_catalogue().get_gauge()*1000; const Profile &rail_profile = layout.get_catalogue().get_rail_profile(); - const Point &rail_min = rail_profile.get_min_coords(); - const Point &rail_max = rail_profile.get_max_coords(); + const Vector &rail_min = rail_profile.get_min_coords(); + const Vector &rail_max = rail_profile.get_max_coords(); rail_width = (rail_max.x-rail_min.x)*1000; xmlpp::Document *doc = new xmlpp::Document; @@ -41,9 +34,9 @@ void SvgExporter::save(const string &fn) ".artnr { text-anchor: middle; font-size: %.3f; }\n", rail_width, rail_width, gauge*0.75)); - Point minp; - Point maxp; - const set &tracks = layout.get_tracks(); + Vector minp; + Vector maxp; + const set &tracks = layout.get_all(); for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) { xmlpp::Element *elem = root->add_child("g"); @@ -52,7 +45,7 @@ void SvgExporter::save(const string &fn) unsigned n_endpoints = (*i)->get_type().get_endpoints().size(); for(unsigned j=0; jget_endpoint_position(j); + Vector pos = (*i)->get_snap_node(j).position; if(i==tracks.begin() && j==0) minp = maxp = pos; else @@ -73,9 +66,9 @@ void SvgExporter::save(const string &fn) void SvgExporter::save_track(const Track &track, xmlpp::Element &group) { - const Point &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 Vector &pos = track.get_position(); + 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(); @@ -86,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 &parts = type.get_parts(); for(vector::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 @@ -133,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()); }