mirror of https://github.com/vitalif/openscad
Merge branch 'noqt' of ssh://ssh.github.com:443/openscad/openscad into noqt_tweaks
commit
c855e4d043
|
@ -247,6 +247,7 @@ HEADERS += src/version_check.h \
|
||||||
src/Camera.h \
|
src/Camera.h \
|
||||||
src/system-gl.h \
|
src/system-gl.h \
|
||||||
src/stl-utils.h \
|
src/stl-utils.h \
|
||||||
|
src/boost-utils.h \
|
||||||
src/svg.h \
|
src/svg.h \
|
||||||
\
|
\
|
||||||
src/lodepng.h \
|
src/lodepng.h \
|
||||||
|
@ -291,6 +292,7 @@ SOURCES += src/version_check.cc \
|
||||||
src/progress.cc \
|
src/progress.cc \
|
||||||
src/parsersettings.cc \
|
src/parsersettings.cc \
|
||||||
src/stl-utils.cc \
|
src/stl-utils.cc \
|
||||||
|
src/boost-utils.cc \
|
||||||
\
|
\
|
||||||
src/nodedumper.cc \
|
src/nodedumper.cc \
|
||||||
src/traverser.cc \
|
src/traverser.cc \
|
||||||
|
|
|
@ -0,0 +1,166 @@
|
||||||
|
#include "boost-utils.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
// If the given (absolute) path is relative to the relative_to path, return a new
|
||||||
|
// relative path. Will normalize the given path first
|
||||||
|
fs::path boostfs_relative_path(const fs::path &path, const fs::path &relative_to)
|
||||||
|
{
|
||||||
|
// create absolute paths
|
||||||
|
fs::path p = fs::absolute(boostfs_normalize(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Will normalize the given path, i.e. remove any redundant ".." path elements.
|
||||||
|
fs::path boostfs_normalize(const fs::path &path)
|
||||||
|
{
|
||||||
|
fs::path absPath = absolute(path);
|
||||||
|
fs::path::iterator it = absPath.begin();
|
||||||
|
fs::path result = *it++;
|
||||||
|
|
||||||
|
// Get canonical version of the existing part
|
||||||
|
for(;exists(result) && it != absPath.end(); ++it) {
|
||||||
|
result /= *it;
|
||||||
|
}
|
||||||
|
result = canonical(result.parent_path());
|
||||||
|
--it;
|
||||||
|
|
||||||
|
// For the rest remove ".." and "." in a path with no symlinks
|
||||||
|
for (; it != absPath.end(); ++it) {
|
||||||
|
// Just move back on ../
|
||||||
|
if (*it == "..") {
|
||||||
|
result = result.parent_path();
|
||||||
|
}
|
||||||
|
// Ignore "."
|
||||||
|
else if (*it != ".") {
|
||||||
|
// Just cat other path entries
|
||||||
|
result /= *it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* https://svn.boost.org/trac/boost/ticket/1976#comment:2
|
||||||
|
*
|
||||||
|
* "The idea: uncomplete(/foo/new, /foo/bar) => ../new
|
||||||
|
* The use case for this is any time you get a full path (from an open dialog, perhaps)
|
||||||
|
* and want to store a relative path so that the group of files can be moved to a different
|
||||||
|
* directory without breaking the paths. An IDE would be a simple example, so that the
|
||||||
|
* project file could be safely checked out of subversion."
|
||||||
|
*
|
||||||
|
* ALGORITHM:
|
||||||
|
* iterate path and base
|
||||||
|
* compare all elements so far of path and base
|
||||||
|
* whilst they are the same, no write to output
|
||||||
|
x2 * when they change, or one runs out:
|
||||||
|
* write to output, ../ times the number of remaining elements in base
|
||||||
|
* write to output, the remaining elements in path
|
||||||
|
*/
|
||||||
|
fs::path
|
||||||
|
boostfs_uncomplete(fs::path const p, fs::path const base)
|
||||||
|
{
|
||||||
|
if (p == base) return "./";
|
||||||
|
/*!! this breaks stuff if path is a filename rather than a directory,
|
||||||
|
which it most likely is... but then base shouldn't be a filename so... */
|
||||||
|
|
||||||
|
// create absolute paths
|
||||||
|
fs::path abs_p = fs::absolute(boostfs_normalize(p));
|
||||||
|
fs::path abs_base = fs::absolute(base);
|
||||||
|
|
||||||
|
fs::path from_path, from_base, output;
|
||||||
|
|
||||||
|
fs::path::iterator path_it = abs_p.begin(), path_end = abs_p.end();
|
||||||
|
fs::path::iterator base_it = abs_base.begin(), base_end = abs_base.end();
|
||||||
|
|
||||||
|
// check for emptiness
|
||||||
|
if ((path_it == path_end) || (base_it == base_end)) {
|
||||||
|
throw std::runtime_error("path or base was empty; couldn't generate relative path");
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
// drive letters are different; don't generate a relative path
|
||||||
|
if (*path_it != *base_it) return p;
|
||||||
|
|
||||||
|
// now advance past drive letters; relative paths should only go up
|
||||||
|
// to the root of the drive and not past it
|
||||||
|
++path_it, ++base_it;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Cache system-dependent dot, double-dot and slash strings
|
||||||
|
const std::string _dot = ".";
|
||||||
|
const std::string _dots = "..";
|
||||||
|
const std::string _sep = "/";
|
||||||
|
|
||||||
|
// iterate over path and base
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
// compare all elements so far of path and base to find greatest common root;
|
||||||
|
// when elements of path and base differ, or run out:
|
||||||
|
if ((path_it == path_end) || (base_it == base_end) || (*path_it != *base_it)) {
|
||||||
|
|
||||||
|
// write to output, ../ times the number of remaining elements in base;
|
||||||
|
// this is how far we've had to come down the tree from base to get to the common root
|
||||||
|
for (; base_it != base_end; ++base_it) {
|
||||||
|
if (*base_it == _dot)
|
||||||
|
continue;
|
||||||
|
else if (*base_it == _sep)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
output /= "../";
|
||||||
|
}
|
||||||
|
|
||||||
|
// write to output, the remaining elements in path;
|
||||||
|
// this is the path relative from the common root
|
||||||
|
fs::path::iterator path_it_start = path_it;
|
||||||
|
for (; path_it != path_end; ++path_it) {
|
||||||
|
if (path_it != path_it_start) output /= "/";
|
||||||
|
if (*path_it == _dot) continue;
|
||||||
|
if (*path_it == _sep) continue;
|
||||||
|
output /= *path_it;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add directory level to both paths and continue iteration
|
||||||
|
from_path /= fs::path(*path_it);
|
||||||
|
from_base /= fs::path(*base_it);
|
||||||
|
|
||||||
|
++path_it, ++base_it;
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
#ifndef BOOST_UTILS_H_
|
||||||
|
#define BOOST_UTILS_H_
|
||||||
|
|
||||||
|
#include <boost/filesystem.hpp>
|
||||||
|
namespace fs = boost::filesystem;
|
||||||
|
|
||||||
|
// FIXME: boostfs_relative_path() has been replaced by
|
||||||
|
// boostfs_uncomplete(), but kept around for now.
|
||||||
|
fs::path boostfs_relative_path(const fs::path &path, const fs::path &relative_to);
|
||||||
|
fs::path boostfs_normalize(const fs::path &path);
|
||||||
|
fs::path boostfs_uncomplete(fs::path const p, fs::path const base);
|
||||||
|
|
||||||
|
#endif
|
|
@ -41,8 +41,9 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include <QDir>
|
|
||||||
#include "value.h"
|
#include "value.h"
|
||||||
|
#include "boost-utils.h"
|
||||||
|
#include "boosty.h"
|
||||||
|
|
||||||
/*! \class DxfData
|
/*! \class DxfData
|
||||||
|
|
||||||
|
@ -389,10 +390,10 @@ DxfData::DxfData(double fn, double fs, double fa,
|
||||||
BOOST_FOREACH(const EntityList::value_type &i, unsupported_entities_list) {
|
BOOST_FOREACH(const EntityList::value_type &i, unsupported_entities_list) {
|
||||||
if (layername.empty()) {
|
if (layername.empty()) {
|
||||||
PRINTB("WARNING: Unsupported DXF Entity '%s' (%x) in %s.",
|
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(boostfs_uncomplete(filename, fs::current_path()))));
|
||||||
} else {
|
} else {
|
||||||
PRINTB("WARNING: Unsupported DXF Entity '%s' (%x) in layer '%s' of %s.",
|
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(boostfs_uncomplete(filename, fs::current_path()))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,14 +3,11 @@
|
||||||
#include "polyset.h"
|
#include "polyset.h"
|
||||||
#include "grid.h"
|
#include "grid.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <boost/foreach.hpp>
|
||||||
|
|
||||||
#include "system-gl.h"
|
#include "system-gl.h"
|
||||||
#include "mathc99.h"
|
#include "mathc99.h"
|
||||||
|
|
||||||
#include <QVector>
|
|
||||||
#include <QPair>
|
|
||||||
#include <QHash>
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
# define STDCALL __stdcall
|
# define STDCALL __stdcall
|
||||||
#else
|
#else
|
||||||
|
@ -31,7 +28,7 @@ struct tess_triangle {
|
||||||
|
|
||||||
static GLenum tess_type;
|
static GLenum tess_type;
|
||||||
static int tess_count;
|
static int tess_count;
|
||||||
static QVector<tess_triangle> tess_tri;
|
static std::vector<tess_triangle> tess_tri;
|
||||||
static GLdouble *tess_p1, *tess_p2;
|
static GLdouble *tess_p1, *tess_p2;
|
||||||
|
|
||||||
static void STDCALL tess_vertex(void *vertex_data)
|
static void STDCALL tess_vertex(void *vertex_data)
|
||||||
|
@ -48,7 +45,7 @@ static void STDCALL tess_vertex(void *vertex_data)
|
||||||
tess_p2 = p;
|
tess_p2 = p;
|
||||||
}
|
}
|
||||||
if (tess_count > 1) {
|
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;
|
tess_p2 = p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,9 +58,9 @@ static void STDCALL tess_vertex(void *vertex_data)
|
||||||
}
|
}
|
||||||
if (tess_count > 1) {
|
if (tess_count > 1) {
|
||||||
if (tess_count % 2 == 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 {
|
} 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_p1 = tess_p2;
|
||||||
tess_p2 = p;
|
tess_p2 = p;
|
||||||
|
@ -77,7 +74,7 @@ static void STDCALL tess_vertex(void *vertex_data)
|
||||||
tess_p2 = p;
|
tess_p2 = p;
|
||||||
}
|
}
|
||||||
if (tess_count == 2) {
|
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;
|
tess_count = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -214,7 +211,7 @@ void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, bool up, bool do_trian
|
||||||
|
|
||||||
|
|
||||||
tess_tri.clear();
|
tess_tri.clear();
|
||||||
QList<tess_vdata> vl;
|
std::list<tess_vdata> vl;
|
||||||
|
|
||||||
gluTessBeginPolygon(tobj, NULL);
|
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);
|
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++) {
|
for (int i = 0; i < dxf.paths.size(); i++) {
|
||||||
if (!dxf.paths[i].is_closed)
|
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++) {
|
for (int j = 1; j < dxf.paths[i].indices.size(); j++) {
|
||||||
point_to_path.data(dxf.points[dxf.paths[i].indices[j]][0],
|
point_to_path.data(dxf.points[dxf.paths[i].indices[j]][0],
|
||||||
dxf.points[dxf.paths[i].indices[j]][1],
|
dxf.points[dxf.paths[i].indices[j]][1],
|
||||||
h) = QPair<int,int>(i, j);
|
h) = std::pair<int,int>(i, j);
|
||||||
vl.append(tess_vdata());
|
vl.push_back(tess_vdata());
|
||||||
vl.last().v[0] = dxf.points[dxf.paths[i].indices[j]][0];
|
vl.back().v[0] = dxf.points[dxf.paths[i].indices[j]][0];
|
||||||
vl.last().v[1] = dxf.points[dxf.paths[i].indices[j]][1];
|
vl.back().v[1] = dxf.points[dxf.paths[i].indices[j]][1];
|
||||||
vl.last().v[2] = h;
|
vl.back().v[2] = h;
|
||||||
gluTessVertex(tobj, vl.last().v, vl.last().v);
|
gluTessVertex(tobj, vl.back().v, vl.back().v);
|
||||||
}
|
}
|
||||||
gluTessEndContour(tobj);
|
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[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])) {
|
point_on_line(tess_tri[i].p[2], tess_tri[i].p[0], tess_tri[i].p[1])) {
|
||||||
// printf("DEBUG: Removed triangle\n");
|
// 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)
|
if (do_triangle_splitting)
|
||||||
{
|
{
|
||||||
bool added_triangles = true;
|
bool added_triangles = true;
|
||||||
typedef QPair<int,int> QPair_ii;
|
typedef std::pair<int,int> pair_ii;
|
||||||
QHash<int, QPair_ii> tri_by_atan2;
|
boost::unordered_multimap<int, pair_ii> tri_by_atan2;
|
||||||
for (int i = 0; i < tess_tri.size(); i++)
|
for (int i = 0; i < tess_tri.size(); i++)
|
||||||
for (int j = 0; j < 3; j++) {
|
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]),
|
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);
|
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)
|
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 i = 0; i < tess_tri.size(); i++)
|
||||||
for (int k = 0; k < 3; k++)
|
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]),
|
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);
|
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++) {
|
for (int j = 0; j < 2; j++) {
|
||||||
foreach (const QPair_ii &jl, tri_by_atan2.values(ai+j))
|
for (boost::unordered_multimap<int, pair_ii>::iterator it = tri_by_atan2.find(ai+j);
|
||||||
if (i != jl.first)
|
it != tri_by_atan2.end();
|
||||||
possible_neigh[jl] = jl;
|
it++) {
|
||||||
|
if (i != it->first) possible_neigh[it->second] = it->second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#ifdef DEBUG_TRIANGLE_SPLITTING
|
#ifdef DEBUG_TRIANGLE_SPLITTING
|
||||||
printf("%d/%d: %d\n", i, k, possible_neigh.size());
|
printf("%d/%d: %d\n", i, k, possible_neigh.size());
|
||||||
#endif
|
#endif
|
||||||
foreach (const QPair_ii &jl, possible_neigh) {
|
typedef std::pair<pair_ii,pair_ii> ElemPair;
|
||||||
int j = jl.first;
|
BOOST_FOREACH (const ElemPair &elem, possible_neigh) {
|
||||||
for (int l = jl.second; l != (jl.second + 2) % 3; l = (l + 1) % 3)
|
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])) {
|
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
|
#ifdef DEBUG_TRIANGLE_SPLITTING
|
||||||
printf("%% %f %f %f %f %f %f [%d %d]\n",
|
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],
|
tess_tri[i].p[(k+1)%3][0], tess_tri[i].p[(k+1)%3][1],
|
||||||
i, j);
|
i, j);
|
||||||
#endif
|
#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]));
|
tess_tri[i].p[(k+1)%3], tess_tri[i].p[(k+2)%3]));
|
||||||
for (int m = 0; m < 2; m++) {
|
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]),
|
int ai = (int)round(atan2(fabs(tess_tri.back().p[(m+1)%3][0] - tess_tri.back().p[m][0]),
|
||||||
fabs(tess_tri.last().p[(m+1)%3][1] - tess_tri.last().p[m][1])) / 0.001 );
|
fabs(tess_tri.back().p[(m+1)%3][1] - tess_tri.back().p[m][1])) / 0.001 );
|
||||||
tri_by_atan2.insertMulti(ai, QPair<int,int>(tess_tri.size()-1, m));
|
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];
|
tess_tri[i].p[(k+1)%3] = tess_tri[j].p[l];
|
||||||
for (int m = 0; m < 2; m++) {
|
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]),
|
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 );
|
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;
|
added_triangles = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,9 @@
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
#include "boosty.h"
|
#include "boosty.h"
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <qglobal.h> // Needed for Q_ defines - move the offending code somewhere else
|
#ifdef __APPLE__
|
||||||
#include "CocoaUtils.h"
|
#include "CocoaUtils.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace fs = boost::filesystem;
|
namespace fs = boost::filesystem;
|
||||||
|
|
||||||
|
|
|
@ -34,12 +34,12 @@
|
||||||
#include <boost/variant/apply_visitor.hpp>
|
#include <boost/variant/apply_visitor.hpp>
|
||||||
#include <boost/variant/static_visitor.hpp>
|
#include <boost/variant/static_visitor.hpp>
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
|
#include "boost-utils.h"
|
||||||
#include <QtCore/QDir>
|
#include "boosty.h"
|
||||||
|
|
||||||
std::ostream &operator<<(std::ostream &stream, const Filename &filename)
|
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(boostfs_uncomplete(filename, fs::current_path())));
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -179,28 +179,6 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
FIND_LIBRARY(COCOA_LIBRARY Cocoa REQUIRED)
|
FIND_LIBRARY(COCOA_LIBRARY Cocoa REQUIRED)
|
||||||
endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
|
|
||||||
# Qt4
|
|
||||||
|
|
||||||
set(CMAKE_INCLUDE_DIRECTORIES_BEFORE ON)
|
|
||||||
find_package(OpenGL REQUIRED)
|
|
||||||
if ( "${OPENGL_glu_LIBRARY}" MATCHES "NOTFOUND" )
|
|
||||||
# GLU and Mesa split in late 2012 so some systems dont have GLU
|
|
||||||
find_library(OPENGL_glu_LIBRARY GLU HINTS "$ENV{OPENSCAD_LIBRARIES}/lib" REQUIRED)
|
|
||||||
set( OPENGL_LIBRARY ${OPENGL_glu_LIBRARY} ${OPENGL_LIBRARY} )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (MINGW_CROSS_ENV_DIR)
|
|
||||||
mingw_cross_env_find_qt()
|
|
||||||
mingw_cross_env_info()
|
|
||||||
include_directories( ${QT_INCLUDE_DIRS} )
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${QT_CFLAGS_OTHER}")
|
|
||||||
else()
|
|
||||||
find_package(Qt4 COMPONENTS QtCore REQUIRED)
|
|
||||||
include(${QT_USE_FILE})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(CMAKE_INCLUDE_DIRECTORIES_BEFORE OFF)
|
|
||||||
|
|
||||||
|
|
||||||
# Eigen
|
# Eigen
|
||||||
|
|
||||||
|
@ -268,6 +246,8 @@ else()
|
||||||
inclusion(EIGEN_DIR EIGEN_INCLUDE_DIR)
|
inclusion(EIGEN_DIR EIGEN_INCLUDE_DIR)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# OpenGL
|
||||||
|
find_package(OpenGL REQUIRED)
|
||||||
|
|
||||||
# OpenCSG
|
# OpenCSG
|
||||||
if (NOT $ENV{OPENCSGDIR} STREQUAL "")
|
if (NOT $ENV{OPENCSGDIR} STREQUAL "")
|
||||||
|
@ -444,6 +424,7 @@ set(CORE_SOURCES
|
||||||
../src/rotateextrude.cc
|
../src/rotateextrude.cc
|
||||||
../src/printutils.cc
|
../src/printutils.cc
|
||||||
../src/progress.cc
|
../src/progress.cc
|
||||||
|
../src/boost-utils.cc
|
||||||
${FLEX_OpenSCADlexer_OUTPUTS}
|
${FLEX_OpenSCADlexer_OUTPUTS}
|
||||||
${BISON_OpenSCADparser_OUTPUTS})
|
${BISON_OpenSCADparser_OUTPUTS})
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,6 @@
|
||||||
#include "PolySetCGALEvaluator.h"
|
#include "PolySetCGALEvaluator.h"
|
||||||
#include "CGALCache.h"
|
#include "CGALCache.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -57,7 +56,6 @@ namespace po = boost::program_options;
|
||||||
|
|
||||||
std::string commandline_commands;
|
std::string commandline_commands;
|
||||||
std::string currentdir;
|
std::string currentdir;
|
||||||
QString examplesdir;
|
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
|
|
||||||
|
@ -124,13 +122,12 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
Builtins::instance()->initialize();
|
Builtins::instance()->initialize();
|
||||||
|
|
||||||
QCoreApplication app(argc, argv);
|
|
||||||
fs::path original_path = fs::current_path();
|
fs::path original_path = fs::current_path();
|
||||||
|
|
||||||
currentdir = boosty::stringy(fs::current_path());
|
currentdir = boosty::stringy(fs::current_path());
|
||||||
|
|
||||||
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
|
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
|
||||||
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
|
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
|
||||||
|
|
||||||
Context root_ctx;
|
Context root_ctx;
|
||||||
register_builtin(root_ctx);
|
register_builtin(root_ctx);
|
||||||
|
|
|
@ -43,7 +43,6 @@
|
||||||
#include "cgal.h"
|
#include "cgal.h"
|
||||||
#include "OffscreenView.h"
|
#include "OffscreenView.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -57,7 +56,6 @@ namespace fs = boost::filesystem;
|
||||||
|
|
||||||
std::string commandline_commands;
|
std::string commandline_commands;
|
||||||
std::string currentdir;
|
std::string currentdir;
|
||||||
QString examplesdir;
|
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
|
|
||||||
|
@ -97,13 +95,12 @@ int main(int argc, char **argv)
|
||||||
#endif
|
#endif
|
||||||
Builtins::instance()->initialize();
|
Builtins::instance()->initialize();
|
||||||
|
|
||||||
QCoreApplication app(argc, argv);
|
|
||||||
fs::path original_path = fs::current_path();
|
fs::path original_path = fs::current_path();
|
||||||
|
|
||||||
currentdir = boosty::stringy( fs::current_path() );
|
currentdir = boosty::stringy( fs::current_path() );
|
||||||
|
|
||||||
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
|
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
|
||||||
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
|
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
|
||||||
|
|
||||||
Context root_ctx;
|
Context root_ctx;
|
||||||
register_builtin(root_ctx);
|
register_builtin(root_ctx);
|
||||||
|
|
|
@ -38,11 +38,6 @@
|
||||||
#include "CGALEvaluator.h"
|
#include "CGALEvaluator.h"
|
||||||
#include "PolySetCGALEvaluator.h"
|
#include "PolySetCGALEvaluator.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QSet>
|
|
||||||
#include <QTextStream>
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -56,7 +51,6 @@ namespace fs = boost::filesystem;
|
||||||
|
|
||||||
std::string commandline_commands;
|
std::string commandline_commands;
|
||||||
std::string currentdir;
|
std::string currentdir;
|
||||||
QString examplesdir;
|
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
|
|
||||||
|
@ -83,13 +77,12 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
Builtins::instance()->initialize();
|
Builtins::instance()->initialize();
|
||||||
|
|
||||||
QCoreApplication app(argc, argv);
|
|
||||||
fs::path original_path = fs::current_path();
|
fs::path original_path = fs::current_path();
|
||||||
|
|
||||||
currentdir = boosty::stringy( fs::current_path() );
|
currentdir = boosty::stringy( fs::current_path() );
|
||||||
|
|
||||||
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
|
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
|
||||||
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
|
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
|
||||||
|
|
||||||
Context root_ctx;
|
Context root_ctx;
|
||||||
register_builtin(root_ctx);
|
register_builtin(root_ctx);
|
||||||
|
|
|
@ -38,7 +38,6 @@
|
||||||
#include "CGALEvaluator.h"
|
#include "CGALEvaluator.h"
|
||||||
#include "PolySetCGALEvaluator.h"
|
#include "PolySetCGALEvaluator.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -52,7 +51,6 @@ namespace fs = boost::filesystem;
|
||||||
|
|
||||||
std::string commandline_commands;
|
std::string commandline_commands;
|
||||||
std::string currentdir;
|
std::string currentdir;
|
||||||
QString examplesdir;
|
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
|
|
||||||
|
@ -76,13 +74,12 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
Builtins::instance()->initialize();
|
Builtins::instance()->initialize();
|
||||||
|
|
||||||
QCoreApplication app(argc, argv);
|
|
||||||
fs::path original_path = fs::current_path();
|
fs::path original_path = fs::current_path();
|
||||||
|
|
||||||
currentdir = boosty::stringy( fs::current_path() );
|
currentdir = boosty::stringy( fs::current_path() );
|
||||||
|
|
||||||
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
|
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
|
||||||
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
|
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
|
||||||
|
|
||||||
Context root_ctx;
|
Context root_ctx;
|
||||||
register_builtin(root_ctx);
|
register_builtin(root_ctx);
|
||||||
|
|
|
@ -38,7 +38,6 @@
|
||||||
#include "Tree.h"
|
#include "Tree.h"
|
||||||
#include "csgterm.h"
|
#include "csgterm.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -53,7 +52,6 @@ namespace fs = boost::filesystem;
|
||||||
|
|
||||||
std::string commandline_commands;
|
std::string commandline_commands;
|
||||||
std::string currentdir;
|
std::string currentdir;
|
||||||
QString examplesdir;
|
|
||||||
|
|
||||||
using std::cout;
|
using std::cout;
|
||||||
|
|
||||||
|
@ -71,13 +69,12 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
Builtins::instance()->initialize();
|
Builtins::instance()->initialize();
|
||||||
|
|
||||||
QCoreApplication app(argc, argv);
|
|
||||||
fs::path original_path = fs::current_path();
|
fs::path original_path = fs::current_path();
|
||||||
|
|
||||||
currentdir = boosty::stringy( fs::current_path() );
|
currentdir = boosty::stringy( fs::current_path() );
|
||||||
|
|
||||||
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
|
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
|
||||||
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
|
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
|
||||||
|
|
||||||
Context root_ctx;
|
Context root_ctx;
|
||||||
register_builtin(root_ctx);
|
register_builtin(root_ctx);
|
||||||
|
|
|
@ -23,9 +23,6 @@
|
||||||
#include "csgtermnormalizer.h"
|
#include "csgtermnormalizer.h"
|
||||||
#include "OffscreenView.h"
|
#include "OffscreenView.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QTimer>
|
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -128,14 +125,12 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type)
|
||||||
|
|
||||||
Builtins::instance()->initialize();
|
Builtins::instance()->initialize();
|
||||||
|
|
||||||
QCoreApplication app(argc, argv);
|
|
||||||
|
|
||||||
fs::path original_path = fs::current_path();
|
fs::path original_path = fs::current_path();
|
||||||
|
|
||||||
std::string currentdir = boosty::stringy( fs::current_path() );
|
std::string currentdir = boosty::stringy( fs::current_path() );
|
||||||
|
|
||||||
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
|
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
|
||||||
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
|
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
|
||||||
|
|
||||||
Context root_ctx;
|
Context root_ctx;
|
||||||
register_builtin(root_ctx);
|
register_builtin(root_ctx);
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "Tree.h"
|
#include "Tree.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -52,7 +51,6 @@ namespace fs = boost::filesystem;
|
||||||
|
|
||||||
std::string commandline_commands;
|
std::string commandline_commands;
|
||||||
std::string currentdir;
|
std::string currentdir;
|
||||||
QString examplesdir;
|
|
||||||
|
|
||||||
void csgTree(CSGTextCache &cache, const AbstractNode &root)
|
void csgTree(CSGTextCache &cache, const AbstractNode &root)
|
||||||
{
|
{
|
||||||
|
@ -75,13 +73,12 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
Builtins::instance()->initialize();
|
Builtins::instance()->initialize();
|
||||||
|
|
||||||
QCoreApplication app(argc, argv);
|
|
||||||
fs::path original_path = fs::current_path();
|
fs::path original_path = fs::current_path();
|
||||||
|
|
||||||
currentdir = boosty::stringy( fs::current_path() );
|
currentdir = boosty::stringy( fs::current_path() );
|
||||||
|
|
||||||
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
|
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
|
||||||
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
|
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
|
||||||
|
|
||||||
Context root_ctx;
|
Context root_ctx;
|
||||||
register_builtin(root_ctx);
|
register_builtin(root_ctx);
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "Tree.h"
|
#include "Tree.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -50,7 +49,6 @@ namespace fs = boost::filesystem;
|
||||||
|
|
||||||
std::string commandline_commands;
|
std::string commandline_commands;
|
||||||
std::string currentdir;
|
std::string currentdir;
|
||||||
QString examplesdir;
|
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
|
|
||||||
|
@ -81,13 +79,12 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
Builtins::instance()->initialize();
|
Builtins::instance()->initialize();
|
||||||
|
|
||||||
QCoreApplication app(argc, argv);
|
|
||||||
fs::path original_path = fs::current_path();
|
fs::path original_path = fs::current_path();
|
||||||
|
|
||||||
currentdir = boosty::stringy(fs::current_path());
|
currentdir = boosty::stringy(fs::current_path());
|
||||||
|
|
||||||
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
|
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
|
||||||
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
|
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
|
||||||
|
|
||||||
Context root_ctx;
|
Context root_ctx;
|
||||||
register_builtin(root_ctx);
|
register_builtin(root_ctx);
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "printutils.h"
|
#include "printutils.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -49,7 +48,6 @@ namespace fs = boost::filesystem;
|
||||||
|
|
||||||
std::string commandline_commands;
|
std::string commandline_commands;
|
||||||
std::string currentdir;
|
std::string currentdir;
|
||||||
QString examplesdir;
|
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
|
|
||||||
|
@ -83,13 +81,12 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
Builtins::instance()->initialize();
|
Builtins::instance()->initialize();
|
||||||
|
|
||||||
QCoreApplication app(argc, argv);
|
|
||||||
fs::path original_path = fs::current_path();
|
fs::path original_path = fs::current_path();
|
||||||
|
|
||||||
currentdir = boosty::stringy( fs::current_path() );
|
currentdir = boosty::stringy( fs::current_path() );
|
||||||
|
|
||||||
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
|
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
|
||||||
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
|
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
|
||||||
|
|
||||||
Context root_ctx;
|
Context root_ctx;
|
||||||
register_builtin(root_ctx);
|
register_builtin(root_ctx);
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "Tree.h"
|
#include "Tree.h"
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -50,7 +49,6 @@ namespace fs = boost::filesystem;
|
||||||
|
|
||||||
std::string commandline_commands;
|
std::string commandline_commands;
|
||||||
std::string currentdir;
|
std::string currentdir;
|
||||||
QString examplesdir;
|
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
|
|
||||||
|
@ -71,13 +69,12 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
Builtins::instance()->initialize();
|
Builtins::instance()->initialize();
|
||||||
|
|
||||||
QCoreApplication app(argc, argv);
|
|
||||||
fs::path original_path = fs::current_path();
|
fs::path original_path = fs::current_path();
|
||||||
|
|
||||||
currentdir = boosty::stringy( fs::current_path() );
|
currentdir = boosty::stringy( fs::current_path() );
|
||||||
|
|
||||||
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
|
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
|
||||||
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
|
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
|
||||||
|
|
||||||
Context root_ctx;
|
Context root_ctx;
|
||||||
register_builtin(root_ctx);
|
register_builtin(root_ctx);
|
||||||
|
|
Loading…
Reference in New Issue