Merge branch 'noqt'

felipesanches-svg
Marius Kintel 2013-04-12 00:13:09 -04:00
commit 60a351a5ee
21 changed files with 366 additions and 136 deletions

View File

@ -21,7 +21,6 @@ o Changed multmatrix floating-point output to improve dumptest portability
o Regression test auto-starts & stops Xvfb / Xvnc if on headless unix machine
o CGAL triangulation more lenient- enables partial rendering of 'bad' DXF data
o Fixes problem where local changes are overwritten on automatic reload when included files has changed.
o Non-ascii filenames are now allowed
OpenSCAD 2013.01
================

View File

@ -247,6 +247,7 @@ HEADERS += src/version_check.h \
src/Camera.h \
src/system-gl.h \
src/stl-utils.h \
src/boost-utils.h \
src/svg.h \
\
src/lodepng.h \
@ -291,6 +292,7 @@ SOURCES += src/version_check.cc \
src/progress.cc \
src/parsersettings.cc \
src/stl-utils.cc \
src/boost-utils.cc \
\
src/nodedumper.cc \
src/traverser.cc \

View File

@ -264,6 +264,12 @@ build_boost()
echo boost build failed
exit 1
fi
if [ "`ls $DEPLOYDIR/include/ | grep boost.[0-9]`" ]; then
if [ ! -e $DEPLOYDIR/include/boost ]; then
echo "boost is old, make a symlink to $DEPLOYDIR/include/boost & rerun"
exit 1
fi
fi
}
build_cgal()
@ -276,17 +282,26 @@ build_cgal()
echo "Building CGAL" $version "..."
cd $BASEDIR/src
rm -rf CGAL-$version
if [ ! -f CGAL-$version.tar.* ]; then
# 4.1
curl --insecure -O https://gforge.inria.fr/frs/download.php/31640/CGAL-$version.tar.bz2
# 4.0.2 curl --insecure -O https://gforge.inria.fr/frs/download.php/31174/CGAL-$version.tar.bz2
# 4.0 curl --insecure -O https://gforge.inria.fr/frs/download.php/30387/CGAL-$version.tar.gz #4.0
# 3.9 curl --insecure -O https://gforge.inria.fr/frs/download.php/29125/CGAL-$version.tar.gz #3.9
# 3.8 curl --insecure -O https://gforge.inria.fr/frs/download.php/28500/CGAL-$version.tar.gz
# 3.7 curl --insecure -O https://gforge.inria.fr/frs/download.php/27641/CGAL-$version.tar.gz
fi
tar xf CGAL-$version.tar.bz2
ver4_1="curl --insecure -O https://gforge.inria.fr/frs/download.php/31640/CGAL-4.1.tar.bz2"
ver4_0_2="curl --insecure -O https://gforge.inria.fr/frs/download.php/31174/CGAL-4.0.2.tar.bz2"
ver4_0="curl --insecure -O https://gforge.inria.fr/frs/download.php/30387/CGAL-4.0.tar.gz"
ver3_9="curl --insecure -O https://gforge.inria.fr/frs/download.php/29125/CGAL-3.9.tar.gz"
ver3_8="curl --insecure -O https://gforge.inria.fr/frs/download.php/28500/CGAL-3.8.tar.gz"
ver3_7="curl --insecure -O https://gforge.inria.fr/frs/download.php/27641/CGAL-3.7.tar.gz"
vernull="echo already downloaded..skipping"
download_cmd=ver`echo $version | sed s/"\."/"_"/`
if [ -e CGAL-$version.tar.gz ]; then download_cmd=vernull; fi
if [ -e CGAL-$version.tar.bz2 ]; then download_cmd=vernull; fi
`eval echo "$"$download_cmd`
if [ -e CGAL-$version.tar.gz ]; then tar xf CGAL-$version.tar.gz; fi
if [ -e CGAL-$version.tar.bz2 ]; then tar xf CGAL-$version.tar.bz2; fi
cd CGAL-$version
# older cmakes have buggy FindBoost that can result in
# finding the system libraries but OPENSCAD_LIBRARIES include paths
FINDBOOST_CMAKE=$OPENSCAD_SCRIPTDIR/../tests/FindBoost.cmake
cp $FINDBOOST_CMAKE ./cmake/modules/
mkdir bin
cd bin
rm -rf ./*
@ -295,10 +310,13 @@ build_cgal()
else
CGAL_BUILDTYPE="Debug"
fi
DEBUGBOOSTFIND=0 # for debugging FindBoost.cmake (not for debugging boost)
Boost_NO_SYSTEM_PATHS=1
if [ "`echo $2 | grep use-sys-libs`" ]; then
cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_ImageIO=OFF -DCMAKE_BUILD_TYPE=$CGAL_BUILDTYPE ..
cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_ImageIO=OFF -DCMAKE_BUILD_TYPE=$CGAL_BUILDTYPE -DBoost_DEBUG=$DEBUGBOOSTFIND ..
else
cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DGMP_INCLUDE_DIR=$DEPLOYDIR/include -DGMP_LIBRARIES=$DEPLOYDIR/lib/libgmp.so -DGMPXX_LIBRARIES=$DEPLOYDIR/lib/libgmpxx.so -DGMPXX_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_LIBRARIES=$DEPLOYDIR/lib/libmpfr.so -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_ImageIO=OFF -DBOOST_ROOT=$DEPLOYDIR -DBoost_USE_MULTITHREADED=false -DCMAKE_BUILD_TYPE=$CGAL_BUILD_TYPE ..
cmake -DCMAKE_INSTALL_PREFIX=$DEPLOYDIR -DGMP_INCLUDE_DIR=$DEPLOYDIR/include -DGMP_LIBRARIES=$DEPLOYDIR/lib/libgmp.so -DGMPXX_LIBRARIES=$DEPLOYDIR/lib/libgmpxx.so -DGMPXX_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_INCLUDE_DIR=$DEPLOYDIR/include -DMPFR_LIBRARIES=$DEPLOYDIR/lib/libmpfr.so -DWITH_CGAL_Qt3=OFF -DWITH_CGAL_Qt4=OFF -DWITH_CGAL_ImageIO=OFF -DBOOST_LIBRARYDIR=$DEPLOYDIR/lib -DBOOST_INCLUDEDIR=$DEPLOYDIR/include -DCMAKE_BUILD_TYPE=$CGAL_BUILD_TYPE -DBoost_DEBUG=$DEBUGBOOSTFIND -DBoost_NO_SYSTEM_PATHS=1 ..
fi
make -j$NUMCPU
make install
@ -459,7 +477,11 @@ build_eigen()
# the 'dirname' command installed
if [ "`command -v dirname`" ]; then
RUNDIR=$PWD
OPENSCAD_SCRIPTDIR=`dirname $0`
cd $OPENSCAD_SCRIPTDIR
OPENSCAD_SCRIPTDIR=$PWD
cd $RUNDIR
else
if [ ! -f openscad.pro ]; then
echo "Must be run from the OpenSCAD source root directory (dont have 'dirname')"
@ -513,7 +535,7 @@ if [ $1 ]; then
exit $?
fi
if [ $1 = "cgal" ]; then
build_cgal 4.0.2 use-sys-libs
build_cgal 4.1 use-sys-libs
exit $?
fi
if [ $1 = "opencsg" ]; then

168
src/boost-utils.cc Normal file
View File

@ -0,0 +1,168 @@
#include "boosty.h"
#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 = boosty::absolute(boostfs_normalize(path));
fs::path r = boosty::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 = boosty::absolute(path);
fs::path::iterator it = absPath.begin();
fs::path result = *it;
if (it!=absPath.end()) it++;
// Get canonical version of the existing part
for(;exists(result) && it != absPath.end(); ++it) {
result /= *it;
}
result = boosty::canonical(result.parent_path());
if (it!=absPath.begin()) 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 = boosty::absolute(boostfs_normalize(p));
fs::path abs_base = boosty::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;
}

13
src/boost-utils.h Normal file
View File

@ -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

View File

@ -10,9 +10,8 @@
versions of boost found on popular versions of linux, circa early 2012.
design
hope that the user is compiling with boost>1.46 + filesystem v3
if not, fall back to older deprecated functions, and rely on
testing to find bugs. implement the minimum needed by OpenSCAD and no more.
the boost filsystem changed around 1.46-1.48. we do a large #ifdef
based on boost version that wraps various functions appropriately.
in a few years, this file should be deleted as unnecessary.
see also
@ -27,7 +26,9 @@
#include <string>
#include <boost/version.hpp>
#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>
namespace fs = boost::filesystem;
#include "printutils.h"
namespace boosty {
@ -77,6 +78,67 @@ inline std::string extension_str( fs::path p)
#endif
#if BOOST_VERSION >= 104800
inline fs::path canonical( fs::path p, fs::path p2 )
{
return fs::canonical( p, p2 );
}
inline fs::path canonical( fs::path p )
{
return fs::canonical( p );
}
#else
inline fs::path canonical( fs::path p, fs::path p2 )
{
#if defined (__WIN32__) || defined(__APPLE__)
#error you should be using a newer version of boost on win/mac
#endif
// based on the code in boost
fs::path result;
if (p=="") p=p2;
std::string result_s;
std::vector<std::string> resultv, pieces;
std::vector<std::string>::iterator pi;
std::string tmps = boosty::stringy( p );
boost::split( pieces, tmps, boost::is_any_of("/") );
for ( pi = pieces.begin(); pi != pieces.end(); ++pi )
{
if (*pi == "..")
resultv.erase( resultv.end() );
else
resultv.push_back( *pi );
}
for ( pi = resultv.begin(); pi != resultv.end(); ++pi )
{
if ((*pi).length()>0) result_s = result_s + "/" + *pi;
}
result = fs::path( result_s );
if (fs::is_symlink(result))
{
PRINT("WARNING: canonical() wrapper can't do symlinks. rebuild openscad with boost >=1.48");
PRINT("WARNING: or don't use symbolic links");
}
return result;
}
inline fs::path canonical( fs::path p )
{
return canonical( p, fs::current_path() );
}
#endif
} // namespace
#endif

View File

@ -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(boostfs_uncomplete(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(boostfs_uncomplete(filename, fs::current_path()))));
}
}

View File

@ -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;
}
}
@ -188,6 +185,17 @@ static bool point_on_line(double *p1, double *p2, double *p3)
return true;
}
typedef std::pair<int,int> pair_ii;
inline void do_emplace( boost::unordered_multimap<int, pair_ii> &tri_by_atan2, int ai, const pair_ii &indexes)
{
#if BOOST_VERSION >= 104800
tri_by_atan2.emplace(ai, indexes);
#else
std::pair< int, pair_ii > tmp( ai, indexes );
tri_by_atan2.insert( tmp );
#endif
}
/*!
up: true if the polygon is facing in the normal direction (i.e. normal = [0,0,1])
rot: CLOCKWISE rotation around positive Z axis
@ -214,7 +222,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 +233,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 +242,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 +271,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 +285,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));
do_emplace( tri_by_atan2, ai, std::pair<int,int>(i, j) );
}
while (added_triangles)
{
@ -294,20 +302,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 +327,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 );
do_emplace(tri_by_atan2, 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));
do_emplace(tri_by_atan2, ai, std::pair<int,int>(i, m));
}
added_triangles = true;
}

View File

@ -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;

View File

@ -34,12 +34,14 @@
#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());
fs::path fnpath = fs::path( (std::string)filename );
fs::path fpath = boostfs_uncomplete(fnpath, fs::current_path());
stream << QuotedString(boosty::stringy( fpath ));
return stream;
}

View File

@ -179,28 +179,6 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
FIND_LIBRARY(COCOA_LIBRARY Cocoa REQUIRED)
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
@ -268,6 +246,8 @@ else()
inclusion(EIGEN_DIR EIGEN_INCLUDE_DIR)
endif()
# OpenGL
find_package(OpenGL REQUIRED)
# OpenCSG
if (NOT $ENV{OPENCSGDIR} STREQUAL "")
@ -444,6 +424,7 @@ set(CORE_SOURCES
../src/rotateextrude.cc
../src/printutils.cc
../src/progress.cc
../src/boost-utils.cc
${FLEX_OpenSCADlexer_OUTPUTS}
${BISON_OpenSCADparser_OUTPUTS})
@ -604,6 +585,10 @@ else()
set(GUI_BINPATH "${CMAKE_CURRENT_SOURCE_DIR}/../openscad")
endif()
if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/openscad")
set(GUI_BINPATH "${CMAKE_CURRENT_BINARY_DIR}/openscad")
endif()
if(EXISTS "${GUI_BINPATH}")
message(STATUS "Found OpenSCAD GUI binary: ${GUI_BINPATH}")
else()

View File

@ -40,7 +40,6 @@
#include "PolySetCGALEvaluator.h"
#include "CGALCache.h"
#include <QCoreApplication>
#ifndef _MSC_VER
#include <getopt.h>
#endif
@ -57,7 +56,6 @@ namespace po = boost::program_options;
std::string commandline_commands;
std::string currentdir;
QString examplesdir;
using std::string;
@ -124,13 +122,12 @@ int main(int argc, char **argv)
Builtins::instance()->initialize();
QCoreApplication app(argc, argv);
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());
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
Context root_ctx;
register_builtin(root_ctx);

View File

@ -43,7 +43,6 @@
#include "cgal.h"
#include "OffscreenView.h"
#include <QCoreApplication>
#ifndef _MSC_VER
#include <getopt.h>
#endif
@ -57,7 +56,6 @@ namespace fs = boost::filesystem;
std::string commandline_commands;
std::string currentdir;
QString examplesdir;
using std::string;
@ -97,13 +95,12 @@ int main(int argc, char **argv)
#endif
Builtins::instance()->initialize();
QCoreApplication app(argc, argv);
fs::path original_path = fs::current_path();
currentdir = boosty::stringy( fs::current_path() );
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
Context root_ctx;
register_builtin(root_ctx);

View File

@ -38,11 +38,6 @@
#include "CGALEvaluator.h"
#include "PolySetCGALEvaluator.h"
#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <QSet>
#include <QTextStream>
#ifndef _MSC_VER
#include <getopt.h>
#endif
@ -56,7 +51,6 @@ namespace fs = boost::filesystem;
std::string commandline_commands;
std::string currentdir;
QString examplesdir;
using std::string;
@ -83,13 +77,12 @@ int main(int argc, char **argv)
Builtins::instance()->initialize();
QCoreApplication app(argc, argv);
fs::path original_path = fs::current_path();
currentdir = boosty::stringy( fs::current_path() );
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
Context root_ctx;
register_builtin(root_ctx);

View File

@ -38,7 +38,6 @@
#include "CGALEvaluator.h"
#include "PolySetCGALEvaluator.h"
#include <QCoreApplication>
#ifndef _MSC_VER
#include <getopt.h>
#endif
@ -52,7 +51,6 @@ namespace fs = boost::filesystem;
std::string commandline_commands;
std::string currentdir;
QString examplesdir;
using std::string;
@ -76,13 +74,12 @@ int main(int argc, char **argv)
Builtins::instance()->initialize();
QCoreApplication app(argc, argv);
fs::path original_path = fs::current_path();
currentdir = boosty::stringy( fs::current_path() );
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
Context root_ctx;
register_builtin(root_ctx);

View File

@ -38,7 +38,6 @@
#include "Tree.h"
#include "csgterm.h"
#include <QCoreApplication>
#ifndef _MSC_VER
#include <getopt.h>
#endif
@ -53,7 +52,6 @@ namespace fs = boost::filesystem;
std::string commandline_commands;
std::string currentdir;
QString examplesdir;
using std::cout;
@ -71,13 +69,12 @@ int main(int argc, char **argv)
Builtins::instance()->initialize();
QCoreApplication app(argc, argv);
fs::path original_path = fs::current_path();
currentdir = boosty::stringy( fs::current_path() );
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
Context root_ctx;
register_builtin(root_ctx);

View File

@ -23,9 +23,6 @@
#include "csgtermnormalizer.h"
#include "OffscreenView.h"
#include <QCoreApplication>
#include <QTimer>
#include <sstream>
#include <vector>
@ -128,14 +125,12 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type)
Builtins::instance()->initialize();
QCoreApplication app(argc, argv);
fs::path original_path = fs::current_path();
std::string currentdir = boosty::stringy( fs::current_path() );
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
Context root_ctx;
register_builtin(root_ctx);

View File

@ -37,7 +37,6 @@
#include "builtin.h"
#include "Tree.h"
#include <QCoreApplication>
#ifndef _MSC_VER
#include <getopt.h>
#endif
@ -52,7 +51,6 @@ namespace fs = boost::filesystem;
std::string commandline_commands;
std::string currentdir;
QString examplesdir;
void csgTree(CSGTextCache &cache, const AbstractNode &root)
{
@ -75,13 +73,12 @@ int main(int argc, char **argv)
Builtins::instance()->initialize();
QCoreApplication app(argc, argv);
fs::path original_path = fs::current_path();
currentdir = boosty::stringy( fs::current_path() );
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
Context root_ctx;
register_builtin(root_ctx);

View File

@ -35,7 +35,6 @@
#include "builtin.h"
#include "Tree.h"
#include <QCoreApplication>
#ifndef _MSC_VER
#include <getopt.h>
#endif
@ -50,7 +49,6 @@ namespace fs = boost::filesystem;
std::string commandline_commands;
std::string currentdir;
QString examplesdir;
using std::string;
@ -81,13 +79,12 @@ int main(int argc, char **argv)
Builtins::instance()->initialize();
QCoreApplication app(argc, argv);
fs::path original_path = fs::current_path();
currentdir = boosty::stringy(fs::current_path());
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
Context root_ctx;
register_builtin(root_ctx);

View File

@ -34,7 +34,6 @@
#include "builtin.h"
#include "printutils.h"
#include <QCoreApplication>
#ifndef _MSC_VER
#include <getopt.h>
#endif
@ -49,7 +48,6 @@ namespace fs = boost::filesystem;
std::string commandline_commands;
std::string currentdir;
QString examplesdir;
using std::string;
@ -83,13 +81,12 @@ int main(int argc, char **argv)
Builtins::instance()->initialize();
QCoreApplication app(argc, argv);
fs::path original_path = fs::current_path();
currentdir = boosty::stringy( fs::current_path() );
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
Context root_ctx;
register_builtin(root_ctx);

View File

@ -35,7 +35,6 @@
#include "builtin.h"
#include "Tree.h"
#include <QCoreApplication>
#ifndef _MSC_VER
#include <getopt.h>
#endif
@ -50,7 +49,6 @@ namespace fs = boost::filesystem;
std::string commandline_commands;
std::string currentdir;
QString examplesdir;
using std::string;
@ -71,13 +69,12 @@ int main(int argc, char **argv)
Builtins::instance()->initialize();
QCoreApplication app(argc, argv);
fs::path original_path = fs::current_path();
currentdir = boosty::stringy( fs::current_path() );
parser_init(QCoreApplication::instance()->applicationDirPath().toStdString());
add_librarydir(boosty::stringy(fs::path(QCoreApplication::instance()->applicationDirPath().toStdString()) / "../libraries"));
parser_init(boosty::stringy(fs::path(argv[0]).branch_path()));
add_librarydir(boosty::stringy(fs::path(argv[0]).branch_path() / "../libraries"));
Context root_ctx;
register_builtin(root_ctx);