summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordon bright <hugh.m.bright@gmail.com>2013-01-31 02:58:34 (GMT)
committerdon bright <hugh.m.bright@gmail.com>2013-01-31 02:58:34 (GMT)
commit997a0afac3f9b3a7aa2c4a8d351c3697bc91f7aa (patch)
tree3b3816d1557746f5f2e3e86a9239821472012024 /src
parentd0de384a7e1642d09726579fdd75f1588cfaada7 (diff)
parentaf0658a8fe441ebb0eb3d238e7055fd592343605 (diff)
Merge branch 'master' and fix bugs
Conflicts: src/openscad.cc tests/CMakeLists.txt
Diffstat (limited to 'src')
-rw-r--r--src/AboutDialog.html2
-rw-r--r--src/Preferences.cc8
-rw-r--r--src/dxftess-cgal.cc10
-rw-r--r--src/func.cc8
-rw-r--r--src/import.cc17
-rw-r--r--src/mainwin.cc17
-rw-r--r--src/openscad.cc6
-rw-r--r--src/svg.cc3
-rw-r--r--src/winconsole.c84
9 files changed, 141 insertions, 14 deletions
diff --git a/src/AboutDialog.html b/src/AboutDialog.html
index 34e8127..6203e83 100644
--- a/src/AboutDialog.html
+++ b/src/AboutDialog.html
@@ -115,7 +115,7 @@ Brett Sutton, hmnapier, Eero af Heurlin, caliston, 5263, ghost, 42loop,
uniqx, Michael Thomson, Michael Ivko, Pierre Doucet, myglc2, Alan Cox,
Peter Falke, Michael Ambrus, Gordon Wrigley, Ed Nisley, Stony Smith,
Pasca Andrei, David Goodenough, William A Adams, mrrobinson, 1i7,
-benhowes ... and many others
+benhowes, 5263, Craig Trader, Miro HronĨok, ... and many others
<p>
<b>Hosting &amp; resources</b>
diff --git a/src/Preferences.cc b/src/Preferences.cc
index e70a2a1..ec66094 100644
--- a/src/Preferences.cc
+++ b/src/Preferences.cc
@@ -30,7 +30,9 @@
#include <QKeyEvent>
#include <QSettings>
#include "PolySetCache.h"
+#ifdef ENABLE_CGAL
#include "CGALCache.h"
+#endif
Preferences *Preferences::instance = NULL;
@@ -75,7 +77,9 @@ Preferences::Preferences(QWidget *parent) : QMainWindow(parent)
this->defaultmap["advanced/opencsg_show_warning"] = true;
this->defaultmap["advanced/enable_opencsg_opengl1x"] = true;
this->defaultmap["advanced/polysetCacheSize"] = uint(PolySetCache::instance()->maxSize());
+#ifdef ENABLE_CGAL
this->defaultmap["advanced/cgalCacheSize"] = uint(CGALCache::instance()->maxSize());
+#endif
this->defaultmap["advanced/openCSGLimit"] = 2000;
this->defaultmap["advanced/forceGoldfeather"] = false;
@@ -126,7 +130,9 @@ Preferences::Preferences(QWidget *parent) : QMainWindow(parent)
// Advanced pane
QValidator *validator = new QIntValidator(this);
+#ifdef ENABLE_CGAL
this->cgalCacheSizeEdit->setValidator(validator);
+#endif
this->polysetCacheSizeEdit->setValidator(validator);
this->opencsgLimitEdit->setValidator(validator);
@@ -198,7 +204,9 @@ void Preferences::on_cgalCacheSizeEdit_textChanged(const QString &text)
{
QSettings settings;
settings.setValue("advanced/cgalCacheSize", text);
+#ifdef ENABLE_CGAL
CGALCache::instance()->setMaxSize(text.toULong());
+#endif
}
void Preferences::on_polysetCacheSizeEdit_textChanged(const QString &text)
diff --git a/src/dxftess-cgal.cc b/src/dxftess-cgal.cc
index d01c1d5..0197473 100644
--- a/src/dxftess-cgal.cc
+++ b/src/dxftess-cgal.cc
@@ -24,7 +24,7 @@ typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Triangulation_vertex_base_2<K> Vb;
typedef CGAL::Delaunay_mesh_face_base_2<K> Fb;
typedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;
-typedef CGAL::Constrained_Delaunay_triangulation_2<K, Tds> CDT;
+typedef CGAL::Constrained_Delaunay_triangulation_2<K, Tds, CGAL::Exact_predicates_tag > CDT;
//typedef CGAL::Delaunay_mesh_criteria_2<CDT> Criteria;
typedef CDT::Vertex_handle Vertex_handle;
@@ -109,6 +109,7 @@ void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, bool up, bool /* do_tr
Grid2d<point_info_t> point_info(GRID_FINE);
boost::unordered_map<edge_t,int> edge_to_triangle;
boost::unordered_map<edge_t,int> edge_to_path;
+ int duplicate_vertices = 0;
CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION);
try {
@@ -131,7 +132,7 @@ void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, bool up, bool /* do_tr
// ..maybe it would be better to assert here. But this would
// break compatibility with the glu tesselator that handled such
// cases just fine.
- PRINT( "WARNING: Duplicate vertex found during Tessellation. Render may be incorrect." );
+ duplicate_vertices++;
continue;
}
@@ -165,6 +166,11 @@ void dxf_tesselate(PolySet *ps, DxfData &dxf, double rot, bool up, bool /* do_tr
}
}
+ if ( duplicate_vertices > 0 ) {
+ PRINT( "WARNING: Duplicate vertices and/or intersecting lines found during DXF Tessellation." );
+ PRINT( "WARNING: Modify the polygon to be a Simple Polygon. Render is incomplete." );
+ }
+
}
catch (const CGAL::Assertion_exception &e) {
PRINTB("CGAL error in dxf_tesselate(): %s", e.what());
diff --git a/src/func.cc b/src/func.cc
index 5dcb3e9..791e957 100644
--- a/src/func.cc
+++ b/src/func.cc
@@ -43,7 +43,7 @@
*/
#include <boost/random/mersenne_twister.hpp>
-#include <boost/random/uniform_real_distribution.hpp>
+#include <boost/random/uniform_real.hpp>
#ifdef __WIN32__
#include <process.h>
@@ -54,8 +54,8 @@ int process_id = _getpid();
int process_id = getpid();
#endif
-boost::random::mt19937 deterministic_rng;
-boost::random::mt19937 lessdeterministic_rng( std::time(0) + process_id );
+boost::mt19937 deterministic_rng;
+boost::mt19937 lessdeterministic_rng( std::time(0) + process_id );
AbstractFunction::~AbstractFunction()
{
@@ -167,7 +167,7 @@ Value builtin_rands(const Context *, const std::vector<std::string>&, const std:
double min = std::min( args[0].toDouble(), args[1].toDouble() );
double max = std::max( args[0].toDouble(), args[1].toDouble() );
- boost::random::uniform_real_distribution<> distributor( min, max );
+ boost::uniform_real<> distributor( min, max );
Value::VectorType vec;
for (int i=0; i<args[2].toDouble(); i++) {
if ( deterministic ) {
diff --git a/src/import.cc b/src/import.cc
index 40d34fa..6a6d925 100644
--- a/src/import.cc
+++ b/src/import.cc
@@ -119,7 +119,8 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const
if (this->type == TYPE_STL)
{
handle_dep((std::string)this->filename);
- std::ifstream f(this->filename.c_str(), std::ios::in | std::ios::binary);
+ // Open file and position at the end
+ std::ifstream f(this->filename.c_str(), std::ios::in | std::ios::binary | std::ios::ate);
if (!f.good()) {
PRINTB("WARNING: Can't open import file '%s'.", this->filename);
return p;
@@ -132,9 +133,20 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const
boost::regex ex_vertex("vertex");
boost::regex ex_vertices("\\s*vertex\\s+([^\\s]+)\\s+([^\\s]+)\\s+([^\\s]+)");
+ bool binary = false;
+ int file_size = f.tellg();
+ f.seekg(80);
+ if (!f.eof()) {
+ int facenum = 0;
+ // FIXME: Assumes little endian
+ f.read((char *)&facenum, sizeof(int));
+ if (file_size == 80 + 4 + 50*facenum) binary = true;
+ }
+ f.seekg(0);
+
char data[5];
f.read(data, 5);
- if (!f.eof() && !memcmp(data, "solid", 5)) {
+ if (!binary && !f.eof() && !memcmp(data, "solid", 5)) {
int i = 0;
double vdata[3][3];
std::string line;
@@ -174,6 +186,7 @@ PolySet *ImportNode::evaluate_polyset(class PolySetEvaluator *) const
else
{
f.ignore(80-5+4);
+ // FIXME: Assumes little endian
while (1) {
#ifdef _MSC_VER
#pragma pack(push,1)
diff --git a/src/mainwin.cc b/src/mainwin.cc
index cf79b5a..d5af643 100644
--- a/src/mainwin.cc
+++ b/src/mainwin.cc
@@ -89,6 +89,10 @@
#include "cgal.h"
#include "cgalworker.h"
+#else
+
+#include "PolySetEvaluator.h"
+
#endif // ENABLE_CGAL
#ifndef OPENCSG_VERSION_STRING
@@ -153,9 +157,11 @@ MainWindow::MainWindow(const QString &filename)
{
setupUi(this);
+#ifdef ENABLE_CGAL
this->cgalworker = new CGALWorker();
connect(this->cgalworker, SIGNAL(done(CGAL_Nef_polyhedron *)),
this, SLOT(actionRenderCGALDone(CGAL_Nef_polyhedron *)));
+#endif
register_builtin(root_ctx);
@@ -410,8 +416,10 @@ MainWindow::loadDesignSettings()
}
uint polySetCacheSize = Preferences::inst()->getValue("advanced/polysetCacheSize").toUInt();
PolySetCache::instance()->setMaxSize(polySetCacheSize);
+#ifdef ENABLE_CGAL
uint cgalCacheSize = Preferences::inst()->getValue("advanced/cgalCacheSize").toUInt();
CGALCache::instance()->setMaxSize(cgalCacheSize);
+#endif
}
MainWindow::~MainWindow()
@@ -668,8 +676,12 @@ void MainWindow::compileCSG(bool procevents)
progress_report_prep(this->root_node, report_func, this);
try {
+#ifdef ENABLE_CGAL
CGALEvaluator cgalevaluator(this->tree);
PolySetCGALEvaluator psevaluator(cgalevaluator);
+#else
+ PolySetEvaluator psevaluator(this->tree);
+#endif
CSGTermEvaluator csgrenderer(this->tree, &psevaluator);
this->root_raw_term = csgrenderer.evaluateCSGTerm(*root_node, highlight_terms, background_terms);
if (!root_raw_term) {
@@ -678,7 +690,9 @@ void MainWindow::compileCSG(bool procevents)
QApplication::processEvents();
}
PolySetCache::instance()->print();
+#ifdef ENABLE_CGAL
CGALCache::instance()->print();
+#endif
}
catch (const ProgressCancelException &e) {
PRINT("CSG generation cancelled.");
@@ -1187,8 +1201,9 @@ void MainWindow::actionRenderCGALDone(CGAL_Nef_polyhedron *root_N)
if (root_N) {
PolySetCache::instance()->print();
+#ifdef ENABLE_CGAL
CGALCache::instance()->print();
-
+#endif
if (!root_N->isNull()) {
if (root_N->dim == 2) {
PRINT(" Top level object is a 2D object:");
diff --git a/src/openscad.cc b/src/openscad.cc
index 0770558..7ebad33 100644
--- a/src/openscad.cc
+++ b/src/openscad.cc
@@ -258,7 +258,6 @@ int main(int argc, char **argv)
if (!filename) help(argv[0]);
-#ifdef ENABLE_CGAL
Context root_ctx;
register_builtin(root_ctx);
@@ -309,6 +308,7 @@ int main(int argc, char **argv)
}
}
else {
+#ifdef ENABLE_CGAL
CGAL_Nef_polyhedron root_N = cgalevaluator.evaluateCGALMesh(*tree.root());
fs::current_path(original_path);
@@ -402,8 +402,8 @@ int main(int argc, char **argv)
}
delete root_node;
#else
- fprintf(stderr, "OpenSCAD has been compiled without CGAL support!\n");
- exit(1);
+ fprintf(stderr, "OpenSCAD has been compiled without CGAL support!\n");
+ exit(1);
#endif
}
else if (useGUI)
diff --git a/src/svg.cc b/src/svg.cc
index e5130b0..66e5797 100644
--- a/src/svg.cc
+++ b/src/svg.cc
@@ -1,3 +1,4 @@
+#ifdef ENABLE_CGAL
#include "cgalutils.h"
#include "svg.h"
#include <boost/algorithm/string.hpp>
@@ -246,4 +247,4 @@ std::string dump_svg( const CGAL_Nef_polyhedron3 &N )
} // namespace
-
+#endif // ENABLE_CGAL
diff --git a/src/winconsole.c b/src/winconsole.c
new file mode 100644
index 0000000..de8e682
--- /dev/null
+++ b/src/winconsole.c
@@ -0,0 +1,84 @@
+/*
+ Enable easy piping under Windows(TM) command line.
+
+ We use the 'devenv'(TM) method, which means we have two binary files:
+
+ openscad.com, with IMAGE_SUBSYSTEM_WINDOWS_CUI flag set
+ openscad.exe, with IMAGE_SUBSYSTEM_WINDOWS_GUI flag set
+
+ The .com version is a 'wrapper' for the .exe version. If you call
+ 'openscad' with no extension from a script or shell, the .com version
+ is prioritized by the OS and feeds the GUI stdout to the console. We use
+ pure C to minimize binary size when cross-compiling (~10kbytes). See Also:
+
+ http://stackoverflow.com/questions/493536/can-one-executable-be-both-a-console-and-gui-app
+ http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx
+ http://blogs.msdn.com/b/junfeng/archive/2004/02/06/68531.aspx
+ http://msdn.microsoft.com/en-us/library/aa298534%28v=vs.60%29.aspx
+ http://cournape.wordpress.com/2008/07/29/redirecting-stderrstdout-in-cmdexe/
+ Open Group popen() documentation
+ inkscapec by Jos Hirth work at http://kaioa.com
+ Nop Head's OpenSCAD_cl at github.com
+
+ TODO:
+ Work with unicode: http://www.i18nguy.com/unicode/c-unicode.html
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define MAXCMDLEN 64000
+#define BUFFSIZE 42
+
+int main( int argc, char * argv[] )
+{
+ FILE *cmd_stdout;
+ char cmd[MAXCMDLEN];
+ char buffer[BUFFSIZE];
+ char *fgets_result;
+ int eof = 0;
+ int pclose_result;
+ int i;
+ int result = 0;
+
+ strcat( cmd, "\0" );
+ strcat( cmd, "openscad.exe" );
+ for ( i = 1 ; i < argc ; ++i ) {
+ strcat( cmd, " " );
+ strcat( cmd, argv[i] );
+ }
+ strcat( cmd, " ");
+ strcat( cmd, " 2>&1"); // capture stderr and stdout
+
+ cmd_stdout = _popen( cmd, "rt" );
+ if ( cmd_stdout == NULL ) {
+ printf( "Error opening _popen for command: %s", cmd );
+ perror( "Error message:" );
+ return 1;
+ }
+
+ while ( !eof )
+ {
+ fgets_result = fgets( buffer, BUFFSIZE, cmd_stdout );
+ if ( fgets_result == NULL ) {
+ if ( ferror( cmd_stdout ) ) {
+ printf("Error reading from stdout of %s\n", cmd);
+ result = 1;
+ }
+ if ( feof( cmd_stdout ) ) {
+ eof = 1;
+ }
+ } else {
+ fprintf( stdout, "%s", buffer );
+ }
+ }
+
+ pclose_result = _pclose( cmd_stdout );
+ if ( pclose_result < 0 ) {
+ perror("Error while closing stdout for command:");
+ result = 1;
+ }
+
+ return result;
+}
contact: Jan Huwald // Impressum