diff options
| -rw-r--r-- | src/csgops.cc | 11 | ||||
| -rw-r--r-- | src/polyset.cc | 1 | ||||
| -rw-r--r-- | src/projection.cc | 22 | 
3 files changed, 29 insertions, 5 deletions
| diff --git a/src/csgops.cc b/src/csgops.cc index 508eecc..ae97085 100644 --- a/src/csgops.cc +++ b/src/csgops.cc @@ -30,6 +30,8 @@  #include "printutils.h"  #ifdef ENABLE_CGAL  #  include "cgal.h" +#  include <CGAL/assertions_behaviour.h> +#  include <CGAL/exceptions.h>  #endif  enum csg_type_e { @@ -82,8 +84,10 @@ CGAL_Nef_polyhedron CsgNode::render_cgal_nef_polyhedron() const  	print_messages_push(); +	CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION);  	bool first = true;  	CGAL_Nef_polyhedron N; +	try {  	foreach (AbstractNode *v, children) {  		if (v->modinst->tag_background)  			continue; @@ -110,8 +114,13 @@ CGAL_Nef_polyhedron CsgNode::render_cgal_nef_polyhedron() const  		}  		v->progress_report();  	} -  	cgal_nef_cache.insert(cache_id, new cgal_nef_cache_entry(N), N.weight()); +	} +	catch (CGAL::Assertion_exception e) { +		PRINTF("ERROR: Illegal polygonal object - make sure all polygons are defined with the same winding order. Skipping affected object."); +	} +	CGAL::set_error_behaviour(old_behaviour); +  	print_messages_pop();  	progress_report(); diff --git a/src/polyset.cc b/src/polyset.cc index b8e77f4..47d858c 100644 --- a/src/polyset.cc +++ b/src/polyset.cc @@ -667,6 +667,7 @@ CGAL_Nef_polyhedron PolySet::render_cgal_nef_polyhedron() const  			CGAL::set_error_behaviour(old_behaviour);  			return CGAL_Nef_polyhedron();  		} +		CGAL::set_error_behaviour(old_behaviour);  	}  	return CGAL_Nef_polyhedron();  } diff --git a/src/projection.cc b/src/projection.cc index 1fb036c..7a3f77a 100644 --- a/src/projection.cc +++ b/src/projection.cc @@ -34,6 +34,11 @@  #include "export.h"  #include "progress.h" +#ifdef ENABLE_CGAL +#  include <CGAL/assertions_behaviour.h> +#  include <CGAL/exceptions.h> +#endif +  #include <sys/types.h>  #include <sys/stat.h>  #include <unistd.h> @@ -106,17 +111,26 @@ PolySet *ProjectionNode::render_polyset(render_mode_e) const  	print_messages_push(); +	PolySet *ps = new PolySet(); +	ps->convexity = this->convexity; +	ps->is2d = true; +  	CGAL_Nef_polyhedron N;  	N.dim = 3; +	CGAL::Failure_behaviour old_behaviour = CGAL::set_error_behaviour(CGAL::THROW_EXCEPTION); +  try {  	foreach(AbstractNode *v, this->children) {  		if (v->modinst->tag_background)  			continue;  		N.p3 += v->render_cgal_nef_polyhedron().p3;  	} - -	PolySet *ps = new PolySet(); -	ps->convexity = this->convexity; -	ps->is2d = true; +  } +  catch (CGAL::Assertion_exception e) { +		PRINTF("ERROR: Illegal polygonal object - make sure all polygons are defined with the same winding order. Skipping affected object."); +		CGAL::set_error_behaviour(old_behaviour); +		return ps; +	} +  CGAL::set_error_behaviour(old_behaviour);  	if (cut_mode)  	{ | 
