summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/boost-utils.cc42
-rw-r--r--src/boost-utils.h8
-rw-r--r--src/dxfdata.cc7
-rw-r--r--src/dxftess-glu.cc66
-rw-r--r--src/parsersettings.cc3
-rw-r--r--src/value.cc6
6 files changed, 92 insertions, 40 deletions
diff --git a/src/boost-utils.cc b/src/boost-utils.cc
new file mode 100644
index 0000000..f81917a
--- /dev/null
+++ b/src/boost-utils.cc
@@ -0,0 +1,42 @@
+#include "boost-utils.h"
+#include <stdio.h>
+#include <iostream>
+
+fs::path relativePath(const fs::path &path, const fs::path &relative_to)
+{
+ // create absolute paths
+ fs::path p = fs::absolute(path);
+ fs::path r = fs::absolute(relative_to);
+
+ // if root paths are different, return absolute path
+ if (p.root_path() != r.root_path())
+ return p;
+
+ // initialize relative path
+ fs::path result;
+
+ // find out where the two paths diverge
+ fs::path::const_iterator itr_path = p.begin();
+ fs::path::const_iterator itr_relative_to = r.begin();
+ while (*itr_path == *itr_relative_to && itr_path != p.end() && itr_relative_to != r.end()) {
+ ++itr_path;
+ ++itr_relative_to;
+ }
+
+ // add "../" for each remaining token in relative_to
+ if (itr_relative_to != r.end()) {
+ ++itr_relative_to;
+ while (itr_relative_to != r.end()) {
+ result /= "..";
+ ++itr_relative_to;
+ }
+ }
+
+ // add remaining path
+ while (itr_path != p.end()) {
+ result /= *itr_path;
+ ++itr_path;
+ }
+
+ return result;
+}
diff --git a/src/boost-utils.h b/src/boost-utils.h
new file mode 100644
index 0000000..c431857
--- /dev/null
+++ b/src/boost-utils.h
@@ -0,0 +1,8 @@
+#ifndef BOOST_UTILS_H_
+#define BOOST_UTILS_H_
+
+#include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+fs::path relativePath(const fs::path &path, const fs::path &relative_to);
+
+#endif
diff --git a/src/dxfdata.cc b/src/dxfdata.cc
index f34af51..be982ff 100644
--- a/src/dxfdata.cc
+++ b/src/dxfdata.cc
@@ -41,8 +41,9 @@
#include <sstream>
#include <map>
-#include <QDir>
#include "value.h"
+#include "boost-utils.h"
+#include "boosty.h"
/*! \class DxfData
@@ -389,10 +390,10 @@ DxfData::DxfData(double fn, double fs, double fa,
BOOST_FOREACH(const EntityList::value_type &i, unsupported_entities_list) {
if (layername.empty()) {
PRINTB("WARNING: Unsupported DXF Entity '%s' (%x) in %s.",
- i.first % i.second % QuotedString(QDir::current().relativeFilePath(QString::fromLocal8Bit(filename.c_str())).toLocal8Bit().constData()));
+ i.first % i.second % QuotedString(boosty::stringy(relativePath(filename, fs::current_path()))));
} else {
PRINTB("WARNING: Unsupported DXF Entity '%s' (%x) in layer '%s' of %s.",
- i.first % i.second % layername % QuotedString(QDir::current().relativeFilePath(QString::fromLocal8Bit(filename.c_str())).toLocal8Bit().constData()));
+ i.first % i.second % layername % QuotedString(boosty::stringy(relativePath(filename, fs::current_path()))));
}
}
diff --git a/src/dxftess-glu.cc b/src/dxftess-glu.cc
index 1a8bfa5..941dbed 100644
--- a/src/dxftess-glu.cc
+++ b/src/dxftess-glu.cc
@@ -3,14 +3,11 @@
#include "polyset.h"
#include "grid.h"
#include <stdio.h>
+#include <boost/foreach.hpp>
#include "system-gl.h"
#include "mathc99.h"
-#include <QVector>
-#include <QPair>
-#include <QHash>
-
#ifdef WIN32
# define STDCALL __stdcall
#else
@@ -31,7 +28,7 @@ struct tess_triangle {
static GLenum tess_type;
static int tess_count;
-static QVector<tess_triangle> tess_tri;
+static std::vector<tess_triangle> tess_tri;
static GLdouble *tess_p1, *tess_p2;
static void STDCALL tess_vertex(void *vertex_data)
@@ -48,7 +45,7 @@ static void STDCALL tess_vertex(void *vertex_data)
tess_p2 = p;
}
if (tess_count > 1) {
- tess_tri.append(tess_triangle(tess_p1, tess_p2, p));
+ tess_tri.push_back(tess_triangle(tess_p1, tess_p2, p));
tess_p2 = p;
}
}
@@ -61,9 +58,9 @@ static void STDCALL tess_vertex(void *vertex_data)
}
if (tess_count > 1) {
if (tess_count % 2 == 1) {
- tess_tri.append(tess_triangle(tess_p2, tess_p1, p));
+ tess_tri.push_back(tess_triangle(tess_p2, tess_p1, p));
} else {
- tess_tri.append(tess_triangle(tess_p1, tess_p2, p));
+ tess_tri.push_back(tess_triangle(tess_p1, tess_p2, p));
}
tess_p1 = tess_p2;
tess_p2 = p;
@@ -77,7 +74,7 @@ static void STDCALL tess_vertex(void *vertex_data)
tess_p2 = p;
}
if (tess_count == 2) {
- tess_tri.append(tess_triangle(tess_p1, tess_p2, p));
+ tess_tri.push_back(tess_triangle(tess_p1, tess_p2, p));
tess_count = -1;
}
}
@@ -214,7 +211,7 @@ void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, bool up, bool do_trian
tess_tri.clear();
- QList<tess_vdata> vl;
+ std::list<tess_vdata> vl;
gluTessBeginPolygon(tobj, NULL);
@@ -225,7 +222,7 @@ void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, bool up, bool do_trian
gluTessNormal(tobj, 0, 0, +1);
}
- Grid3d< QPair<int,int> > point_to_path(GRID_COARSE);
+ Grid3d< std::pair<int,int> > point_to_path(GRID_COARSE);
for (int i = 0; i < dxf.paths.size(); i++) {
if (!dxf.paths[i].is_closed)
@@ -234,12 +231,12 @@ void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, bool up, bool do_trian
for (int j = 1; j < dxf.paths[i].indices.size(); j++) {
point_to_path.data(dxf.points[dxf.paths[i].indices[j]][0],
dxf.points[dxf.paths[i].indices[j]][1],
- h) = QPair<int,int>(i, j);
- vl.append(tess_vdata());
- vl.last().v[0] = dxf.points[dxf.paths[i].indices[j]][0];
- vl.last().v[1] = dxf.points[dxf.paths[i].indices[j]][1];
- vl.last().v[2] = h;
- gluTessVertex(tobj, vl.last().v, vl.last().v);
+ h) = std::pair<int,int>(i, j);
+ vl.push_back(tess_vdata());
+ vl.back().v[0] = dxf.points[dxf.paths[i].indices[j]][0];
+ vl.back().v[1] = dxf.points[dxf.paths[i].indices[j]][1];
+ vl.back().v[2] = h;
+ gluTessVertex(tobj, vl.back().v, vl.back().v);
}
gluTessEndContour(tobj);
}
@@ -263,7 +260,7 @@ void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, bool up, bool do_trian
point_on_line(tess_tri[i].p[1], tess_tri[i].p[2], tess_tri[i].p[0]) ||
point_on_line(tess_tri[i].p[2], tess_tri[i].p[0], tess_tri[i].p[1])) {
// printf("DEBUG: Removed triangle\n");
- tess_tri.remove(i--);
+ tess_tri.erase(tess_tri.begin() + i--);
}
}
@@ -277,13 +274,13 @@ void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, bool up, bool do_trian
if (do_triangle_splitting)
{
bool added_triangles = true;
- typedef QPair<int,int> QPair_ii;
- QHash<int, QPair_ii> tri_by_atan2;
+ typedef std::pair<int,int> pair_ii;
+ boost::unordered_multimap<int, pair_ii> tri_by_atan2;
for (int i = 0; i < tess_tri.size(); i++)
for (int j = 0; j < 3; j++) {
int ai = (int)round(atan2(fabs(tess_tri[i].p[(j+1)%3][0] - tess_tri[i].p[j][0]),
fabs(tess_tri[i].p[(j+1)%3][1] - tess_tri[i].p[j][1])) / 0.001);
- tri_by_atan2.insertMulti(ai, QPair<int,int>(i, j));
+ tri_by_atan2.emplace(ai, std::pair<int,int>(i, j));
}
while (added_triangles)
{
@@ -294,20 +291,23 @@ void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, bool up, bool do_trian
for (int i = 0; i < tess_tri.size(); i++)
for (int k = 0; k < 3; k++)
{
- QHash<QPair_ii, QPair_ii> possible_neigh;
+ boost::unordered_map<pair_ii, pair_ii> possible_neigh;
int ai = (int)floor(atan2(fabs(tess_tri[i].p[(k+1)%3][0] - tess_tri[i].p[k][0]),
fabs(tess_tri[i].p[(k+1)%3][1] - tess_tri[i].p[k][1])) / 0.001 - 0.5);
for (int j = 0; j < 2; j++) {
- foreach (const QPair_ii &jl, tri_by_atan2.values(ai+j))
- if (i != jl.first)
- possible_neigh[jl] = jl;
+ for (boost::unordered_multimap<int, pair_ii>::iterator it = tri_by_atan2.find(ai+j);
+ it != tri_by_atan2.end();
+ it++) {
+ if (i != it->first) possible_neigh[it->second] = it->second;
+ }
}
#ifdef DEBUG_TRIANGLE_SPLITTING
printf("%d/%d: %d\n", i, k, possible_neigh.size());
#endif
- foreach (const QPair_ii &jl, possible_neigh) {
- int j = jl.first;
- for (int l = jl.second; l != (jl.second + 2) % 3; l = (l + 1) % 3)
+ typedef std::pair<pair_ii,pair_ii> ElemPair;
+ BOOST_FOREACH (const ElemPair &elem, possible_neigh) {
+ int j = elem.first.first;
+ for (int l = elem.first.second; l != (elem.first.second + 2) % 3; l = (l + 1) % 3)
if (point_on_line(tess_tri[i].p[k], tess_tri[j].p[l], tess_tri[i].p[(k+1)%3])) {
#ifdef DEBUG_TRIANGLE_SPLITTING
printf("%% %f %f %f %f %f %f [%d %d]\n",
@@ -316,18 +316,18 @@ void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, bool up, bool do_trian
tess_tri[i].p[(k+1)%3][0], tess_tri[i].p[(k+1)%3][1],
i, j);
#endif
- tess_tri.append(tess_triangle(tess_tri[j].p[l],
+ tess_tri.push_back(tess_triangle(tess_tri[j].p[l],
tess_tri[i].p[(k+1)%3], tess_tri[i].p[(k+2)%3]));
for (int m = 0; m < 2; m++) {
- int ai = (int)round(atan2(fabs(tess_tri.last().p[(m+1)%3][0] - tess_tri.last().p[m][0]),
- fabs(tess_tri.last().p[(m+1)%3][1] - tess_tri.last().p[m][1])) / 0.001 );
- tri_by_atan2.insertMulti(ai, QPair<int,int>(tess_tri.size()-1, m));
+ int ai = (int)round(atan2(fabs(tess_tri.back().p[(m+1)%3][0] - tess_tri.back().p[m][0]),
+ fabs(tess_tri.back().p[(m+1)%3][1] - tess_tri.back().p[m][1])) / 0.001 );
+ tri_by_atan2.emplace(ai, std::pair<int,int>(tess_tri.size()-1, m));
}
tess_tri[i].p[(k+1)%3] = tess_tri[j].p[l];
for (int m = 0; m < 2; m++) {
int ai = (int)round(atan2(fabs(tess_tri[i].p[(m+1)%3][0] - tess_tri[i].p[m][0]),
fabs(tess_tri[i].p[(m+1)%3][1] - tess_tri[i].p[m][1])) / 0.001 );
- tri_by_atan2.insertMulti(ai, QPair<int,int>(i, m));
+ tri_by_atan2.emplace(ai, std::pair<int,int>(i, m));
}
added_triangles = true;
}
diff --git a/src/parsersettings.cc b/src/parsersettings.cc
index a757ba1..8d82744 100644
--- a/src/parsersettings.cc
+++ b/src/parsersettings.cc
@@ -3,8 +3,9 @@
#include <boost/foreach.hpp>
#include "boosty.h"
#include <boost/algorithm/string.hpp>
-#include <qglobal.h> // Needed for Q_ defines - move the offending code somewhere else
+#ifdef __APPLE__
#include "CocoaUtils.h"
+#endif
namespace fs = boost::filesystem;
diff --git a/src/value.cc b/src/value.cc
index f14f826..bec803a 100644
--- a/src/value.cc
+++ b/src/value.cc
@@ -34,12 +34,12 @@
#include <boost/variant/apply_visitor.hpp>
#include <boost/variant/static_visitor.hpp>
#include <boost/format.hpp>
-
-#include <QtCore/QDir>
+#include "boost-utils.h"
+#include "boosty.h"
std::ostream &operator<<(std::ostream &stream, const Filename &filename)
{
- stream << QuotedString(QDir::current().relativeFilePath(QString::fromLocal8Bit(filename.c_str())).toLocal8Bit().constData());
+ stream << QuotedString(boosty::stringy(relativePath(filename, fs::current_path())));
return stream;
}
contact: Jan Huwald // Impressum