diff options
| -rw-r--r-- | RELEASE_NOTES | 2 | ||||
| -rw-r--r-- | doc/TODO.txt | 2 | ||||
| -rw-r--r-- | src/CGALEvaluator.cc | 35 | ||||
| -rw-r--r-- | src/CGAL_Nef_polyhedron.cc | 13 | ||||
| -rw-r--r-- | src/builtin.h | 2 | ||||
| -rw-r--r-- | src/context.cc | 20 | ||||
| -rw-r--r-- | src/lexer.l | 9 | ||||
| -rw-r--r-- | src/mainwin.cc | 17 | ||||
| -rw-r--r-- | src/openscad.cc | 16 | ||||
| -rw-r--r-- | testdata/scad/bugs/rotate-diff-nonmanifold-crash.scad | 9 | ||||
| -rw-r--r-- | testdata/scad/misc/builtin-tests.scad | 1 | ||||
| -rw-r--r-- | testdata/scad/misc/parser-tests.scad | 7 | ||||
| -rw-r--r-- | tests/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | tests/cgalpngtest.cc | 21 | ||||
| -rw-r--r-- | tests/cgaltest.cc | 21 | ||||
| -rw-r--r-- | tests/csgtermtest.cc | 21 | ||||
| -rw-r--r-- | tests/csgtestcore.cc | 16 | ||||
| -rw-r--r-- | tests/csgtexttest.cc | 21 | ||||
| -rw-r--r-- | tests/dumptest.cc | 16 | ||||
| -rw-r--r-- | tests/echotest.cc | 16 | ||||
| -rw-r--r-- | tests/regression/echotest/builtin-tests-expected.txt | 1 | ||||
| -rw-r--r-- | tests/regression/echotest/parser-tests-expected.txt | 5 | 
22 files changed, 101 insertions, 174 deletions
| diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 3e10eec..cc6d99e 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -14,6 +14,7 @@ o The version() function will return the OpenSCAD version as a vector, e.g. [201  o The version_num() function will return the OpenSCAD version as a number, e.g. 20110923  o Added PI constant.  o Now uses standard shortcuts for save and reload on Linux and Windows. F2/F3 will still work but is deprecated. +o Number literals in scientific notation are now accepted by the parser  Bugfixes:  o square() crashed if any of the dimensions were zero @@ -21,6 +22,7 @@ o Flush Caches didn't flush cached USE'd modules  o STL export should be a bit more robust  o Dropping a file into the editor under Windows didn't work (double C:/C:/ problem)  o On some platforms it was possible to insertion rich text in the editor, causing confusion. +o Less crashes due to CGAL assertions  Deprecations:  o dxf_linear_extrude() and dxf_rotate_extrude() are now deprecated. diff --git a/doc/TODO.txt b/doc/TODO.txt index 26dd6c8..c869681 100644 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -230,7 +230,5 @@ o Use a logging framework to get debugging/info output more under control?  MISC  ---- -o Streamline the cmd-line interface a bit -  - Implicit output file format  o Write checklists for typical extension work (add new module, add new function)    -> make sure new test files are added diff --git a/src/CGALEvaluator.cc b/src/CGALEvaluator.cc index 550f300..797434f 100644 --- a/src/CGALEvaluator.cc +++ b/src/CGALEvaluator.cc @@ -56,20 +56,29 @@ void CGALEvaluator::process(CGAL_Nef_polyhedron &target, const CGAL_Nef_polyhedr  	if (src.empty()) return; // Empty polyhedron. This can happen for e.g. square([0,0])  	if (target.dim != src.dim) return; // If someone tries to e.g. union 2d and 3d objects -	switch (op) { -	case CGE_UNION: -		target += src; -		break; -	case CGE_INTERSECTION: -		target *= src; -		break; -	case CGE_DIFFERENCE: -		target -= src; -		break; -	case CGE_MINKOWSKI: -		target.minkowski(src); -		break; +	CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); +	try { +		switch (op) { +		case CGE_UNION: +			target += src; +			break; +		case CGE_INTERSECTION: +			target *= src; +			break; +		case CGE_DIFFERENCE: +			target -= src; +			break; +		case CGE_MINKOWSKI: +			target.minkowski(src); +			break; +		} +	} +	catch (CGAL::Assertion_exception e) { +		// union && difference assert triggered by testdata/scad/bugs/rotate-diff-nonmanifold-crash.scad +		std::string opstr = op == CGE_UNION ? "union" : op == CGE_INTERSECTION ? "intersection" : op == CGE_DIFFERENCE ? "difference" : op == CGE_MINKOWSKI ? "minkowski" : "UNKNOWN"; +		PRINTF("CGAL error in CGAL_Nef_polyhedron's %s operator: %s", opstr.c_str(), e.what());  	} +	CGAL::set_error_behaviour(old_behaviour);  }  /*! diff --git a/src/CGAL_Nef_polyhedron.cc b/src/CGAL_Nef_polyhedron.cc index 975c9a4..2538b64 100644 --- a/src/CGAL_Nef_polyhedron.cc +++ b/src/CGAL_Nef_polyhedron.cc @@ -6,8 +6,6 @@  #include "dxfdata.h"  #include "dxftess.h"  #include <CGAL/minkowski_sum_3.h> -#include <CGAL/assertions_behaviour.h> -#include <CGAL/exceptions.h>  CGAL_Nef_polyhedron& CGAL_Nef_polyhedron::operator+=(const CGAL_Nef_polyhedron &other)  { @@ -34,15 +32,8 @@ extern CGAL_Nef_polyhedron2 minkowski2(const CGAL_Nef_polyhedron2 &a, const CGAL  CGAL_Nef_polyhedron &CGAL_Nef_polyhedron::minkowski(const CGAL_Nef_polyhedron &other)  { -	CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); -	try { -		if (this->dim == 2) (*this->p2) = minkowski2(*this->p2, *other.p2); -		else if (this->dim == 3) (*this->p3) = CGAL::minkowski_sum_3(*this->p3, *other.p3); -	} -	catch (CGAL::Assertion_exception e) { -		PRINTF("CGAL error in minkowski %s", e.what()); -		CGAL::set_error_behaviour(old_behaviour); -	} +	if (this->dim == 2) (*this->p2) = minkowski2(*this->p2, *other.p2); +	else if (this->dim == 3) (*this->p3) = CGAL::minkowski_sum_3(*this->p3, *other.p3);  	return *this;  } diff --git a/src/builtin.h b/src/builtin.h index ae526f2..643966b 100644 --- a/src/builtin.h +++ b/src/builtin.h @@ -26,4 +26,6 @@ extern void register_builtin_dxf_linear_extrude();  extern void register_builtin_dxf_rotate_extrude();  extern void initialize_builtin_dxf_dim(); +extern void register_builtin(class Context &ctx); +  #endif diff --git a/src/context.cc b/src/context.cc index b4983f6..47b8a78 100644 --- a/src/context.cc +++ b/src/context.cc @@ -193,3 +193,23 @@ std::string Context::getAbsolutePath(const std::string &filename) const  		return filename;  	}  } + +void register_builtin(Context &ctx) +{ +	ctx.functions_p = &builtin_functions; +	ctx.modules_p = &builtin_modules; +	ctx.set_variable("$fn", Value(0.0)); +	ctx.set_variable("$fs", Value(1.0)); +	ctx.set_variable("$fa", Value(12.0)); +	ctx.set_variable("$t", Value(0.0)); +	 +	Value zero3; +	zero3.type = Value::VECTOR; +	zero3.append(new Value(0.0)); +	zero3.append(new Value(0.0)); +	zero3.append(new Value(0.0)); +	ctx.set_variable("$vpt", zero3); +	ctx.set_variable("$vpr", zero3); + +	ctx.set_constant("PI",Value(M_PI)); +} diff --git a/src/lexer.l b/src/lexer.l index d9ccd76..2760b07 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -88,7 +88,8 @@ QString filepath;  %x comment string  %x include -DIGIT [0-9] +D [0-9] +E [Ee][+-]?{D}+  %% @@ -155,8 +156,10 @@ use[ \t\r\n>]*"<"[^\t\r\n>]+">" {  "false"		return TOK_FALSE;  "undef"		return TOK_UNDEF; -{DIGIT}+|{DIGIT}*\.{DIGIT}+|{DIGIT}+\.{DIGIT}* { parserlval.number = QString(yytext).toDouble(); return TOK_NUMBER; } -"$"?[a-zA-Z0-9_]+ { parserlval.text = strdup(yytext); return TOK_ID; } +{D}+{E}? |  +{D}*\.{D}+{E}? | +{D}+\.{D}*{E}?          { parserlval.number = QString(yytext).toDouble(); return TOK_NUMBER; } +"$"?[a-zA-Z0-9_]+       { parserlval.text = strdup(yytext); return TOK_ID; }  \"			{ BEGIN(string); stringcontents = new QString(); }  <string>{ diff --git a/src/mainwin.cc b/src/mainwin.cc index 9944f67..a6f5be6 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -143,22 +143,7 @@ MainWindow::MainWindow(const QString &filename)  {  	setupUi(this); -	root_ctx.functions_p = &builtin_functions; -	root_ctx.modules_p = &builtin_modules; -	root_ctx.set_variable("$fn", Value(0.0)); -	root_ctx.set_variable("$fs", Value(1.0)); -	root_ctx.set_variable("$fa", Value(12.0)); -	root_ctx.set_variable("$t", Value(0.0)); - -	root_ctx.set_constant("PI",Value(M_PI)); - -	Value zero3; -	zero3.type = Value::VECTOR; -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	root_ctx.set_variable("$vpt", zero3); -	root_ctx.set_variable("$vpr", zero3); +	register_builtin(root_ctx);  	root_module = NULL;  	absolute_root_node = NULL; diff --git a/src/openscad.cc b/src/openscad.cc index 9b45d21..84d6263 100644 --- a/src/openscad.cc +++ b/src/openscad.cc @@ -260,21 +260,7 @@ int main(int argc, char **argv)  #ifdef ENABLE_CGAL  		Context root_ctx; -		root_ctx.functions_p = &builtin_functions; -		root_ctx.modules_p = &builtin_modules; -		root_ctx.set_variable("$fn", Value(0.0)); -		root_ctx.set_variable("$fs", Value(1.0)); -		root_ctx.set_variable("$fa", Value(12.0)); -		root_ctx.set_variable("$t", Value(0.0)); - -		Value zero3; -		zero3.type = Value::VECTOR; -		zero3.append(new Value(0.0)); -		zero3.append(new Value(0.0)); -		zero3.append(new Value(0.0)); -		root_ctx.set_variable("$vpt", zero3); -		root_ctx.set_variable("$vpr", zero3); - +		register_builtin(root_ctx);  		AbstractModule *root_module;  		ModuleInstantiation root_inst; diff --git a/testdata/scad/bugs/rotate-diff-nonmanifold-crash.scad b/testdata/scad/bugs/rotate-diff-nonmanifold-crash.scad new file mode 100644 index 0000000..754a2a6 --- /dev/null +++ b/testdata/scad/bugs/rotate-diff-nonmanifold-crash.scad @@ -0,0 +1,9 @@ +difference() { +  rotate_extrude($fn=5) translate([4,0,0]) square([10, 10], center=true); +  translate([6,6,6]) sphere(r=10); +} + +union() { +  rotate_extrude($fn=5) translate([4,0,0]) square([10, 10], center=true); +  cylinder(h=5,r=3); +} diff --git a/testdata/scad/misc/builtin-tests.scad b/testdata/scad/misc/builtin-tests.scad new file mode 100644 index 0000000..6b5eac1 --- /dev/null +++ b/testdata/scad/misc/builtin-tests.scad @@ -0,0 +1 @@ +p = PI; echo(p); diff --git a/testdata/scad/misc/parser-tests.scad b/testdata/scad/misc/parser-tests.scad new file mode 100644 index 0000000..03cbded --- /dev/null +++ b/testdata/scad/misc/parser-tests.scad @@ -0,0 +1,7 @@ +// Number literals + +a = .1;      echo(a); +b = 2.;      echo(b); +c = 11e+2;   echo(c); +d = 21.e-3;  echo(d); +e = .11e-12; echo(e); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 259ec76..3167792 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -353,7 +353,9 @@ list(APPEND DUMPTEST_FILES ${MINIMAL_FILES}  list(APPEND ECHO_FILES              ${CMAKE_SOURCE_DIR}/../testdata/scad/minimal/echo.scad -            ${CMAKE_SOURCE_DIR}/../testdata/scad/features/echo-tests.scad) +            ${CMAKE_SOURCE_DIR}/../testdata/scad/features/echo-tests.scad +            ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/parser-tests.scad +            ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/builtin-tests.scad)  # Add echotest tests to CTest  add_cmdline_test(echotest txt ${ECHO_FILES}) diff --git a/tests/cgalpngtest.cc b/tests/cgalpngtest.cc index 734f6eb..bb65fa0 100644 --- a/tests/cgalpngtest.cc +++ b/tests/cgalpngtest.cc @@ -1,6 +1,7 @@  /* - *  OpenSCAD (www.openscad.at) - *  Copyright (C) 2009  Clifford Wolf <clifford@clifford.at> + *  OpenSCAD (www.openscad.org) + *  Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and + *                          Marius Kintel <marius@kintel.net>   *   *  This program is free software; you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -127,21 +128,7 @@ int main(int argc, char **argv)  	}  	Context root_ctx; -	root_ctx.functions_p = &builtin_functions; -	root_ctx.modules_p = &builtin_modules; -	root_ctx.set_variable("$fn", Value(0.0)); -	root_ctx.set_variable("$fs", Value(1.0)); -	root_ctx.set_variable("$fa", Value(12.0)); -	root_ctx.set_variable("$t", Value(0.0)); - -	Value zero3; -	zero3.type = Value::VECTOR; -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	root_ctx.set_variable("$vpt", zero3); -	root_ctx.set_variable("$vpr", zero3); - +	register_builtin(root_ctx);  	AbstractModule *root_module;  	ModuleInstantiation root_inst; diff --git a/tests/cgaltest.cc b/tests/cgaltest.cc index 2c83cc8..242b7b7 100644 --- a/tests/cgaltest.cc +++ b/tests/cgaltest.cc @@ -1,6 +1,7 @@  /* - *  OpenSCAD (www.openscad.at) - *  Copyright (C) 2009  Clifford Wolf <clifford@clifford.at> + *  OpenSCAD (www.openscad.org) + *  Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and + *                          Marius Kintel <marius@kintel.net>   *   *  This program is free software; you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -111,21 +112,7 @@ int main(int argc, char **argv)  	}  	Context root_ctx; -	root_ctx.functions_p = &builtin_functions; -	root_ctx.modules_p = &builtin_modules; -	root_ctx.set_variable("$fn", Value(0.0)); -	root_ctx.set_variable("$fs", Value(1.0)); -	root_ctx.set_variable("$fa", Value(12.0)); -	root_ctx.set_variable("$t", Value(0.0)); - -	Value zero3; -	zero3.type = Value::VECTOR; -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	root_ctx.set_variable("$vpt", zero3); -	root_ctx.set_variable("$vpr", zero3); - +	register_builtin(root_ctx);  	AbstractModule *root_module;  	ModuleInstantiation root_inst; diff --git a/tests/csgtermtest.cc b/tests/csgtermtest.cc index 98134f7..08002e2 100644 --- a/tests/csgtermtest.cc +++ b/tests/csgtermtest.cc @@ -1,6 +1,7 @@  /* - *  OpenSCAD (www.openscad.at) - *  Copyright (C) 2009  Clifford Wolf <clifford@clifford.at> + *  OpenSCAD (www.openscad.org) + *  Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and + *                          Marius Kintel <marius@kintel.net>   *   *  This program is free software; you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -96,21 +97,7 @@ int main(int argc, char **argv)  	}  	Context root_ctx; -	root_ctx.functions_p = &builtin_functions; -	root_ctx.modules_p = &builtin_modules; -	root_ctx.set_variable("$fn", Value(0.0)); -	root_ctx.set_variable("$fs", Value(1.0)); -	root_ctx.set_variable("$fa", Value(12.0)); -	root_ctx.set_variable("$t", Value(0.0)); - -	Value zero3; -	zero3.type = Value::VECTOR; -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	root_ctx.set_variable("$vpt", zero3); -	root_ctx.set_variable("$vpr", zero3); - +	register_builtin(root_ctx);  	AbstractModule *root_module;  	ModuleInstantiation root_inst; diff --git a/tests/csgtestcore.cc b/tests/csgtestcore.cc index 2390f06..8460a59 100644 --- a/tests/csgtestcore.cc +++ b/tests/csgtestcore.cc @@ -106,21 +106,7 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type)  	}  	Context root_ctx; -	root_ctx.functions_p = &builtin_functions; -	root_ctx.modules_p = &builtin_modules; -	root_ctx.set_variable("$fn", Value(0.0)); -	root_ctx.set_variable("$fs", Value(1.0)); -	root_ctx.set_variable("$fa", Value(12.0)); -	root_ctx.set_variable("$t", Value(0.0)); - -	Value zero3; -	zero3.type = Value::VECTOR; -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	root_ctx.set_variable("$vpt", zero3); -	root_ctx.set_variable("$vpr", zero3); - +	register_builtin(root_ctx);  	AbstractModule *root_module;  	ModuleInstantiation root_inst; diff --git a/tests/csgtexttest.cc b/tests/csgtexttest.cc index fe94497..afa5bbe 100644 --- a/tests/csgtexttest.cc +++ b/tests/csgtexttest.cc @@ -1,6 +1,7 @@  /* - *  OpenSCAD (www.openscad.at) - *  Copyright (C) 2009  Clifford Wolf <clifford@clifford.at> + *  OpenSCAD (www.openscad.org) + *  Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and + *                          Marius Kintel <marius@kintel.net>   *   *  This program is free software; you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -99,21 +100,7 @@ int main(int argc, char **argv)  	}  	Context root_ctx; -	root_ctx.functions_p = &builtin_functions; -	root_ctx.modules_p = &builtin_modules; -	root_ctx.set_variable("$fn", Value(0.0)); -	root_ctx.set_variable("$fs", Value(1.0)); -	root_ctx.set_variable("$fa", Value(12.0)); -	root_ctx.set_variable("$t", Value(0.0)); - -	Value zero3; -	zero3.type = Value::VECTOR; -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	root_ctx.set_variable("$vpt", zero3); -	root_ctx.set_variable("$vpr", zero3); - +	register_builtin(root_ctx);  	AbstractModule *root_module;  	ModuleInstantiation root_inst; diff --git a/tests/dumptest.cc b/tests/dumptest.cc index 8e48d24..7344f95 100644 --- a/tests/dumptest.cc +++ b/tests/dumptest.cc @@ -118,21 +118,7 @@ int main(int argc, char **argv)  	}  	Context root_ctx; -	root_ctx.functions_p = &builtin_functions; -	root_ctx.modules_p = &builtin_modules; -	root_ctx.set_variable("$fn", Value(0.0)); -	root_ctx.set_variable("$fs", Value(1.0)); -	root_ctx.set_variable("$fa", Value(12.0)); -	root_ctx.set_variable("$t", Value(0.0)); - -	Value zero3; -	zero3.type = Value::VECTOR; -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	root_ctx.set_variable("$vpt", zero3); -	root_ctx.set_variable("$vpr", zero3); - +	register_builtin(root_ctx);  	AbstractModule *root_module;  	ModuleInstantiation root_inst; diff --git a/tests/echotest.cc b/tests/echotest.cc index 046f883..329aac2 100644 --- a/tests/echotest.cc +++ b/tests/echotest.cc @@ -104,21 +104,7 @@ int main(int argc, char **argv)  	}  	Context root_ctx; -	root_ctx.functions_p = &builtin_functions; -	root_ctx.modules_p = &builtin_modules; -	root_ctx.set_variable("$fn", Value(0.0)); -	root_ctx.set_variable("$fs", Value(1.0)); -	root_ctx.set_variable("$fa", Value(12.0)); -	root_ctx.set_variable("$t", Value(0.0)); - -	Value zero3; -	zero3.type = Value::VECTOR; -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	zero3.append(new Value(0.0)); -	root_ctx.set_variable("$vpt", zero3); -	root_ctx.set_variable("$vpr", zero3); - +	register_builtin(root_ctx);  	AbstractModule *root_module;  	ModuleInstantiation root_inst; diff --git a/tests/regression/echotest/builtin-tests-expected.txt b/tests/regression/echotest/builtin-tests-expected.txt new file mode 100644 index 0000000..e8b2027 --- /dev/null +++ b/tests/regression/echotest/builtin-tests-expected.txt @@ -0,0 +1 @@ +ECHO: 3.141592653589793 diff --git a/tests/regression/echotest/parser-tests-expected.txt b/tests/regression/echotest/parser-tests-expected.txt new file mode 100644 index 0000000..fb04907 --- /dev/null +++ b/tests/regression/echotest/parser-tests-expected.txt @@ -0,0 +1,5 @@ +ECHO: 0.1 +ECHO: 2 +ECHO: 1100 +ECHO: 0.021 +ECHO: 1.1e-13 | 
