diff options
24 files changed, 3500 insertions, 896 deletions
| diff --git a/doc/TODO.txt b/doc/TODO.txt index ce51d83..a456c6a 100644 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -71,6 +71,7 @@ o 3D View    - Use OpenGL picking to facilitate ray-tracing like features like measuring      thicknesses, distances, slot thicknesses etc.    - Add option to change lights, e.g. add an optional camera light +  - 2D objects are rendered at z = -0.1 - why?  o Editor wishlist    - More infrastructure for external editor (allow communication from the outside)    - Preferences GUI for the features below diff --git a/libraries/MCAD b/libraries/MCAD -Subproject 4330afe5e726b910e0b60039c86afa809f94923 +Subproject b7d9ec4c5e5939b2bffcda60b91f4623e9b3c62 @@ -11,6 +11,11 @@ using boost::intmax_t;  using boost::uintmax_t;  #endif +#include <CGAL/version.h> +#if CGAL_VERSION_NR < 1030601000 +  #error CGAL >= 3.6 is required! +#endif +  #include <CGAL/Gmpq.h>  #include <CGAL/Extended_cartesian.h>  #include <CGAL/Nef_polyhedron_2.h> diff --git a/src/traverser.cc b/src/traverser.cc index a87449b..d9b3dc1 100644 --- a/src/traverser.cc +++ b/src/traverser.cc @@ -3,6 +3,7 @@  #include "node.h"  #include "state.h"  #include <algorithm> +#include <boost/foreach.hpp>  void Traverser::execute()   { @@ -10,35 +11,37 @@ void Traverser::execute()  	traverse(this->root, state);  } -struct TraverseNode +Response Traverser::traverse(const AbstractNode &node, const State &state)  { -	Traverser *traverser; -	const State &state; -	TraverseNode(Traverser *traverser, const State &state) :  -		traverser(traverser), state(state) {} -	void operator()(const AbstractNode *node) { traverser->traverse(*node, state); } -}; - -void Traverser::traverse(const AbstractNode &node, const State &state) -{ -	// FIXME: Handle abort -	  	State newstate = state;  	newstate.setNumChildren(node.getChildren().size()); +	Response response;  	if (traversaltype == PREFIX || traversaltype == PRE_AND_POSTFIX) {  		newstate.setPrefix(true);  		newstate.setParent(state.parent()); -		node.accept(newstate, this->visitor); +		response = node.accept(newstate, this->visitor);  	} -	 -	newstate.setParent(&node); -	std::for_each(node.getChildren().begin(), node.getChildren().end(), TraverseNode(this, newstate)); -	 -	if (traversaltype == POSTFIX || traversaltype == PRE_AND_POSTFIX) { -		newstate.setParent(state.parent()); -		newstate.setPrefix(false); -		newstate.setPostfix(true); -		node.accept(newstate, this->visitor); + +	// Pruned traversals mean don't traverse children +	if (response == ContinueTraversal) { +		newstate.setParent(&node); +		BOOST_FOREACH(const AbstractNode *chnode, node.getChildren()) { +			response = this->traverse(*chnode, newstate); +			if (response == AbortTraversal) return response; // Abort immediately +		}  	} + +	// Postfix is executed for all non-aborted traversals +	if (response != AbortTraversal) { +		if (traversaltype == POSTFIX || traversaltype == PRE_AND_POSTFIX) { +			newstate.setParent(state.parent()); +			newstate.setPrefix(false); +			newstate.setPostfix(true); +			response = node.accept(newstate, this->visitor); +		} +	} + +	if (response != AbortTraversal) response = ContinueTraversal; +	return response;  } diff --git a/src/traverser.h b/src/traverser.h index 85373cc..73078e7 100644 --- a/src/traverser.h +++ b/src/traverser.h @@ -15,7 +15,7 @@ public:    void execute();    // FIXME: reverse parameters -  void traverse(const AbstractNode &node, const class State &state); +  Response traverse(const AbstractNode &node, const class State &state);  private:    Visitor &visitor; diff --git a/src/value.cc b/src/value.cc index ab78c2a..5ea766c 100644 --- a/src/value.cc +++ b/src/value.cc @@ -363,7 +363,20 @@ std::string Value::toString() const  			<< ']';  		break;  	case NUMBER: +#ifdef OPENSCAD_TESTING +		// Quick and dirty hack to work around floating point rounding differences +		// across platforms for testing purposes. +	{ +		std::stringstream tmp; +		tmp.precision(16); +		tmp << this->num; +		std::string tmpstr = tmp.str(); +		if (tmpstr.size() > 16) tmpstr.erase(16); +		stream << tmpstr; +	} +#else  		stream << this->num; +#endif  		break;  	case BOOL:  		stream << (this->b ? "true" : "false"); diff --git a/testdata/scad/bugs/fn_bug.scad b/testdata/scad/bugs/fn_bug.scad new file mode 100644 index 0000000..179ac0d --- /dev/null +++ b/testdata/scad/bugs/fn_bug.scad @@ -0,0 +1,22 @@ +fn_setting = 41; // does not work +//fn_setting = 40; // works + +// basic box sizes +box_width = 720; +box_depth = 450; +box_height = 90; +box_bevel = 35; + +union () +{ +	translate ([(box_width / 2) - box_bevel, -((box_depth / 2) - box_bevel), 0]) +	cylinder (h = box_height- box_bevel, r = box_bevel, center = false, $fn = fn_setting); + +	translate ([0, -((box_depth / 2) - box_bevel), box_height- box_bevel]) +	rotate ([0, 90, 0]) +	cylinder (h = box_width - (2 * box_bevel), r = box_bevel, center = true, $fn = fn_setting); + +	translate ([(box_width / 2) - box_bevel, 0, box_height- box_bevel]) +	rotate ([90, 90, 0]) +	cylinder (h = box_depth - (2 * box_bevel), r = box_bevel, center = true, $fn = fn_setting); +} diff --git a/testdata/scad/bugs/fn_bug.stl b/testdata/scad/bugs/fn_bug.stl new file mode 100644 index 0000000..ebbab1f --- /dev/null +++ b/testdata/scad/bugs/fn_bug.stl @@ -0,0 +1,3320 @@ +solid OpenSCAD_Model +  facet normal -1 0 0 +    outer loop +      vertex -325 -192.679 89.8973 +      vertex -325 -187.321 89.8973 +      vertex -325 -197.975 89.0793 +    endloop +  endfacet +  facet normal -1 -0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -187.321 89.8973 +      vertex -325 -182.025 89.0793 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -182.025 89.0793 +      vertex -325 -176.916 87.4626 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -176.916 87.4626 +      vertex -325 -172.114 85.0849 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -172.114 85.0849 +      vertex -325 -167.732 82.0021 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -167.732 82.0021 +      vertex -325 -163.871 78.2864 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -163.871 78.2864 +      vertex -325 -160.622 74.0249 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -160.622 74.0249 +      vertex -325 -158.062 69.3174 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -158.062 69.3174 +      vertex -325 -156.251 64.2744 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -156.251 64.2744 +      vertex -325 -155.231 59.0139 +    endloop +  endfacet +  facet normal -1 -7.67401e-15 -1.09101e-14 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -155.231 59.0139 +      vertex -325 -155.026 53.6594 +    endloop +  endfacet +  facet normal -1 1.20845e-15 -1.3951e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -155.026 53.6594 +      vertex -325 -155.64 48.3363 +    endloop +  endfacet +  facet normal -1 1.06188e-15 -2.91809e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -155.64 48.3363 +      vertex -325 -157.06 43.1694 +    endloop +  endfacet +  facet normal -1 9.24345e-16 -4.14377e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -157.06 43.1694 +      vertex -325 -159.252 38.2798 +    endloop +  endfacet +  facet normal -1 7.93678e-16 -5.13981e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -159.252 38.2798 +      vertex -325 -162.165 33.7821 +    endloop +  endfacet +  facet normal -1 6.68032e-16 -5.95348e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -162.165 33.7821 +      vertex -325 -165.73 29.7817 +    endloop +  endfacet +  facet normal -1 5.45797e-16 -6.61818e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -165.73 29.7817 +      vertex -325 -169.864 26.3725 +    endloop +  endfacet +  facet normal -1 4.25511e-16 -7.15741e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -169.864 26.3725 +      vertex -325 -174.47 23.6342 +    endloop +  endfacet +  facet normal -1 3.05798e-16 -7.58736e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -174.47 23.6342 +      vertex -325 -179.44 21.6311 +    endloop +  endfacet +  facet normal -1 1.853e-16 -7.9185e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -179.44 21.6311 +      vertex -325 -184.657 20.4102 +    endloop +  endfacet +  facet normal -1 6.26205e-17 -8.15642e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -184.657 20.4102 +      vertex -325 -190 20 +    endloop +  endfacet +  facet normal -1 -6.37405e-17 -8.3023e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -190 20 +      vertex -325 -195.343 20.4102 +    endloop +  endfacet +  facet normal -1 -1.95463e-16 -8.35279e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -195.343 20.4102 +      vertex -325 -200.56 21.6311 +    endloop +  endfacet +  facet normal -1 -3.345e-16 -8.2995e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -200.56 21.6311 +      vertex -325 -205.53 23.6342 +    endloop +  endfacet +  facet normal -1 -4.83203e-16 -8.12783e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -205.53 23.6342 +      vertex -325 -210.136 26.3725 +    endloop +  endfacet +  facet normal -1 -6.44499e-16 -7.81501e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -210.136 26.3725 +      vertex -325 -214.27 29.7817 +    endloop +  endfacet +  facet normal -1 -8.22137e-16 -7.32685e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -214.27 29.7817 +      vertex -325 -217.835 33.7821 +    endloop +  endfacet +  facet normal -1 -1.02107e-15 -6.61238e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -217.835 33.7821 +      vertex -325 -220.748 38.2798 +    endloop +  endfacet +  facet normal -1 -1.24804e-15 -5.59488e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -220.748 38.2798 +      vertex -325 -222.94 43.1694 +    endloop +  endfacet +  facet normal -1 -1.51255e-15 -4.15655e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -222.94 43.1694 +      vertex -325 -224.36 48.3363 +    endloop +  endfacet +  facet normal -1 -1.82844e-15 -2.11084e-16 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -224.36 48.3363 +      vertex -325 -224.974 53.6594 +    endloop +  endfacet +  facet normal -1 1.24474e-14 -1.10931e-14 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -224.974 53.6594 +      vertex -325 -224.769 59.0139 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -224.769 59.0139 +      vertex -325 -223.749 64.2744 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -223.749 64.2744 +      vertex -325 -221.938 69.3174 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -221.938 69.3174 +      vertex -325 -219.378 74.0249 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -219.378 74.0249 +      vertex -325 -216.129 78.2864 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -216.129 78.2864 +      vertex -325 -212.268 82.0021 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -212.268 82.0021 +      vertex -325 -207.886 85.0849 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex -325 -197.975 89.0793 +      vertex -325 -207.886 85.0849 +      vertex -325 -203.084 87.4626 +    endloop +  endfacet +  facet normal -2.18629e-16 0 1 +    outer loop +      vertex -325 -187.321 89.8973 +      vertex -325 -192.679 89.8973 +      vertex 325 -192.679 89.8973 +    endloop +  endfacet +  facet normal -2.18629e-16 0 1 +    outer loop +      vertex 325 -187.321 89.8973 +      vertex -325 -187.321 89.8973 +      vertex 325 -192.679 89.8973 +    endloop +  endfacet +  facet normal -2.16066e-16 -0.152649 0.98828 +    outer loop +      vertex 325 -192.679 89.8973 +      vertex -325 -192.679 89.8973 +      vertex -325 -197.975 89.0793 +    endloop +  endfacet +  facet normal -2.37673e-16 -0.152649 0.98828 +    outer loop +      vertex 325 -197.975 89.0793 +      vertex 325 -192.679 89.8973 +      vertex -325 -197.975 89.0793 +    endloop +  endfacet +  facet normal -2.29284e-16 -0.301721 0.953396 +    outer loop +      vertex 325 -197.975 89.0793 +      vertex -325 -197.975 89.0793 +      vertex -325 -203.084 87.4626 +    endloop +  endfacet +  facet normal -2.29284e-16 -0.301721 0.953396 +    outer loop +      vertex 325 -203.084 87.4626 +      vertex 325 -197.975 89.0793 +      vertex -325 -203.084 87.4626 +    endloop +  endfacet +  facet normal -2.1552e-16 -0.44372 0.896166 +    outer loop +      vertex 325 -203.084 87.4626 +      vertex -325 -203.084 87.4626 +      vertex -325 -207.886 85.0849 +    endloop +  endfacet +  facet normal -2.1552e-16 -0.44372 0.896166 +    outer loop +      vertex 325 -207.886 85.0849 +      vertex 325 -203.084 87.4626 +      vertex -325 -207.886 85.0849 +    endloop +  endfacet +  facet normal -1.96705e-16 -0.575319 0.817929 +    outer loop +      vertex 325 -207.886 85.0849 +      vertex -325 -207.886 85.0849 +      vertex -325 -212.268 82.0021 +    endloop +  endfacet +  facet normal -1.78823e-16 -0.575319 0.817929 +    outer loop +      vertex 325 -212.268 82.0021 +      vertex 325 -207.886 85.0849 +      vertex -325 -212.268 82.0021 +    endloop +  endfacet +  facet normal -1.57527e-16 -0.693432 0.720522 +    outer loop +      vertex 325 -212.268 82.0021 +      vertex -325 -212.268 82.0021 +      vertex -325 -216.129 78.2864 +    endloop +  endfacet +  facet normal -1.73279e-16 -0.693432 0.720522 +    outer loop +      vertex 325 -216.129 78.2864 +      vertex 325 -212.268 82.0021 +      vertex -325 -216.129 78.2864 +    endloop +  endfacet +  facet normal -1.45792e-16 -0.795293 0.606225 +    outer loop +      vertex 325 -216.129 78.2864 +      vertex -325 -216.129 78.2864 +      vertex -325 -219.378 74.0249 +    endloop +  endfacet +  facet normal -1.32538e-16 -0.795293 0.606225 +    outer loop +      vertex 325 -219.378 74.0249 +      vertex 325 -216.129 78.2864 +      vertex -325 -219.378 74.0249 +    endloop +  endfacet +  facet normal -1.04443e-16 -0.878512 0.47772 +    outer loop +      vertex 325 -219.378 74.0249 +      vertex -325 -219.378 74.0249 +      vertex -325 -221.938 69.3174 +    endloop +  endfacet +  facet normal -1.04443e-16 -0.878512 0.47772 +    outer loop +      vertex 325 -221.938 69.3174 +      vertex 325 -219.378 74.0249 +      vertex -325 -221.938 69.3174 +    endloop +  endfacet +  facet normal -7.39001e-17 -0.94114 0.338017 +    outer loop +      vertex 325 -221.938 69.3174 +      vertex -325 -221.938 69.3174 +      vertex -325 -223.749 64.2744 +    endloop +  endfacet +  facet normal -7.39001e-17 -0.94114 0.338017 +    outer loop +      vertex 325 -223.749 64.2744 +      vertex 325 -221.938 69.3174 +      vertex -325 -223.749 64.2744 +    endloop +  endfacet +  facet normal -4.16249e-17 -0.981708 0.190391 +    outer loop +      vertex 325 -223.749 64.2744 +      vertex -325 -223.749 64.2744 +      vertex -325 -224.769 59.0139 +    endloop +  endfacet +  facet normal -4.37062e-17 -0.981708 0.190391 +    outer loop +      vertex 325 -224.769 59.0139 +      vertex 325 -223.749 64.2744 +      vertex -325 -224.769 59.0139 +    endloop +  endfacet +  facet normal -8.79276e-18 -0.999266 0.0383027 +    outer loop +      vertex 325 -224.769 59.0139 +      vertex -325 -224.769 59.0139 +      vertex -325 -224.974 53.6594 +    endloop +  endfacet +  facet normal -8.37406e-18 -0.999266 0.0383027 +    outer loop +      vertex 325 -224.974 53.6594 +      vertex 325 -224.769 59.0139 +      vertex -325 -224.974 53.6594 +    endloop +  endfacet +  facet normal 2.50731e-17 -0.993402 -0.114683 +    outer loop +      vertex 325 -224.974 53.6594 +      vertex -325 -224.974 53.6594 +      vertex -325 -224.36 48.3363 +    endloop +  endfacet +  facet normal 1.68221e-17 -0.993402 -0.114683 +    outer loop +      vertex 320.986 -224.769 51.8816 +      vertex 325 -224.974 53.6594 +      vertex -325 -224.36 48.3363 +    endloop +  endfacet +  facet normal 2.53115e-17 -0.993402 -0.114683 +    outer loop +      vertex 318.876 -224.36 48.3363 +      vertex 320.986 -224.769 51.8816 +      vertex -325 -224.36 48.3363 +    endloop +  endfacet +  facet normal 1.17287e-14 -0.993402 -0.114683 +    outer loop +      vertex 320.986 -224.769 51.8816 +      vertex 325 -224.923 53.2143 +      vertex 325 -224.974 53.6594 +    endloop +  endfacet +  facet normal 5.84835e-17 -0.964254 -0.264981 +    outer loop +      vertex 318.876 -224.36 48.3363 +      vertex -325 -224.36 48.3363 +      vertex -325 -222.94 43.1694 +    endloop +  endfacet +  facet normal 1.22704e-16 -0.964254 -0.264981 +    outer loop +      vertex 315.726 -223.749 46.1132 +      vertex 318.876 -224.36 48.3363 +      vertex -325 -222.94 43.1694 +    endloop +  endfacet +  facet normal 5.89784e-17 -0.964254 -0.264981 +    outer loop +      vertex 313.473 -222.94 43.1694 +      vertex 315.726 -223.749 46.1132 +      vertex -325 -222.94 43.1694 +    endloop +  endfacet +  facet normal 9.10487e-17 -0.912504 -0.409069 +    outer loop +      vertex 313.473 -222.94 43.1694 +      vertex -325 -222.94 43.1694 +      vertex -325 -220.748 38.2798 +    endloop +  endfacet +  facet normal 1.0433e-16 -0.912504 -0.409069 +    outer loop +      vertex 310.683 -221.938 40.9336 +      vertex 313.473 -222.94 43.1694 +      vertex -325 -220.748 38.2798 +    endloop +  endfacet +  facet normal 9.17642e-17 -0.912504 -0.409069 +    outer loop +      vertex 308.495 -220.748 38.2798 +      vertex 310.683 -221.938 40.9336 +      vertex -325 -220.748 38.2798 +    endloop +  endfacet +  facet normal 1.21936e-16 -0.839365 -0.543568 +    outer loop +      vertex 308.495 -220.748 38.2798 +      vertex -325 -220.748 38.2798 +      vertex -325 -217.835 33.7821 +    endloop +  endfacet +  facet normal 1.49216e-16 -0.839365 -0.543568 +    outer loop +      vertex 305.975 -219.378 36.1641 +      vertex 308.495 -220.748 38.2798 +      vertex -325 -217.835 33.7821 +    endloop +  endfacet +  facet normal 1.22816e-16 -0.839365 -0.543568 +    outer loop +      vertex 303.952 -217.835 33.7821 +      vertex 305.975 -219.378 36.1641 +      vertex -325 -217.835 33.7821 +    endloop +  endfacet +  facet normal 1.50327e-16 -0.746553 -0.665326 +    outer loop +      vertex 303.952 -217.835 33.7821 +      vertex -325 -217.835 33.7821 +      vertex -325 -214.27 29.7817 +    endloop +  endfacet +  facet normal 1.25683e-16 -0.746553 -0.665326 +    outer loop +      vertex 301.714 -216.129 31.868 +      vertex 303.952 -217.835 33.7821 +      vertex -325 -214.27 29.7817 +    endloop +  endfacet +  facet normal 1.47513e-16 -0.746553 -0.665326 +    outer loop +      vertex 299.924 -214.27 29.7817 +      vertex 301.714 -216.129 31.868 +      vertex -325 -214.27 29.7817 +    endloop +  endfacet +  facet normal 1.71052e-16 -0.636242 -0.771489 +    outer loop +      vertex -325 -214.27 29.7817 +      vertex -325 -210.136 26.3725 +      vertex 299.924 -214.27 29.7817 +    endloop +  endfacet +  facet normal 1.72179e-16 -0.636242 -0.771489 +    outer loop +      vertex 297.998 -212.268 28.131 +      vertex -325 -210.136 26.3725 +      vertex 296.498 -210.136 26.3725 +    endloop +  endfacet +  facet normal 1.26799e-16 -0.636242 -0.771489 +    outer loop +      vertex 299.924 -214.27 29.7817 +      vertex -325 -210.136 26.3725 +      vertex 297.998 -212.268 28.131 +    endloop +  endfacet +  facet normal 1.91631e-16 -0.511019 -0.85957 +    outer loop +      vertex -325 -210.136 26.3725 +      vertex -325 -205.53 23.6342 +      vertex 296.498 -210.136 26.3725 +    endloop +  endfacet +  facet normal 1.92508e-16 -0.511019 -0.85957 +    outer loop +      vertex 294.915 -207.886 25.0345 +      vertex -325 -205.53 23.6342 +      vertex 293.749 -205.53 23.6342 +    endloop +  endfacet +  facet normal 1.90947e-16 -0.511019 -0.85957 +    outer loop +      vertex 296.498 -210.136 26.3725 +      vertex -325 -205.53 23.6342 +      vertex 294.915 -207.886 25.0345 +    endloop +  endfacet +  facet normal 2.07695e-16 -0.373817 -0.927502 +    outer loop +      vertex -325 -205.53 23.6342 +      vertex -325 -200.56 21.6311 +      vertex 293.749 -205.53 23.6342 +    endloop +  endfacet +  facet normal 2.08294e-16 -0.373817 -0.927502 +    outer loop +      vertex 292.537 -203.084 22.6481 +      vertex -325 -200.56 21.6311 +      vertex 291.739 -200.56 21.6311 +    endloop +  endfacet +  facet normal 1.97778e-16 -0.373817 -0.927502 +    outer loop +      vertex 293.749 -205.53 23.6342 +      vertex -325 -200.56 21.6311 +      vertex 292.537 -203.084 22.6481 +    endloop +  endfacet +  facet normal 2.18749e-16 -0.227853 -0.973695 +    outer loop +      vertex -325 -200.56 21.6311 +      vertex -325 -195.343 20.4102 +      vertex 291.739 -200.56 21.6311 +    endloop +  endfacet +  facet normal 2.19257e-16 -0.227853 -0.973695 +    outer loop +      vertex 290.921 -197.975 21.0261 +      vertex -325 -195.343 20.4102 +      vertex 290.514 -195.343 20.4102 +    endloop +  endfacet +  facet normal 2.22429e-16 -0.227853 -0.973695 +    outer loop +      vertex 291.739 -200.56 21.6311 +      vertex -325 -195.343 20.4102 +      vertex 290.921 -197.975 21.0261 +    endloop +  endfacet +  facet normal 2.24445e-16 -0.0765492 -0.997066 +    outer loop +      vertex -325 -195.343 20.4102 +      vertex -325 -190 20 +      vertex 290.514 -195.343 20.4102 +    endloop +  endfacet +  facet normal 2.24618e-16 -0.0765492 -0.997066 +    outer loop +      vertex 290.103 -192.679 20.2057 +      vertex -325 -190 20 +      vertex 290.103 -190 20 +    endloop +  endfacet +  facet normal 2.20957e-16 -0.0765492 -0.997066 +    outer loop +      vertex 290.514 -195.343 20.4102 +      vertex -325 -190 20 +      vertex 290.103 -192.679 20.2057 +    endloop +  endfacet +  facet normal 2.24445e-16 0.0765492 -0.997066 +    outer loop +      vertex -325 -184.657 20.4102 +      vertex 290.514 -184.657 20.4102 +      vertex -325 -190 20 +    endloop +  endfacet +  facet normal 2.17441e-16 0.0765492 -0.997066 +    outer loop +      vertex -325 -190 20 +      vertex 290.514 -184.657 20.4102 +      vertex 290.103 -187.321 20.2057 +    endloop +  endfacet +  facet normal 2.24595e-16 0.0765492 -0.997066 +    outer loop +      vertex -325 -190 20 +      vertex 290.103 -187.321 20.2057 +      vertex 290.103 -190 20 +    endloop +  endfacet +  facet normal 2.18749e-16 0.227853 -0.973695 +    outer loop +      vertex -325 -179.44 21.6311 +      vertex 291.739 -179.44 21.6311 +      vertex -325 -184.657 20.4102 +    endloop +  endfacet +  facet normal 2.22429e-16 0.227853 -0.973695 +    outer loop +      vertex -325 -184.657 20.4102 +      vertex 291.739 -179.44 21.6311 +      vertex 290.921 -182.025 21.0261 +    endloop +  endfacet +  facet normal 2.19185e-16 0.227853 -0.973695 +    outer loop +      vertex -325 -184.657 20.4102 +      vertex 290.921 -182.025 21.0261 +      vertex 290.514 -184.657 20.4102 +    endloop +  endfacet +  facet normal 2.07695e-16 0.373817 -0.927502 +    outer loop +      vertex -325 -174.47 23.6342 +      vertex 293.749 -174.47 23.6342 +      vertex -325 -179.44 21.6311 +    endloop +  endfacet +  facet normal 1.97778e-16 0.373817 -0.927502 +    outer loop +      vertex -325 -179.44 21.6311 +      vertex 293.749 -174.47 23.6342 +      vertex 292.537 -176.916 22.6481 +    endloop +  endfacet +  facet normal 2.08372e-16 0.373817 -0.927502 +    outer loop +      vertex -325 -179.44 21.6311 +      vertex 292.537 -176.916 22.6481 +      vertex 291.739 -179.44 21.6311 +    endloop +  endfacet +  facet normal 1.91631e-16 0.511019 -0.85957 +    outer loop +      vertex -325 -169.864 26.3725 +      vertex 296.498 -169.864 26.3725 +      vertex -325 -174.47 23.6342 +    endloop +  endfacet +  facet normal 1.90947e-16 0.511019 -0.85957 +    outer loop +      vertex -325 -174.47 23.6342 +      vertex 296.498 -169.864 26.3725 +      vertex 294.915 -172.114 25.0345 +    endloop +  endfacet +  facet normal 1.92483e-16 0.511019 -0.85957 +    outer loop +      vertex -325 -174.47 23.6342 +      vertex 294.915 -172.114 25.0345 +      vertex 293.749 -174.47 23.6342 +    endloop +  endfacet +  facet normal 1.71052e-16 0.636242 -0.771489 +    outer loop +      vertex -325 -165.73 29.7817 +      vertex 299.924 -165.73 29.7817 +      vertex -325 -169.864 26.3725 +    endloop +  endfacet +  facet normal 1.86891e-16 0.636242 -0.771489 +    outer loop +      vertex -325 -169.864 26.3725 +      vertex 299.924 -165.73 29.7817 +      vertex 297.998 -167.732 28.131 +    endloop +  endfacet +  facet normal 1.71995e-16 0.636242 -0.771489 +    outer loop +      vertex -325 -169.864 26.3725 +      vertex 297.998 -167.732 28.131 +      vertex 296.498 -169.864 26.3725 +    endloop +  endfacet +  facet normal 1.51967e-16 0.746553 -0.665326 +    outer loop +      vertex -325 -162.165 33.7821 +      vertex 297.165 -162.165 33.7821 +      vertex -325 -165.73 29.7817 +    endloop +  endfacet +  facet normal 1.21318e-16 0.746553 -0.665326 +    outer loop +      vertex -325 -165.73 29.7817 +      vertex 297.165 -162.165 33.7821 +      vertex 300.319 -165.319 30.2424 +    endloop +  endfacet +  facet normal 1.47513e-16 0.746553 -0.665326 +    outer loop +      vertex -325 -165.73 29.7817 +      vertex 300.319 -165.319 30.2424 +      vertex 299.924 -165.73 29.7817 +    endloop +  endfacet +  facet normal 1.2474e-16 0.839365 -0.543568 +    outer loop +      vertex -325 -159.252 38.2798 +      vertex 294.252 -159.252 38.2798 +      vertex -325 -162.165 33.7821 +    endloop +  endfacet +  facet normal 1.24156e-16 0.839365 -0.543568 +    outer loop +      vertex -325 -162.165 33.7821 +      vertex 294.252 -159.252 38.2798 +      vertex 297.165 -162.165 33.7821 +    endloop +  endfacet +  facet normal 8.94978e-17 0.912504 -0.409069 +    outer loop +      vertex -325 -157.06 43.1694 +      vertex 292.06 -157.06 43.1694 +      vertex -325 -159.252 38.2798 +    endloop +  endfacet +  facet normal 9.38748e-17 0.912504 -0.409069 +    outer loop +      vertex -325 -159.252 38.2798 +      vertex 292.06 -157.06 43.1694 +      vertex 294.252 -159.252 38.2798 +    endloop +  endfacet +  facet normal 5.81075e-17 0.964254 -0.264981 +    outer loop +      vertex -325 -155.64 48.3363 +      vertex 290.64 -155.64 48.3363 +      vertex -325 -157.06 43.1694 +    endloop +  endfacet +  facet normal 5.79738e-17 0.964254 -0.264981 +    outer loop +      vertex -325 -157.06 43.1694 +      vertex 290.64 -155.64 48.3363 +      vertex 292.06 -157.06 43.1694 +    endloop +  endfacet +  facet normal 2.51739e-17 0.993402 -0.114683 +    outer loop +      vertex -325 -155.026 53.6594 +      vertex 290.026 -155.026 53.6594 +      vertex -325 -155.64 48.3363 +    endloop +  endfacet +  facet normal 2.51488e-17 0.993402 -0.114683 +    outer loop +      vertex -325 -155.64 48.3363 +      vertex 290.026 -155.026 53.6594 +      vertex 290.64 -155.64 48.3363 +    endloop +  endfacet +  facet normal -8.84731e-18 0.999266 0.0383027 +    outer loop +      vertex -325 -155.231 59.0139 +      vertex 290.231 -155.231 59.0139 +      vertex -325 -155.026 53.6594 +    endloop +  endfacet +  facet normal -8.40775e-18 0.999266 0.0383027 +    outer loop +      vertex -325 -155.026 53.6594 +      vertex 290.231 -155.231 59.0139 +      vertex 290.026 -155.026 53.6594 +    endloop +  endfacet +  facet normal -4.39045e-17 0.981708 0.190391 +    outer loop +      vertex -325 -156.251 64.2744 +      vertex 291.251 -156.251 64.2744 +      vertex -325 -155.231 59.0139 +    endloop +  endfacet +  facet normal -4.39773e-17 0.981708 0.190391 +    outer loop +      vertex -325 -155.231 59.0139 +      vertex 291.251 -156.251 64.2744 +      vertex 290.231 -155.231 59.0139 +    endloop +  endfacet +  facet normal -7.77188e-17 0.94114 0.338017 +    outer loop +      vertex -325 -158.062 69.3174 +      vertex 293.062 -158.062 69.3174 +      vertex -325 -156.251 64.2744 +    endloop +  endfacet +  facet normal -7.79472e-17 0.94114 0.338017 +    outer loop +      vertex -325 -156.251 64.2744 +      vertex 293.062 -158.062 69.3174 +      vertex 291.251 -156.251 64.2744 +    endloop +  endfacet +  facet normal -1.09387e-16 0.878512 0.47772 +    outer loop +      vertex -325 -160.622 74.0249 +      vertex 295.622 -160.622 74.0249 +      vertex -325 -158.062 69.3174 +    endloop +  endfacet +  facet normal -1.0984e-16 0.878512 0.47772 +    outer loop +      vertex -325 -158.062 69.3174 +      vertex 295.622 -160.622 74.0249 +      vertex 293.062 -158.062 69.3174 +    endloop +  endfacet +  facet normal -1.38089e-16 0.795293 0.606225 +    outer loop +      vertex -325 -163.871 78.2864 +      vertex 298.871 -163.871 78.2864 +      vertex -325 -160.622 74.0249 +    endloop +  endfacet +  facet normal -1.38812e-16 0.795293 0.606225 +    outer loop +      vertex -325 -160.622 74.0249 +      vertex 298.871 -163.871 78.2864 +      vertex 295.622 -160.622 74.0249 +    endloop +  endfacet +  facet normal -1.63183e-16 0.693432 0.720522 +    outer loop +      vertex -325 -163.871 78.2864 +      vertex -325 -167.732 82.0021 +      vertex 302.732 -167.732 82.0021 +    endloop +  endfacet +  facet normal -1.64124e-16 0.693432 0.720522 +    outer loop +      vertex 298.871 -163.871 78.2864 +      vertex -325 -163.871 78.2864 +      vertex 302.732 -167.732 82.0021 +    endloop +  endfacet +  facet normal -1.84078e-16 0.575319 0.817929 +    outer loop +      vertex -325 -167.732 82.0021 +      vertex -325 -172.114 85.0849 +      vertex 307.114 -172.114 85.0849 +    endloop +  endfacet +  facet normal -1.85166e-16 0.575319 0.817929 +    outer loop +      vertex 302.732 -167.732 82.0021 +      vertex -325 -167.732 82.0021 +      vertex 307.114 -172.114 85.0849 +    endloop +  endfacet +  facet normal -1.99867e-16 0.44372 0.896166 +    outer loop +      vertex -325 -172.114 85.0849 +      vertex -325 -176.916 87.4626 +      vertex 311.916 -176.916 87.4626 +    endloop +  endfacet +  facet normal -2.01471e-16 0.44372 0.896166 +    outer loop +      vertex 307.114 -172.114 85.0849 +      vertex -325 -172.114 85.0849 +      vertex 311.916 -176.916 87.4626 +    endloop +  endfacet +  facet normal -2.11185e-16 0.301721 0.953396 +    outer loop +      vertex -325 -176.916 87.4626 +      vertex -325 -182.025 89.0793 +      vertex 317.025 -182.025 89.0793 +    endloop +  endfacet +  facet normal -2.12721e-16 0.301721 0.953396 +    outer loop +      vertex 311.916 -176.916 87.4626 +      vertex -325 -176.916 87.4626 +      vertex 317.025 -182.025 89.0793 +    endloop +  endfacet +  facet normal -6.86625e-26 4.58045e-11 3.1406e-10 +    outer loop +      vertex 322.321 -187.321 89.8973 +      vertex -325 -187.321 89.8973 +      vertex 325 -187.321 89.8973 +    endloop +  endfacet +  facet normal -2.1893e-16 0.152649 0.98828 +    outer loop +      vertex 322.321 -187.321 89.8973 +      vertex 317.025 -182.025 89.0793 +      vertex -325 -182.025 89.0793 +    endloop +  endfacet +  facet normal -2.22516e-16 0.152649 0.98828 +    outer loop +      vertex -325 -182.025 89.0793 +      vertex -325 -187.321 89.8973 +      vertex 322.321 -187.321 89.8973 +    endloop +  endfacet +  facet normal 1 -0 0 +    outer loop +      vertex 325 -190 89.8973 +      vertex 325 -192.679 89.8973 +      vertex 325 -197.975 89.0793 +    endloop +  endfacet +  facet normal 7.55507e-14 -7.62041e-14 2.92096e-15 +    outer loop +      vertex 325 -224.974 53.6594 +      vertex 325 -224.923 55 +      vertex 325 -224.769 59.0139 +    endloop +  endfacet +  facet normal 3.80741e-13 0 0 +    outer loop +      vertex 325 -187.321 89.8973 +      vertex 325 -192.679 89.8973 +      vertex 325 -190 89.8973 +    endloop +  endfacet +  facet normal 1 -0 1.41616e-14 +    outer loop +      vertex 325 -190 55 +      vertex 325 -224.769 59.0139 +      vertex 325 -224.923 55 +    endloop +  endfacet +  facet normal 1 0 0 +    outer loop +      vertex 325 -224.923 53.2143 +      vertex 325 -224.923 55 +      vertex 325 -224.974 53.6594 +    endloop +  endfacet +  facet normal 1 -1.59908e-15 3.10124e-16 +    outer loop +      vertex 325 -190 55 +      vertex 325 -223.749 64.2744 +      vertex 325 -224.769 59.0139 +    endloop +  endfacet +  facet normal 1 -1.533e-15 5.50588e-16 +    outer loop +      vertex 325 -190 55 +      vertex 325 -221.938 69.3174 +      vertex 325 -223.749 64.2744 +    endloop +  endfacet +  facet normal 1 -1.43099e-15 7.78147e-16 +    outer loop +      vertex 325 -190 55 +      vertex 325 -219.378 74.0249 +      vertex 325 -221.938 69.3174 +    endloop +  endfacet +  facet normal 1 -1.29543e-15 9.87467e-16 +    outer loop +      vertex 325 -190 55 +      vertex 325 -216.129 78.2864 +      vertex 325 -219.378 74.0249 +    endloop +  endfacet +  facet normal 1 -1.12952e-15 1.17364e-15 +    outer loop +      vertex 325 -190 55 +      vertex 325 -212.268 82.0021 +      vertex 325 -216.129 78.2864 +    endloop +  endfacet +  facet normal 1 -9.37124e-16 1.33231e-15 +    outer loop +      vertex 325 -190 55 +      vertex 325 -207.886 85.0849 +      vertex 325 -212.268 82.0021 +    endloop +  endfacet +  facet normal 1 -7.22765e-16 1.45974e-15 +    outer loop +      vertex 325 -190 55 +      vertex 325 -203.084 87.4626 +      vertex 325 -207.886 85.0849 +    endloop +  endfacet +  facet normal 1 -4.91466e-16 1.55297e-15 +    outer loop +      vertex 325 -190 55 +      vertex 325 -197.975 89.0793 +      vertex 325 -203.084 87.4626 +    endloop +  endfacet +  facet normal 1 -1.6707e-16 1.62888e-15 +    outer loop +      vertex 325 -190 55 +      vertex 325 -190 89.8973 +      vertex 325 -197.975 89.0793 +    endloop +  endfacet +  facet normal -0.0383027 -0.999266 0 +    outer loop +      vertex 320.986 -224.769 51.8816 +      vertex 320.986 -224.769 0 +      vertex 326.341 -224.974 0 +    endloop +  endfacet +  facet normal -0.0383027 -0.999266 3.33645e-16 +    outer loop +      vertex 325 -224.923 53.2143 +      vertex 320.986 -224.769 51.8816 +      vertex 326.341 -224.974 0 +    endloop +  endfacet +  facet normal -0.0383027 -0.999266 0 +    outer loop +      vertex 326.341 -224.974 55 +      vertex 325 -224.923 53.2143 +      vertex 326.341 -224.974 0 +    endloop +  endfacet +  facet normal -0.0383027 -0.999266 0 +    outer loop +      vertex 325 -224.923 55 +      vertex 325 -224.923 53.2143 +      vertex 326.341 -224.974 55 +    endloop +  endfacet +  facet normal -0.190391 -0.981708 0 +    outer loop +      vertex 315.726 -223.749 46.1132 +      vertex 315.726 -223.749 0 +      vertex 320.986 -224.769 0 +    endloop +  endfacet +  facet normal -0.190391 -0.981708 -3.05543e-16 +    outer loop +      vertex 318.876 -224.36 48.3363 +      vertex 315.726 -223.749 46.1132 +      vertex 320.986 -224.769 0 +    endloop +  endfacet +  facet normal -0.190391 -0.981708 0 +    outer loop +      vertex 320.986 -224.769 51.8816 +      vertex 318.876 -224.36 48.3363 +      vertex 320.986 -224.769 0 +    endloop +  endfacet +  facet normal -0.338017 -0.94114 0 +    outer loop +      vertex 310.683 -221.938 40.9336 +      vertex 310.683 -221.938 0 +      vertex 315.726 -223.749 0 +    endloop +  endfacet +  facet normal -0.338017 -0.94114 -4.96188e-16 +    outer loop +      vertex 313.473 -222.94 43.1694 +      vertex 310.683 -221.938 40.9336 +      vertex 315.726 -223.749 0 +    endloop +  endfacet +  facet normal -0.338017 -0.94114 0 +    outer loop +      vertex 315.726 -223.749 46.1132 +      vertex 313.473 -222.94 43.1694 +      vertex 315.726 -223.749 0 +    endloop +  endfacet +  facet normal -0.47772 -0.878512 0 +    outer loop +      vertex 305.975 -219.378 36.1641 +      vertex 305.975 -219.378 0 +      vertex 310.683 -221.938 0 +    endloop +  endfacet +  facet normal -0.47772 -0.878512 -3.51231e-16 +    outer loop +      vertex 308.495 -220.748 38.2798 +      vertex 305.975 -219.378 36.1641 +      vertex 310.683 -221.938 0 +    endloop +  endfacet +  facet normal -0.47772 -0.878512 0 +    outer loop +      vertex 310.683 -221.938 40.9336 +      vertex 308.495 -220.748 38.2798 +      vertex 310.683 -221.938 0 +    endloop +  endfacet +  facet normal -0.606225 -0.795293 0 +    outer loop +      vertex 301.714 -216.129 31.868 +      vertex 301.714 -216.129 0 +      vertex 305.975 -219.378 0 +    endloop +  endfacet +  facet normal -0.606225 -0.795293 -7.19916e-16 +    outer loop +      vertex 303.952 -217.835 33.7821 +      vertex 301.714 -216.129 31.868 +      vertex 305.975 -219.378 0 +    endloop +  endfacet +  facet normal -0.606225 -0.795293 0 +    outer loop +      vertex 305.975 -219.378 36.1641 +      vertex 303.952 -217.835 33.7821 +      vertex 305.975 -219.378 0 +    endloop +  endfacet +  facet normal -0.720522 -0.693432 -0 +    outer loop +      vertex 297.998 -212.268 0 +      vertex 301.714 -216.129 0 +      vertex 297.998 -212.268 28.131 +    endloop +  endfacet +  facet normal -0.720522 -0.693432 0 +    outer loop +      vertex 299.924 -214.27 29.7817 +      vertex 301.714 -216.129 0 +      vertex 301.714 -216.129 31.868 +    endloop +  endfacet +  facet normal -0.720522 -0.693432 1.30682e-15 +    outer loop +      vertex 297.998 -212.268 28.131 +      vertex 301.714 -216.129 0 +      vertex 299.924 -214.27 29.7817 +    endloop +  endfacet +  facet normal -0.817929 -0.575319 -0 +    outer loop +      vertex 294.915 -207.886 0 +      vertex 297.998 -212.268 0 +      vertex 294.915 -207.886 25.0345 +    endloop +  endfacet +  facet normal -0.817929 -0.575319 0 +    outer loop +      vertex 296.498 -210.136 26.3725 +      vertex 297.998 -212.268 0 +      vertex 297.998 -212.268 28.131 +    endloop +  endfacet +  facet normal -0.817929 -0.575319 2.61604e-15 +    outer loop +      vertex 294.915 -207.886 25.0345 +      vertex 297.998 -212.268 0 +      vertex 296.498 -210.136 26.3725 +    endloop +  endfacet +  facet normal -0.896166 -0.44372 -0 +    outer loop +      vertex 292.537 -203.084 0 +      vertex 294.915 -207.886 0 +      vertex 292.537 -203.084 22.6481 +    endloop +  endfacet +  facet normal -0.896166 -0.44372 0 +    outer loop +      vertex 293.749 -205.53 23.6342 +      vertex 294.915 -207.886 0 +      vertex 294.915 -207.886 25.0345 +    endloop +  endfacet +  facet normal -0.896166 -0.44372 -1.27044e-15 +    outer loop +      vertex 292.537 -203.084 22.6481 +      vertex 294.915 -207.886 0 +      vertex 293.749 -205.53 23.6342 +    endloop +  endfacet +  facet normal -0.953396 -0.301721 -0 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 292.537 -203.084 0 +      vertex 290.921 -197.975 21.0261 +    endloop +  endfacet +  facet normal -0.953396 -0.301721 0 +    outer loop +      vertex 291.739 -200.56 21.6311 +      vertex 292.537 -203.084 0 +      vertex 292.537 -203.084 22.6481 +    endloop +  endfacet +  facet normal -0.953396 -0.301721 -2.96261e-15 +    outer loop +      vertex 290.921 -197.975 21.0261 +      vertex 292.537 -203.084 0 +      vertex 291.739 -200.56 21.6311 +    endloop +  endfacet +  facet normal -0.98828 -0.152649 -0 +    outer loop +      vertex 290.103 -192.679 0 +      vertex 290.921 -197.975 0 +      vertex 290.103 -192.679 20.2057 +    endloop +  endfacet +  facet normal -0.98828 -0.152649 0 +    outer loop +      vertex 290.514 -195.343 20.4102 +      vertex 290.921 -197.975 0 +      vertex 290.921 -197.975 21.0261 +    endloop +  endfacet +  facet normal -0.98828 -0.152649 -1.79868e-15 +    outer loop +      vertex 290.103 -192.679 20.2057 +      vertex 290.921 -197.975 0 +      vertex 290.514 -195.343 20.4102 +    endloop +  endfacet +  facet normal -1 -0 -0 +    outer loop +      vertex 290.103 -192.679 0 +      vertex 290.103 -192.679 20.2057 +      vertex 290.103 -187.321 0 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex 290.103 -187.321 0 +      vertex 290.103 -192.679 20.2057 +      vertex 290.103 -190 20 +    endloop +  endfacet +  facet normal -1 0 0 +    outer loop +      vertex 290.103 -187.321 0 +      vertex 290.103 -190 20 +      vertex 290.103 -187.321 20.2057 +    endloop +  endfacet +  facet normal -0.98828 0.152649 0 +    outer loop +      vertex 290.103 -187.321 0 +      vertex 290.103 -187.321 20.2057 +      vertex 290.921 -182.025 0 +    endloop +  endfacet +  facet normal -0.98828 0.152649 -1.79868e-15 +    outer loop +      vertex 290.921 -182.025 0 +      vertex 290.103 -187.321 20.2057 +      vertex 290.514 -184.657 20.4102 +    endloop +  endfacet +  facet normal -0.98828 0.152649 0 +    outer loop +      vertex 290.921 -182.025 0 +      vertex 290.514 -184.657 20.4102 +      vertex 290.921 -182.025 21.0261 +    endloop +  endfacet +  facet normal -0.953396 0.301721 0 +    outer loop +      vertex 290.921 -182.025 0 +      vertex 290.921 -182.025 21.0261 +      vertex 292.537 -176.916 0 +    endloop +  endfacet +  facet normal -0.953396 0.301721 -2.96261e-15 +    outer loop +      vertex 292.537 -176.916 0 +      vertex 290.921 -182.025 21.0261 +      vertex 291.739 -179.44 21.6311 +    endloop +  endfacet +  facet normal -0.953396 0.301721 0 +    outer loop +      vertex 292.537 -176.916 0 +      vertex 291.739 -179.44 21.6311 +      vertex 292.537 -176.916 22.6481 +    endloop +  endfacet +  facet normal -0.896166 0.44372 0 +    outer loop +      vertex 292.537 -176.916 0 +      vertex 292.537 -176.916 22.6481 +      vertex 294.915 -172.114 0 +    endloop +  endfacet +  facet normal -0.896166 0.44372 -1.27044e-15 +    outer loop +      vertex 294.915 -172.114 0 +      vertex 292.537 -176.916 22.6481 +      vertex 293.749 -174.47 23.6342 +    endloop +  endfacet +  facet normal -0.896166 0.44372 0 +    outer loop +      vertex 294.915 -172.114 0 +      vertex 293.749 -174.47 23.6342 +      vertex 294.915 -172.114 25.0345 +    endloop +  endfacet +  facet normal -0.817929 0.575319 0 +    outer loop +      vertex 294.915 -172.114 0 +      vertex 294.915 -172.114 25.0345 +      vertex 297.998 -167.732 0 +    endloop +  endfacet +  facet normal -0.817929 0.575319 2.0321e-15 +    outer loop +      vertex 297.998 -167.732 0 +      vertex 294.915 -172.114 25.0345 +      vertex 296.498 -169.864 26.3725 +    endloop +  endfacet +  facet normal -0.817929 0.575319 0 +    outer loop +      vertex 297.998 -167.732 0 +      vertex 296.498 -169.864 26.3725 +      vertex 297.998 -167.732 28.131 +    endloop +  endfacet +  facet normal -0.720522 0.693432 0 +    outer loop +      vertex 297.998 -167.732 0 +      vertex 297.998 -167.732 28.131 +      vertex 301.714 -163.871 0 +    endloop +  endfacet +  facet normal -0.720522 0.693432 7.24876e-16 +    outer loop +      vertex 301.714 -163.871 0 +      vertex 297.998 -167.732 28.131 +      vertex 299.924 -165.73 29.7817 +    endloop +  endfacet +  facet normal -0.720522 0.693432 -4.64722e-16 +    outer loop +      vertex 301.714 -163.871 0 +      vertex 299.924 -165.73 29.7817 +      vertex 300.319 -165.319 30.2424 +    endloop +  endfacet +  facet normal -0.720522 0.693432 -6.2779e-16 +    outer loop +      vertex 301.714 -163.871 0 +      vertex 300.319 -165.319 30.2424 +      vertex 300.73 -164.893 29.7817 +    endloop +  endfacet +  facet normal -0.720522 0.693432 0 +    outer loop +      vertex 301.714 -163.871 0 +      vertex 300.73 -164.893 29.7817 +      vertex 301.714 -163.871 28.9705 +    endloop +  endfacet +  facet normal -0.746553 -2.41005e-16 -0.665326 +    outer loop +      vertex 297.165 190 33.7821 +      vertex 300.73 190 29.7817 +      vertex 297.165 -162.165 33.7821 +    endloop +  endfacet +  facet normal -0.746553 -2.3913e-16 -0.665326 +    outer loop +      vertex 297.165 -162.165 33.7821 +      vertex 300.73 190 29.7817 +      vertex 300.73 -164.893 29.7817 +    endloop +  endfacet +  facet normal -0.746553 -1.52175e-14 -0.665326 +    outer loop +      vertex 297.165 -162.165 33.7821 +      vertex 300.73 -164.893 29.7817 +      vertex 300.319 -165.319 30.2424 +    endloop +  endfacet +  facet normal -0.839365 -1.36613e-16 -0.543568 +    outer loop +      vertex 294.252 190 38.2798 +      vertex 297.165 190 33.7821 +      vertex 294.252 -159.252 38.2798 +    endloop +  endfacet +  facet normal -0.839365 -2.45689e-16 -0.543568 +    outer loop +      vertex 294.252 -159.252 38.2798 +      vertex 297.165 190 33.7821 +      vertex 297.165 -162.165 33.7821 +    endloop +  endfacet +  facet normal -0.912504 -2.9891e-16 -0.409069 +    outer loop +      vertex 292.06 190 43.1694 +      vertex 294.252 190 38.2798 +      vertex 292.06 -157.06 43.1694 +    endloop +  endfacet +  facet normal -0.912504 -2.31602e-16 -0.409069 +    outer loop +      vertex 292.06 -157.06 43.1694 +      vertex 294.252 190 38.2798 +      vertex 294.252 -159.252 38.2798 +    endloop +  endfacet +  facet normal -0.964254 -3.17159e-16 -0.264981 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 292.06 190 43.1694 +      vertex 290.64 -155.64 48.3363 +    endloop +  endfacet +  facet normal -0.964254 -2.12528e-16 -0.264981 +    outer loop +      vertex 290.64 -155.64 48.3363 +      vertex 292.06 190 43.1694 +      vertex 292.06 -157.06 43.1694 +    endloop +  endfacet +  facet normal -0.993402 -1.63664e-16 -0.114683 +    outer loop +      vertex 290.026 190 53.6594 +      vertex 290.64 190 48.3363 +      vertex 290.026 -155.026 53.6594 +    endloop +  endfacet +  facet normal -0.993402 -1.87026e-16 -0.114683 +    outer loop +      vertex 290.026 -155.026 53.6594 +      vertex 290.64 190 48.3363 +      vertex 290.64 -155.64 48.3363 +    endloop +  endfacet +  facet normal -0.999266 -1.6463e-16 0.0383027 +    outer loop +      vertex 290.026 190 53.6594 +      vertex 290.026 -155.026 53.6594 +      vertex 290.231 190 59.0139 +    endloop +  endfacet +  facet normal -0.999266 -1.64532e-16 0.0383027 +    outer loop +      vertex 290.231 190 59.0139 +      vertex 290.026 -155.026 53.6594 +      vertex 290.231 -155.231 59.0139 +    endloop +  endfacet +  facet normal -0.981708 -1.61642e-16 0.190391 +    outer loop +      vertex 290.231 190 59.0139 +      vertex 290.231 -155.231 59.0139 +      vertex 291.251 190 64.2744 +    endloop +  endfacet +  facet normal -0.981708 -1.61165e-16 0.190391 +    outer loop +      vertex 291.251 190 64.2744 +      vertex 290.231 -155.231 59.0139 +      vertex 291.251 -156.251 64.2744 +    endloop +  endfacet +  facet normal -0.94114 -1.54505e-16 0.338017 +    outer loop +      vertex 291.251 190 64.2744 +      vertex 291.251 -156.251 64.2744 +      vertex 293.062 190 69.3174 +    endloop +  endfacet +  facet normal -0.94114 -1.53701e-16 0.338017 +    outer loop +      vertex 293.062 190 69.3174 +      vertex 291.251 -156.251 64.2744 +      vertex 293.062 -158.062 69.3174 +    endloop +  endfacet +  facet normal -0.878512 -1.43473e-16 0.47772 +    outer loop +      vertex 293.062 190 69.3174 +      vertex 293.062 -158.062 69.3174 +      vertex 295.622 190 74.0249 +    endloop +  endfacet +  facet normal -0.878512 -1.42426e-16 0.47772 +    outer loop +      vertex 295.622 190 74.0249 +      vertex 293.062 -158.062 69.3174 +      vertex 295.622 -160.622 74.0249 +    endloop +  endfacet +  facet normal -0.795293 -1.28934e-16 0.606225 +    outer loop +      vertex 295.622 190 74.0249 +      vertex 295.622 -160.622 74.0249 +      vertex 298.871 190 78.2864 +    endloop +  endfacet +  facet normal -0.795293 -1.27751e-16 0.606225 +    outer loop +      vertex 298.871 190 78.2864 +      vertex 295.622 -160.622 74.0249 +      vertex 298.871 -163.871 78.2864 +    endloop +  endfacet +  facet normal -0.693432 -1.11479e-16 0.720522 +    outer loop +      vertex 302.732 190 82.0021 +      vertex 298.871 190 78.2864 +      vertex 298.871 -163.871 78.2864 +    endloop +  endfacet +  facet normal -0.693432 -1.10186e-16 0.720522 +    outer loop +      vertex 302.732 -167.732 82.0021 +      vertex 302.732 190 82.0021 +      vertex 298.871 -163.871 78.2864 +    endloop +  endfacet +  facet normal -0.575319 -9.17422e-17 0.817929 +    outer loop +      vertex 307.114 190 85.0849 +      vertex 302.732 190 82.0021 +      vertex 302.732 -167.732 82.0021 +    endloop +  endfacet +  facet normal -0.575319 -1.80623e-16 0.817929 +    outer loop +      vertex 307.114 -172.114 85.0849 +      vertex 307.114 190 85.0849 +      vertex 302.732 -167.732 82.0021 +    endloop +  endfacet +  facet normal -0.44372 -1.39152e-16 0.896166 +    outer loop +      vertex 311.916 190 87.4626 +      vertex 307.114 190 85.0849 +      vertex 307.114 -172.114 85.0849 +    endloop +  endfacet +  facet normal -0.44372 -6.8742e-17 0.896166 +    outer loop +      vertex 311.916 -176.916 87.4626 +      vertex 311.916 190 87.4626 +      vertex 307.114 -172.114 85.0849 +    endloop +  endfacet +  facet normal -0.301721 -4.69816e-17 0.953396 +    outer loop +      vertex 317.025 190 89.0793 +      vertex 311.916 190 87.4626 +      vertex 311.916 -176.916 87.4626 +    endloop +  endfacet +  facet normal -0.301721 -4.61013e-17 0.953396 +    outer loop +      vertex 317.025 -182.025 89.0793 +      vertex 317.025 190 89.0793 +      vertex 311.916 -176.916 87.4626 +    endloop +  endfacet +  facet normal -0.152649 -2.36137e-17 0.98828 +    outer loop +      vertex 322.321 190 89.8973 +      vertex 317.025 190 89.0793 +      vertex 317.025 -182.025 89.0793 +    endloop +  endfacet +  facet normal -0.152649 -4.59933e-17 0.98828 +    outer loop +      vertex 322.321 -187.321 89.8973 +      vertex 322.321 190 89.8973 +      vertex 317.025 -182.025 89.0793 +    endloop +  endfacet +  facet normal 0 0 1 +    outer loop +      vertex 327.679 190 89.8973 +      vertex 322.321 190 89.8973 +      vertex 322.321 -187.321 89.8973 +    endloop +  endfacet +  facet normal 0 0 1 +    outer loop +      vertex 325 -190 89.8973 +      vertex 327.679 190 89.8973 +      vertex 325 -187.321 89.8973 +    endloop +  endfacet +  facet normal -0 0 1 +    outer loop +      vertex 325 -187.321 89.8973 +      vertex 327.679 190 89.8973 +      vertex 322.321 -187.321 89.8973 +    endloop +  endfacet +  facet normal -0 0 1 +    outer loop +      vertex 327.679 -190 89.8973 +      vertex 327.679 190 89.8973 +      vertex 325 -190 89.8973 +    endloop +  endfacet +  facet normal 1.06082e-14 -1 1.72794e-29 +    outer loop +      vertex 327.679 -190 89.8973 +      vertex 325 -190 89.8973 +      vertex 325 -190 55 +    endloop +  endfacet +  facet normal 0 -1 0 +    outer loop +      vertex 359.769 -190 59.0139 +      vertex 327.679 -190 89.8973 +      vertex 359.923 -190 55 +    endloop +  endfacet +  facet normal 8.13841e-16 -1 7.51956e-16 +    outer loop +      vertex 359.923 -190 55 +      vertex 327.679 -190 89.8973 +      vertex 325 -190 55 +    endloop +  endfacet +  facet normal 0 -1 0 +    outer loop +      vertex 358.749 -190 64.2744 +      vertex 327.679 -190 89.8973 +      vertex 359.769 -190 59.0139 +    endloop +  endfacet +  facet normal 0 -1 0 +    outer loop +      vertex 356.938 -190 69.3174 +      vertex 327.679 -190 89.8973 +      vertex 358.749 -190 64.2744 +    endloop +  endfacet +  facet normal 0 -1 0 +    outer loop +      vertex 354.378 -190 74.0249 +      vertex 327.679 -190 89.8973 +      vertex 356.938 -190 69.3174 +    endloop +  endfacet +  facet normal 0 -1 0 +    outer loop +      vertex 351.129 -190 78.2864 +      vertex 327.679 -190 89.8973 +      vertex 354.378 -190 74.0249 +    endloop +  endfacet +  facet normal 0 -1 0 +    outer loop +      vertex 347.268 -190 82.0021 +      vertex 327.679 -190 89.8973 +      vertex 351.129 -190 78.2864 +    endloop +  endfacet +  facet normal 0 -1 0 +    outer loop +      vertex 342.886 -190 85.0849 +      vertex 327.679 -190 89.8973 +      vertex 347.268 -190 82.0021 +    endloop +  endfacet +  facet normal 0 -1 0 +    outer loop +      vertex 338.084 -190 87.4626 +      vertex 327.679 -190 89.8973 +      vertex 342.886 -190 85.0849 +    endloop +  endfacet +  facet normal 0 -1 0 +    outer loop +      vertex 332.975 -190 89.0793 +      vertex 327.679 -190 89.8973 +      vertex 338.084 -190 87.4626 +    endloop +  endfacet +  facet normal 0 -0 1 +    outer loop +      vertex 325 -190 55 +      vertex 325 -224.923 55 +      vertex 326.341 -224.974 55 +    endloop +  endfacet +  facet normal -0 0 1 +    outer loop +      vertex 336.831 -222.94 55 +      vertex 325 -190 55 +      vertex 331.664 -224.36 55 +    endloop +  endfacet +  facet normal -0 0 1 +    outer loop +      vertex 331.664 -224.36 55 +      vertex 325 -190 55 +      vertex 326.341 -224.974 55 +    endloop +  endfacet +  facet normal -0 0 1 +    outer loop +      vertex 341.72 -220.748 55 +      vertex 325 -190 55 +      vertex 336.831 -222.94 55 +    endloop +  endfacet +  facet normal -0 0 1 +    outer loop +      vertex 346.218 -217.835 55 +      vertex 325 -190 55 +      vertex 341.72 -220.748 55 +    endloop +  endfacet +  facet normal -0 0 1 +    outer loop +      vertex 350.218 -214.27 55 +      vertex 325 -190 55 +      vertex 346.218 -217.835 55 +    endloop +  endfacet +  facet normal -0 0 1 +    outer loop +      vertex 353.628 -210.136 55 +      vertex 325 -190 55 +      vertex 350.218 -214.27 55 +    endloop +  endfacet +  facet normal -0 0 1 +    outer loop +      vertex 356.366 -205.53 55 +      vertex 325 -190 55 +      vertex 353.628 -210.136 55 +    endloop +  endfacet +  facet normal -0 0 1 +    outer loop +      vertex 358.369 -200.56 55 +      vertex 325 -190 55 +      vertex 356.366 -205.53 55 +    endloop +  endfacet +  facet normal -0 0 1 +    outer loop +      vertex 359.59 -195.343 55 +      vertex 325 -190 55 +      vertex 358.369 -200.56 55 +    endloop +  endfacet +  facet normal 0 0 1 +    outer loop +      vertex 360 -190 55 +      vertex 325 -190 55 +      vertex 359.59 -195.343 55 +    endloop +  endfacet +  facet normal 0 -0 9.9476e-13 +    outer loop +      vertex 359.923 -190 55 +      vertex 325 -190 55 +      vertex 360 -190 55 +    endloop +  endfacet +  facet normal 0 -0 1 +    outer loop +      vertex 359.923 -188.996 55 +      vertex 359.923 -190 55 +      vertex 360 -190 55 +    endloop +  endfacet +  facet normal 0.114683 -0.993402 0 +    outer loop +      vertex 326.341 -224.974 55 +      vertex 326.341 -224.974 0 +      vertex 331.664 -224.36 0 +    endloop +  endfacet +  facet normal 0.114683 -0.993402 0 +    outer loop +      vertex 331.664 -224.36 55 +      vertex 326.341 -224.974 55 +      vertex 331.664 -224.36 0 +    endloop +  endfacet +  facet normal -0 -0 -1 +    outer loop +      vertex 290.103 -192.679 0 +      vertex 290.103 -187.321 0 +      vertex 290.921 -197.975 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 290.103 -187.321 0 +      vertex 290.921 -182.025 0 +    endloop +  endfacet +  facet normal 0 -0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 290.921 -182.025 0 +      vertex 292.537 -176.916 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 292.537 -176.916 0 +      vertex 294.915 -172.114 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 294.915 -172.114 0 +      vertex 297.998 -167.732 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 297.998 -167.732 0 +      vertex 301.714 -163.871 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 301.714 -163.871 0 +      vertex 305.975 -160.622 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 305.975 -160.622 0 +      vertex 310.683 -158.062 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 310.683 -158.062 0 +      vertex 315.726 -156.251 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 315.726 -156.251 0 +      vertex 320.986 -155.231 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 320.986 -155.231 0 +      vertex 326.341 -155.026 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 326.341 -155.026 0 +      vertex 331.664 -155.64 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 331.664 -155.64 0 +      vertex 336.831 -157.06 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 336.831 -157.06 0 +      vertex 341.72 -159.252 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 341.72 -159.252 0 +      vertex 346.218 -162.165 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 346.218 -162.165 0 +      vertex 350.218 -165.73 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 350.218 -165.73 0 +      vertex 353.628 -169.864 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 353.628 -169.864 0 +      vertex 356.366 -174.47 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 356.366 -174.47 0 +      vertex 358.369 -179.44 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 358.369 -179.44 0 +      vertex 359.59 -184.657 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 359.59 -184.657 0 +      vertex 360 -190 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 360 -190 0 +      vertex 359.59 -195.343 0 +    endloop +  endfacet +  facet normal -0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 359.59 -195.343 0 +      vertex 358.369 -200.56 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 358.369 -200.56 0 +      vertex 356.366 -205.53 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 356.366 -205.53 0 +      vertex 353.628 -210.136 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 353.628 -210.136 0 +      vertex 350.218 -214.27 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 350.218 -214.27 0 +      vertex 346.218 -217.835 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 346.218 -217.835 0 +      vertex 341.72 -220.748 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 341.72 -220.748 0 +      vertex 336.831 -222.94 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 336.831 -222.94 0 +      vertex 331.664 -224.36 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 331.664 -224.36 0 +      vertex 326.341 -224.974 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 326.341 -224.974 0 +      vertex 320.986 -224.769 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 320.986 -224.769 0 +      vertex 315.726 -223.749 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 315.726 -223.749 0 +      vertex 310.683 -221.938 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 310.683 -221.938 0 +      vertex 305.975 -219.378 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 305.975 -219.378 0 +      vertex 301.714 -216.129 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 301.714 -216.129 0 +      vertex 297.998 -212.268 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 297.998 -212.268 0 +      vertex 294.915 -207.886 0 +    endloop +  endfacet +  facet normal 0 0 -1 +    outer loop +      vertex 290.921 -197.975 0 +      vertex 294.915 -207.886 0 +      vertex 292.537 -203.084 0 +    endloop +  endfacet +  facet normal -0.606225 0.795293 0 +    outer loop +      vertex 301.714 -163.871 0 +      vertex 301.714 -163.871 28.9705 +      vertex 305.975 -160.622 0 +    endloop +  endfacet +  facet normal -0.606225 0.795293 1.057e-16 +    outer loop +      vertex 305.975 -160.622 0 +      vertex 301.714 -163.871 28.9705 +      vertex 304.864 -161.469 26.3725 +    endloop +  endfacet +  facet normal -0.606225 0.795293 0 +    outer loop +      vertex 305.975 -160.622 0 +      vertex 304.864 -161.469 26.3725 +      vertex 305.975 -160.622 25.7118 +    endloop +  endfacet +  facet normal -0.636242 -2.03815e-16 -0.771489 +    outer loop +      vertex 300.73 190 29.7817 +      vertex 304.864 190 26.3725 +      vertex 300.73 -164.893 29.7817 +    endloop +  endfacet +  facet normal -0.636242 -2.05464e-16 -0.771489 +    outer loop +      vertex 301.714 -163.871 28.9705 +      vertex 304.864 190 26.3725 +      vertex 304.864 -161.469 26.3725 +    endloop +  endfacet +  facet normal -0.636242 -2.31456e-16 -0.771489 +    outer loop +      vertex 300.73 -164.893 29.7817 +      vertex 304.864 190 26.3725 +      vertex 301.714 -163.871 28.9705 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.026 190 53.6594 +      vertex 290.231 190 59.0139 +      vertex 290.64 190 48.3363 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 290.231 190 59.0139 +      vertex 291.251 190 64.2744 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 291.251 190 64.2744 +      vertex 293.062 190 69.3174 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 293.062 190 69.3174 +      vertex 295.622 190 74.0249 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 295.622 190 74.0249 +      vertex 298.871 190 78.2864 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 298.871 190 78.2864 +      vertex 302.732 190 82.0021 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 302.732 190 82.0021 +      vertex 307.114 190 85.0849 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 307.114 190 85.0849 +      vertex 311.916 190 87.4626 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 311.916 190 87.4626 +      vertex 317.025 190 89.0793 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 317.025 190 89.0793 +      vertex 322.321 190 89.8973 +    endloop +  endfacet +  facet normal -5.30409e-15 1 4.04313e-15 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 322.321 190 89.8973 +      vertex 327.679 190 89.8973 +    endloop +  endfacet +  facet normal -9.28472e-17 1 -6.0111e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 327.679 190 89.8973 +      vertex 332.975 190 89.0793 +    endloop +  endfacet +  facet normal -1.66134e-16 1 -5.24961e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 332.975 190 89.0793 +      vertex 338.084 190 87.4626 +    endloop +  endfacet +  facet normal -2.24739e-16 1 -4.53898e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 338.084 190 87.4626 +      vertex 342.886 190 85.0849 +    endloop +  endfacet +  facet normal -2.72002e-16 1 -3.86704e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 342.886 190 85.0849 +      vertex 347.268 190 82.0021 +    endloop +  endfacet +  facet normal -3.10249e-16 1 -3.22369e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 347.268 190 82.0021 +      vertex 351.129 190 78.2864 +    endloop +  endfacet +  facet normal -3.41119e-16 1 -2.60023e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 351.129 190 78.2864 +      vertex 354.378 190 74.0249 +    endloop +  endfacet +  facet normal -3.65757e-16 1 -1.98892e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 354.378 190 74.0249 +      vertex 356.938 190 69.3174 +    endloop +  endfacet +  facet normal -3.84946e-16 1 -1.38256e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 356.938 190 69.3174 +      vertex 358.749 190 64.2744 +    endloop +  endfacet +  facet normal -3.99183e-16 1 -7.7417e-17 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 358.749 190 64.2744 +      vertex 359.769 190 59.0139 +    endloop +  endfacet +  facet normal -4.08721e-16 1 -1.56666e-17 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 359.769 190 59.0139 +      vertex 359.974 190 53.6594 +    endloop +  endfacet +  facet normal -4.1359e-16 1 4.77469e-17 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 359.974 190 53.6594 +      vertex 359.36 190 48.3363 +    endloop +  endfacet +  facet normal -4.1359e-16 1 1.13656e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 359.36 190 48.3363 +      vertex 357.94 190 43.1694 +    endloop +  endfacet +  facet normal -4.08264e-16 1 1.83022e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 357.94 190 43.1694 +      vertex 355.748 190 38.2798 +    endloop +  endfacet +  facet normal -3.96839e-16 1 2.5699e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 355.748 190 38.2798 +      vertex 352.835 190 33.7821 +    endloop +  endfacet +  facet normal -3.78121e-16 1 3.3698e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 352.835 190 33.7821 +      vertex 349.27 190 29.7817 +    endloop +  endfacet +  facet normal -3.50329e-16 1 4.24799e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 349.27 190 29.7817 +      vertex 345.136 190 26.3725 +    endloop +  endfacet +  facet normal -3.10821e-16 1 5.22824e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 345.136 190 26.3725 +      vertex 340.53 190 23.6342 +    endloop +  endfacet +  facet normal -2.55637e-16 1 6.34277e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 340.53 190 23.6342 +      vertex 335.56 190 21.6311 +    endloop +  endfacet +  facet normal -1.78708e-16 1 7.63678e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 335.56 190 21.6311 +      vertex 330.343 190 20.4102 +    endloop +  endfacet +  facet normal -7.04476e-17 1 9.17591e-16 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 330.343 190 20.4102 +      vertex 325 190 20 +    endloop +  endfacet +  facet normal -5.78086e-15 1 -6.00669e-15 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 325 190 20 +      vertex 319.657 190 20.4102 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 319.657 190 20.4102 +      vertex 314.44 190 21.6311 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 314.44 190 21.6311 +      vertex 309.47 190 23.6342 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 309.47 190 23.6342 +      vertex 304.864 190 26.3725 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 304.864 190 26.3725 +      vertex 300.73 190 29.7817 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 300.73 190 29.7817 +      vertex 297.165 190 33.7821 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 297.165 190 33.7821 +      vertex 294.252 190 38.2798 +    endloop +  endfacet +  facet normal 0 1 0 +    outer loop +      vertex 290.64 190 48.3363 +      vertex 294.252 190 38.2798 +      vertex 292.06 190 43.1694 +    endloop +  endfacet +  facet normal 0.152649 4.5364e-17 0.98828 +    outer loop +      vertex 332.975 190 89.0793 +      vertex 327.679 190 89.8973 +      vertex 327.679 -190 89.8973 +    endloop +  endfacet +  facet normal 0.152649 2.28345e-17 0.98828 +    outer loop +      vertex 332.975 -190 89.0793 +      vertex 332.975 190 89.0793 +      vertex 327.679 -190 89.8973 +    endloop +  endfacet +  facet normal 0.301721 4.5364e-17 0.953396 +    outer loop +      vertex 338.084 190 87.4626 +      vertex 332.975 190 89.0793 +      vertex 332.975 -190 89.0793 +    endloop +  endfacet +  facet normal 0.301721 4.51338e-17 0.953396 +    outer loop +      vertex 338.084 -190 87.4626 +      vertex 338.084 190 87.4626 +      vertex 332.975 -190 89.0793 +    endloop +  endfacet +  facet normal 0.44372 6.63012e-17 0.896166 +    outer loop +      vertex 342.886 190 85.0849 +      vertex 338.084 190 87.4626 +      vertex 338.084 -190 87.4626 +    endloop +  endfacet +  facet normal 0.44372 6.63752e-17 0.896166 +    outer loop +      vertex 342.886 -190 85.0849 +      vertex 342.886 190 85.0849 +      vertex 338.084 -190 87.4626 +    endloop +  endfacet +  facet normal 0.575319 8.6366e-17 0.817929 +    outer loop +      vertex 347.268 190 82.0021 +      vertex 342.886 190 85.0849 +      vertex 342.886 -190 85.0849 +    endloop +  endfacet +  facet normal 0.575319 8.60607e-17 0.817929 +    outer loop +      vertex 347.268 -190 82.0021 +      vertex 347.268 190 82.0021 +      vertex 342.886 -190 85.0849 +    endloop +  endfacet +  facet normal 0.693432 1.03814e-16 0.720522 +    outer loop +      vertex 351.129 190 78.2864 +      vertex 347.268 190 82.0021 +      vertex 347.268 -190 82.0021 +    endloop +  endfacet +  facet normal 0.693432 2.07458e-16 0.720522 +    outer loop +      vertex 351.129 -190 78.2864 +      vertex 351.129 190 78.2864 +      vertex 347.268 -190 82.0021 +    endloop +  endfacet +  facet normal 0.795293 2.38161e-16 0.606225 +    outer loop +      vertex 354.378 190 74.0249 +      vertex 351.129 190 78.2864 +      vertex 351.129 -190 78.2864 +    endloop +  endfacet +  facet normal 0.795293 1.18966e-16 0.606225 +    outer loop +      vertex 354.378 -190 74.0249 +      vertex 354.378 190 74.0249 +      vertex 351.129 -190 78.2864 +    endloop +  endfacet +  facet normal 0.878512 1.3173e-16 0.47772 +    outer loop +      vertex 356.938 190 69.3174 +      vertex 354.378 190 74.0249 +      vertex 354.378 -190 74.0249 +    endloop +  endfacet +  facet normal 0.878512 2.6283e-16 0.47772 +    outer loop +      vertex 356.938 -190 69.3174 +      vertex 356.938 190 69.3174 +      vertex 354.378 -190 74.0249 +    endloop +  endfacet +  facet normal 0.94114 2.80908e-16 0.338017 +    outer loop +      vertex 358.749 190 64.2744 +      vertex 356.938 190 69.3174 +      vertex 356.938 -190 69.3174 +    endloop +  endfacet +  facet normal 0.94114 1.40783e-16 0.338017 +    outer loop +      vertex 358.749 -190 64.2744 +      vertex 358.749 190 64.2744 +      vertex 356.938 -190 69.3174 +    endloop +  endfacet +  facet normal 0.981708 1.46997e-16 0.190391 +    outer loop +      vertex 359.769 190 59.0139 +      vertex 358.749 190 64.2744 +      vertex 358.749 -190 64.2744 +    endloop +  endfacet +  facet normal 0.981708 1.46852e-16 0.190391 +    outer loop +      vertex 359.769 -190 59.0139 +      vertex 359.769 190 59.0139 +      vertex 358.749 -190 64.2744 +    endloop +  endfacet +  facet normal 0.999266 1.49505e-16 0.0383027 +    outer loop +      vertex 359.974 190 53.6594 +      vertex 359.769 190 59.0139 +      vertex 359.769 -190 59.0139 +    endloop +  endfacet +  facet normal 0.999266 3.09046e-16 0.0383027 +    outer loop +      vertex 359.923 -188.996 55 +      vertex 359.974 190 53.6594 +      vertex 359.769 -190 59.0139 +    endloop +  endfacet +  facet normal 0.999266 0 0.0383027 +    outer loop +      vertex 359.923 -190 55 +      vertex 359.923 -188.996 55 +      vertex 359.769 -190 59.0139 +    endloop +  endfacet +  facet normal 0.999266 1.49608e-16 0.0383027 +    outer loop +      vertex 359.923 -188.996 55 +      vertex 359.974 -189.665 53.6594 +      vertex 359.974 190 53.6594 +    endloop +  endfacet +  facet normal 0.997066 0.0765492 0 +    outer loop +      vertex 360 -190 0 +      vertex 359.59 -184.657 0 +      vertex 359.59 -184.657 50.3288 +    endloop +  endfacet +  facet normal 0.997066 0.0765492 -0 +    outer loop +      vertex 360 -190 55 +      vertex 360 -190 0 +      vertex 359.974 -189.665 53.6594 +    endloop +  endfacet +  facet normal 0.997066 0.0765492 1.06081e-15 +    outer loop +      vertex 359.974 -189.665 53.6594 +      vertex 360 -190 0 +      vertex 359.59 -184.657 50.3288 +    endloop +  endfacet +  facet normal 0.997066 0.0765492 -3.8686e-14 +    outer loop +      vertex 360 -190 55 +      vertex 359.974 -189.665 53.6594 +      vertex 359.923 -188.996 55 +    endloop +  endfacet +  facet normal 0.997066 -0.0765492 0 +    outer loop +      vertex 359.59 -195.343 55 +      vertex 359.59 -195.343 0 +      vertex 360 -190 0 +    endloop +  endfacet +  facet normal 0.997066 -0.0765492 0 +    outer loop +      vertex 360 -190 55 +      vertex 359.59 -195.343 55 +      vertex 360 -190 0 +    endloop +  endfacet +  facet normal 0.973695 -0.227853 0 +    outer loop +      vertex 358.369 -200.56 55 +      vertex 358.369 -200.56 0 +      vertex 359.59 -195.343 0 +    endloop +  endfacet +  facet normal 0.973695 -0.227853 0 +    outer loop +      vertex 359.59 -195.343 55 +      vertex 358.369 -200.56 55 +      vertex 359.59 -195.343 0 +    endloop +  endfacet +  facet normal 0.927502 -0.373817 0 +    outer loop +      vertex 356.366 -205.53 55 +      vertex 356.366 -205.53 0 +      vertex 358.369 -200.56 0 +    endloop +  endfacet +  facet normal 0.927502 -0.373817 0 +    outer loop +      vertex 358.369 -200.56 55 +      vertex 356.366 -205.53 55 +      vertex 358.369 -200.56 0 +    endloop +  endfacet +  facet normal 0.85957 -0.511019 0 +    outer loop +      vertex 353.628 -210.136 55 +      vertex 353.628 -210.136 0 +      vertex 356.366 -205.53 0 +    endloop +  endfacet +  facet normal 0.85957 -0.511019 0 +    outer loop +      vertex 356.366 -205.53 55 +      vertex 353.628 -210.136 55 +      vertex 356.366 -205.53 0 +    endloop +  endfacet +  facet normal 0.771489 -0.636242 0 +    outer loop +      vertex 350.218 -214.27 55 +      vertex 350.218 -214.27 0 +      vertex 353.628 -210.136 0 +    endloop +  endfacet +  facet normal 0.771489 -0.636242 0 +    outer loop +      vertex 353.628 -210.136 55 +      vertex 350.218 -214.27 55 +      vertex 353.628 -210.136 0 +    endloop +  endfacet +  facet normal 0.665326 -0.746553 0 +    outer loop +      vertex 346.218 -217.835 55 +      vertex 346.218 -217.835 0 +      vertex 350.218 -214.27 0 +    endloop +  endfacet +  facet normal 0.665326 -0.746553 0 +    outer loop +      vertex 350.218 -214.27 55 +      vertex 346.218 -217.835 55 +      vertex 350.218 -214.27 0 +    endloop +  endfacet +  facet normal 0.543568 -0.839365 0 +    outer loop +      vertex 341.72 -220.748 55 +      vertex 341.72 -220.748 0 +      vertex 346.218 -217.835 0 +    endloop +  endfacet +  facet normal 0.543568 -0.839365 0 +    outer loop +      vertex 346.218 -217.835 55 +      vertex 341.72 -220.748 55 +      vertex 346.218 -217.835 0 +    endloop +  endfacet +  facet normal 0.409069 -0.912504 0 +    outer loop +      vertex 336.831 -222.94 55 +      vertex 336.831 -222.94 0 +      vertex 341.72 -220.748 0 +    endloop +  endfacet +  facet normal 0.409069 -0.912504 0 +    outer loop +      vertex 341.72 -220.748 55 +      vertex 336.831 -222.94 55 +      vertex 341.72 -220.748 0 +    endloop +  endfacet +  facet normal 0.264981 -0.964254 0 +    outer loop +      vertex 331.664 -224.36 55 +      vertex 331.664 -224.36 0 +      vertex 336.831 -222.94 0 +    endloop +  endfacet +  facet normal 0.264981 -0.964254 0 +    outer loop +      vertex 336.831 -222.94 55 +      vertex 331.664 -224.36 55 +      vertex 336.831 -222.94 0 +    endloop +  endfacet +  facet normal 0.973695 0.227853 0 +    outer loop +      vertex 359.59 -184.657 0 +      vertex 358.369 -179.44 0 +      vertex 358.369 -179.44 44.7304 +    endloop +  endfacet +  facet normal 0.973695 0.227853 -0 +    outer loop +      vertex 359.59 -184.657 50.3288 +      vertex 359.59 -184.657 0 +      vertex 359.36 -183.674 48.3363 +    endloop +  endfacet +  facet normal 0.973695 0.227853 -2.08701e-16 +    outer loop +      vertex 359.36 -183.674 48.3363 +      vertex 359.59 -184.657 0 +      vertex 358.369 -179.44 44.7304 +    endloop +  endfacet +  facet normal 0.927502 0.373817 0 +    outer loop +      vertex 358.369 -179.44 0 +      vertex 356.366 -174.47 0 +      vertex 356.366 -174.47 39.6581 +    endloop +  endfacet +  facet normal 0.927502 0.373817 -0 +    outer loop +      vertex 358.369 -179.44 44.7304 +      vertex 358.369 -179.44 0 +      vertex 357.94 -178.375 43.1694 +    endloop +  endfacet +  facet normal 0.927502 0.373817 -5.52089e-16 +    outer loop +      vertex 357.94 -178.375 43.1694 +      vertex 358.369 -179.44 0 +      vertex 356.366 -174.47 39.6581 +    endloop +  endfacet +  facet normal 0.85957 0.511019 0 +    outer loop +      vertex 356.366 -174.47 0 +      vertex 353.628 -169.864 0 +      vertex 353.628 -169.864 35.0055 +    endloop +  endfacet +  facet normal 0.85957 0.511019 -0 +    outer loop +      vertex 356.366 -174.47 39.6581 +      vertex 356.366 -174.47 0 +      vertex 355.748 -173.431 38.2798 +    endloop +  endfacet +  facet normal 0.85957 0.511019 1.12116e-15 +    outer loop +      vertex 355.748 -173.431 38.2798 +      vertex 356.366 -174.47 0 +      vertex 353.628 -169.864 35.0055 +    endloop +  endfacet +  facet normal 0.771489 0.636242 0 +    outer loop +      vertex 353.628 -169.864 0 +      vertex 350.218 -165.73 0 +      vertex 350.218 -165.73 30.8456 +    endloop +  endfacet +  facet normal 0.771489 0.636242 -0 +    outer loop +      vertex 353.628 -169.864 35.0055 +      vertex 353.628 -169.864 0 +      vertex 352.835 -168.903 33.7821 +    endloop +  endfacet +  facet normal 0.771489 0.636242 -5.107e-16 +    outer loop +      vertex 352.835 -168.903 33.7821 +      vertex 353.628 -169.864 0 +      vertex 350.218 -165.73 30.8456 +    endloop +  endfacet +  facet normal 0.665326 0.746553 0 +    outer loop +      vertex 346.218 -162.165 0 +      vertex 346.218 -162.165 27.2646 +      vertex 350.218 -165.73 0 +    endloop +  endfacet +  facet normal 0.665326 0.746553 -6.50365e-16 +    outer loop +      vertex 350.218 -165.73 0 +      vertex 346.218 -162.165 27.2646 +      vertex 349.27 -164.885 29.7817 +    endloop +  endfacet +  facet normal 0.665326 0.746553 0 +    outer loop +      vertex 350.218 -165.73 0 +      vertex 349.27 -164.885 29.7817 +      vertex 350.218 -165.73 30.8456 +    endloop +  endfacet +  facet normal 0.543568 0.839365 0 +    outer loop +      vertex 341.72 -159.252 0 +      vertex 341.72 -159.252 24.3417 +      vertex 346.218 -162.165 0 +    endloop +  endfacet +  facet normal 0.543568 0.839365 -1.52278e-15 +    outer loop +      vertex 346.218 -162.165 0 +      vertex 341.72 -159.252 24.3417 +      vertex 345.136 -161.464 26.3725 +    endloop +  endfacet +  facet normal 0.543568 0.839365 0 +    outer loop +      vertex 346.218 -162.165 0 +      vertex 345.136 -161.464 26.3725 +      vertex 346.218 -162.165 27.2646 +    endloop +  endfacet +  facet normal 0.409069 0.912504 0 +    outer loop +      vertex 336.831 -157.06 0 +      vertex 336.831 -157.06 22.1431 +      vertex 341.72 -159.252 0 +    endloop +  endfacet +  facet normal 0.409069 0.912504 7.26781e-16 +    outer loop +      vertex 341.72 -159.252 0 +      vertex 336.831 -157.06 22.1431 +      vertex 340.53 -158.719 23.6342 +    endloop +  endfacet +  facet normal 0.409069 0.912504 0 +    outer loop +      vertex 341.72 -159.252 0 +      vertex 340.53 -158.719 23.6342 +      vertex 341.72 -159.252 24.3417 +    endloop +  endfacet +  facet normal 0.264981 0.964254 0 +    outer loop +      vertex 331.664 -155.64 0 +      vertex 331.664 -155.64 20.7193 +      vertex 336.831 -157.06 0 +    endloop +  endfacet +  facet normal 0.264981 0.964254 -5.9638e-16 +    outer loop +      vertex 336.831 -157.06 0 +      vertex 331.664 -155.64 20.7193 +      vertex 335.56 -156.711 21.6311 +    endloop +  endfacet +  facet normal 0.264981 0.964254 0 +    outer loop +      vertex 336.831 -157.06 0 +      vertex 335.56 -156.711 21.6311 +      vertex 336.831 -157.06 22.1431 +    endloop +  endfacet +  facet normal 0.114683 0.993402 0 +    outer loop +      vertex 326.341 -155.026 0 +      vertex 326.341 -155.026 20.1029 +      vertex 331.664 -155.64 0 +    endloop +  endfacet +  facet normal 0.114683 0.993402 -1.32471e-15 +    outer loop +      vertex 331.664 -155.64 0 +      vertex 326.341 -155.026 20.1029 +      vertex 330.343 -155.488 20.4102 +    endloop +  endfacet +  facet normal 0.114683 0.993402 0 +    outer loop +      vertex 331.664 -155.64 0 +      vertex 330.343 -155.488 20.4102 +      vertex 331.664 -155.64 20.7193 +    endloop +  endfacet +  facet normal -0.0383027 0.999266 0 +    outer loop +      vertex 320.986 -155.231 0 +      vertex 320.986 -155.231 20.3082 +      vertex 326.341 -155.026 0 +    endloop +  endfacet +  facet normal -0.0383027 0.999266 9.00137e-16 +    outer loop +      vertex 326.341 -155.026 0 +      vertex 320.986 -155.231 20.3082 +      vertex 325 -155.077 20 +    endloop +  endfacet +  facet normal -0.0383027 0.999266 0 +    outer loop +      vertex 326.341 -155.026 0 +      vertex 325 -155.077 20 +      vertex 326.341 -155.026 20.1029 +    endloop +  endfacet +  facet normal -0.190391 0.981708 0 +    outer loop +      vertex 315.726 -156.251 0 +      vertex 315.726 -156.251 21.3302 +      vertex 320.986 -155.231 0 +    endloop +  endfacet +  facet normal -0.190391 0.981708 5.18595e-16 +    outer loop +      vertex 320.986 -155.231 0 +      vertex 315.726 -156.251 21.3302 +      vertex 319.657 -155.489 20.4102 +    endloop +  endfacet +  facet normal -0.190391 0.981708 0 +    outer loop +      vertex 320.986 -155.231 0 +      vertex 319.657 -155.489 20.4102 +      vertex 320.986 -155.231 20.3082 +    endloop +  endfacet +  facet normal -0.338017 0.94114 0 +    outer loop +      vertex 310.683 -158.062 0 +      vertex 310.683 -158.062 23.1454 +      vertex 315.726 -156.251 0 +    endloop +  endfacet +  facet normal -0.338017 0.94114 -1.04323e-15 +    outer loop +      vertex 315.726 -156.251 0 +      vertex 310.683 -158.062 23.1454 +      vertex 314.44 -156.713 21.6311 +    endloop +  endfacet +  facet normal -0.338017 0.94114 0 +    outer loop +      vertex 315.726 -156.251 0 +      vertex 314.44 -156.713 21.6311 +      vertex 315.726 -156.251 21.3302 +    endloop +  endfacet +  facet normal -0.47772 0.878512 0 +    outer loop +      vertex 305.975 -160.622 0 +      vertex 305.975 -160.622 25.7118 +      vertex 310.683 -158.062 0 +    endloop +  endfacet +  facet normal -0.47772 0.878512 1.94888e-16 +    outer loop +      vertex 310.683 -158.062 0 +      vertex 305.975 -160.622 25.7118 +      vertex 309.47 -158.722 23.6342 +    endloop +  endfacet +  facet normal -0.47772 0.878512 0 +    outer loop +      vertex 310.683 -158.062 0 +      vertex 309.47 -158.722 23.6342 +      vertex 310.683 -158.062 23.1454 +    endloop +  endfacet +  facet normal -0.511019 -1.65295e-16 -0.85957 +    outer loop +      vertex 304.864 190 26.3725 +      vertex 309.47 190 23.6342 +      vertex 304.864 -161.469 26.3725 +    endloop +  endfacet +  facet normal -0.511019 -8.26932e-17 -0.85957 +    outer loop +      vertex 305.975 -160.622 25.7118 +      vertex 309.47 190 23.6342 +      vertex 309.47 -158.722 23.6342 +    endloop +  endfacet +  facet normal -0.511019 -2.66539e-17 -0.85957 +    outer loop +      vertex 304.864 -161.469 26.3725 +      vertex 309.47 190 23.6342 +      vertex 305.975 -160.622 25.7118 +    endloop +  endfacet +  facet normal -0.373817 -6.09341e-17 -0.927502 +    outer loop +      vertex 309.47 190 23.6342 +      vertex 314.44 190 21.6311 +      vertex 309.47 -158.722 23.6342 +    endloop +  endfacet +  facet normal -0.373817 -6.07092e-17 -0.927502 +    outer loop +      vertex 310.683 -158.062 23.1454 +      vertex 314.44 190 21.6311 +      vertex 314.44 -156.713 21.6311 +    endloop +  endfacet +  facet normal -0.373817 -1.71766e-16 -0.927502 +    outer loop +      vertex 309.47 -158.722 23.6342 +      vertex 314.44 190 21.6311 +      vertex 310.683 -158.062 23.1454 +    endloop +  endfacet +  facet normal -0.227853 -3.73565e-17 -0.973695 +    outer loop +      vertex 314.44 190 21.6311 +      vertex 319.657 190 20.4102 +      vertex 314.44 -156.713 21.6311 +    endloop +  endfacet +  facet normal -0.227853 -7.48092e-17 -0.973695 +    outer loop +      vertex 315.726 -156.251 21.3302 +      vertex 319.657 190 20.4102 +      vertex 319.657 -155.489 20.4102 +    endloop +  endfacet +  facet normal -0.227853 -1.3116e-16 -0.973695 +    outer loop +      vertex 314.44 -156.713 21.6311 +      vertex 319.657 190 20.4102 +      vertex 315.726 -156.251 21.3302 +    endloop +  endfacet +  facet normal -0.0765492 -2.51894e-17 -0.997066 +    outer loop +      vertex 319.657 190 20.4102 +      vertex 325 190 20 +      vertex 319.657 -155.489 20.4102 +    endloop +  endfacet +  facet normal -0.0765492 -1.26272e-17 -0.997066 +    outer loop +      vertex 320.986 -155.231 20.3082 +      vertex 325 190 20 +      vertex 325 -155.077 20 +    endloop +  endfacet +  facet normal -0.0765492 2.41849e-18 -0.997066 +    outer loop +      vertex 319.657 -155.489 20.4102 +      vertex 325 190 20 +      vertex 320.986 -155.231 20.3082 +    endloop +  endfacet +  facet normal 0.0765492 1.26097e-17 -0.997066 +    outer loop +      vertex 325 190 20 +      vertex 330.343 190 20.4102 +      vertex 325 -155.077 20 +    endloop +  endfacet +  facet normal 0.0765492 2.52987e-17 -0.997066 +    outer loop +      vertex 326.341 -155.026 20.1029 +      vertex 330.343 190 20.4102 +      vertex 330.343 -155.488 20.4102 +    endloop +  endfacet +  facet normal 0.0765492 3.20836e-17 -0.997066 +    outer loop +      vertex 325 -155.077 20 +      vertex 330.343 190 20.4102 +      vertex 326.341 -155.026 20.1029 +    endloop +  endfacet +  facet normal 0.227853 7.49779e-17 -0.973695 +    outer loop +      vertex 330.343 190 20.4102 +      vertex 335.56 190 21.6311 +      vertex 330.343 -155.488 20.4102 +    endloop +  endfacet +  facet normal 0.227853 3.74484e-17 -0.973695 +    outer loop +      vertex 331.664 -155.64 20.7193 +      vertex 335.56 190 21.6311 +      vertex 335.56 -156.711 21.6311 +    endloop +  endfacet +  facet normal 0.227853 4.16165e-17 -0.973695 +    outer loop +      vertex 330.343 -155.488 20.4102 +      vertex 335.56 190 21.6311 +      vertex 331.664 -155.64 20.7193 +    endloop +  endfacet +  facet normal 0.373817 6.12875e-17 -0.927502 +    outer loop +      vertex 335.56 190 21.6311 +      vertex 340.53 190 23.6342 +      vertex 335.56 -156.711 21.6311 +    endloop +  endfacet +  facet normal 0.373817 6.12994e-17 -0.927502 +    outer loop +      vertex 336.831 -157.06 22.1431 +      vertex 340.53 190 23.6342 +      vertex 340.53 -158.719 23.6342 +    endloop +  endfacet +  facet normal 0.373817 8.01085e-17 -0.927502 +    outer loop +      vertex 335.56 -156.711 21.6311 +      vertex 340.53 190 23.6342 +      vertex 336.831 -157.06 22.1431 +    endloop +  endfacet +  facet normal 0.511019 8.32994e-17 -0.85957 +    outer loop +      vertex 340.53 190 23.6342 +      vertex 345.136 190 26.3725 +      vertex 340.53 -158.719 23.6342 +    endloop +  endfacet +  facet normal 0.511019 1.65334e-16 -0.85957 +    outer loop +      vertex 341.72 -159.252 24.3417 +      vertex 345.136 190 26.3725 +      vertex 345.136 -161.464 26.3725 +    endloop +  endfacet +  facet normal 0.511019 3.31949e-16 -0.85957 +    outer loop +      vertex 340.53 -158.719 23.6342 +      vertex 345.136 190 26.3725 +      vertex 341.72 -159.252 24.3417 +    endloop +  endfacet +  facet normal 0.636242 2.05803e-16 -0.771489 +    outer loop +      vertex 345.136 190 26.3725 +      vertex 349.27 190 29.7817 +      vertex 345.136 -161.464 26.3725 +    endloop +  endfacet +  facet normal 0.636242 2.04327e-16 -0.771489 +    outer loop +      vertex 346.218 -162.165 27.2646 +      vertex 349.27 190 29.7817 +      vertex 349.27 -164.885 29.7817 +    endloop +  endfacet +  facet normal 0.636242 -2.86188e-17 -0.771489 +    outer loop +      vertex 345.136 -161.464 26.3725 +      vertex 349.27 190 29.7817 +      vertex 346.218 -162.165 27.2646 +    endloop +  endfacet +  facet normal 0.746553 2.39157e-16 -0.665326 +    outer loop +      vertex 349.27 -164.885 29.7817 +      vertex 349.27 190 29.7817 +      vertex 352.835 190 33.7821 +    endloop +  endfacet +  facet normal 0.746553 2.81116e-16 -0.665326 +    outer loop +      vertex 350.218 -165.73 30.8456 +      vertex 349.27 -164.885 29.7817 +      vertex 352.835 190 33.7821 +    endloop +  endfacet +  facet normal 0.746553 2.3648e-16 -0.665326 +    outer loop +      vertex 352.835 -168.903 33.7821 +      vertex 350.218 -165.73 30.8456 +      vertex 352.835 190 33.7821 +    endloop +  endfacet +  facet normal 0.839365 2.65879e-16 -0.543568 +    outer loop +      vertex 352.835 -168.903 33.7821 +      vertex 352.835 190 33.7821 +      vertex 355.748 190 38.2798 +    endloop +  endfacet +  facet normal 0.839365 1.69812e-16 -0.543568 +    outer loop +      vertex 353.628 -169.864 35.0055 +      vertex 352.835 -168.903 33.7821 +      vertex 355.748 190 38.2798 +    endloop +  endfacet +  facet normal 0.839365 1.31283e-16 -0.543568 +    outer loop +      vertex 355.748 -173.431 38.2798 +      vertex 353.628 -169.864 35.0055 +      vertex 355.748 190 38.2798 +    endloop +  endfacet +  facet normal 0.912504 1.42723e-16 -0.409069 +    outer loop +      vertex 355.748 -173.431 38.2798 +      vertex 355.748 190 38.2798 +      vertex 357.94 190 43.1694 +    endloop +  endfacet +  facet normal 0.912504 5.57413e-16 -0.409069 +    outer loop +      vertex 356.366 -174.47 39.6581 +      vertex 355.748 -173.431 38.2798 +      vertex 357.94 190 43.1694 +    endloop +  endfacet +  facet normal 0.912504 2.81614e-16 -0.409069 +    outer loop +      vertex 357.94 -178.375 43.1694 +      vertex 356.366 -174.47 39.6581 +      vertex 357.94 190 43.1694 +    endloop +  endfacet +  facet normal 0.964254 2.97585e-16 -0.264981 +    outer loop +      vertex 357.94 -178.375 43.1694 +      vertex 357.94 190 43.1694 +      vertex 359.36 190 48.3363 +    endloop +  endfacet +  facet normal 0.964254 1.51212e-17 -0.264981 +    outer loop +      vertex 358.369 -179.44 44.7304 +      vertex 357.94 -178.375 43.1694 +      vertex 359.36 190 48.3363 +    endloop +  endfacet +  facet normal 0.964254 2.93365e-16 -0.264981 +    outer loop +      vertex 359.36 -183.674 48.3363 +      vertex 358.369 -179.44 44.7304 +      vertex 359.36 190 48.3363 +    endloop +  endfacet +  facet normal 0.993402 3.02233e-16 -0.114683 +    outer loop +      vertex 359.36 -183.674 48.3363 +      vertex 359.36 190 48.3363 +      vertex 359.974 190 53.6594 +    endloop +  endfacet +  facet normal 0.993402 2.57272e-16 -0.114683 +    outer loop +      vertex 359.59 -184.657 50.3288 +      vertex 359.36 -183.674 48.3363 +      vertex 359.974 190 53.6594 +    endloop +  endfacet +  facet normal 0.993402 1.48732e-16 -0.114683 +    outer loop +      vertex 359.974 -189.665 53.6594 +      vertex 359.59 -184.657 50.3288 +      vertex 359.974 190 53.6594 +    endloop +  endfacet +endsolid OpenSCAD_Model diff --git a/testdata/scad/bugs/fn_bug.txt b/testdata/scad/bugs/fn_bug.txt new file mode 100644 index 0000000..dfeef46 --- /dev/null +++ b/testdata/scad/bugs/fn_bug.txt @@ -0,0 +1,14 @@ +Reported by Ian Shumsky: + +1) Export STL from fn_bug.scad +   - fn_setting = 41 -> triggers bug +   - fn_setting = 40 -> works + +2) Open fn_bug_import.scad and render using CGAL (F6) + +-> +CGAL error in CGA_Nef_polyhedron3(): CGAL ERROR: assertion violation! +Expr: pe_prev->is_border() || !internal::Plane_constructor<Plane>::get_plane(pe_prev->facet(),pe_prev->facet()->plane()).is_degenerate() +File: ../libraries/install/include/CGAL/Nef_3/polyhedron_3_to_nef_3.h +Line: 252 + diff --git a/testdata/scad/bugs/fn_bug_import.scad b/testdata/scad/bugs/fn_bug_import.scad new file mode 100644 index 0000000..dd1f402 --- /dev/null +++ b/testdata/scad/bugs/fn_bug_import.scad @@ -0,0 +1 @@ +import("fn_bug.stl"); diff --git a/testdata/scad/features/polygon-tests.scad b/testdata/scad/features/polygon-tests.scad index ab3a345..b4e92b6 100644 --- a/testdata/scad/features/polygon-tests.scad +++ b/testdata/scad/features/polygon-tests.scad @@ -13,5 +13,6 @@ translate([2,-2,0]) polygon([[0,0], [1,0], [0.8,0.5], [1,1], [0,1]]);  points = [[0,0], [0.5,-0.2], [1,0], [1.2,0.5], [1,1], [0.5,1.2], [0,1], [-0.2,0.5]];  translate([-2,0,0]) polygon(points);  translate([-2,-2,0]) polygon(points=points, paths=[[0,1,2,3], [4,5,6,7]]); +translate([2,-4,0]) polygon([[0,0], [1,0], [1,1], [0,0]]);  // FIXME: convexity diff --git a/testdata/scad/misc/escape-test.scad b/testdata/scad/misc/escape-test.scad index c4400b3..b45ac32 100644 --- a/testdata/scad/misc/escape-test.scad +++ b/testdata/scad/misc/escape-test.scad @@ -1 +1 @@ -import(file="A-\\ B-\" C-\t D-\n E-' F-\\\\", layer="A:\\ B:\" C:\t D:\n E:' F:\\\\"); +import(file="B-\" C-\t D-\n E-'", layer="A:\\ B:\" C:\t D:\n E:' F:\\\\"); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5e93680..fe3fe34 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -187,17 +187,32 @@ BISON_TARGET(OpenSCADparser ../src/parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser_y  ADD_FLEX_BISON_DEPENDENCY(OpenSCADlexer OpenSCADparser)  set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/parser_yacc.c PROPERTIES LANGUAGE "CXX") +# CGAL +  if (NOT $ENV{MACOSX_DEPLOY_DIR} STREQUAL "")    set(CGAL_DIR "$ENV{MACOSX_DEPLOY_DIR}/lib/CGAL")    set(CMAKE_MODULE_PATH "${CGAL_DIR}")  endif()  find_package(CGAL REQUIRED) +if("${CGAL_MAJOR_VERSION}.${CGAL_MINOR_VERSION}" VERSION_LESS 3.6) +  message(FATAL_ERROR "CGAL >= 3.6 required") +endif()  include_directories(${CGAL_INCLUDE_DIRS}) +# Imagemagick + +find_package(ImageMagick COMPONENTS convert) +if (ImageMagick_convert_FOUND) +  message(STATUS "ImageMagick convert executable found: " ${ImageMagick_convert_EXECUTABLE}) +else() +  message(FATAL_ERROR "Couldn't find imagemagick 'convert' program") +endif() +  # Internal includes  include_directories(../src)  add_definitions(-DOPENSCAD_VERSION=test -DOPENSCAD_YEAR=2011 -DOPENSCAD_MONTH=10) +add_definitions(-DOPENSCAD_TESTING)  set(CORE_SOURCES    tests-common.cc  @@ -293,12 +308,6 @@ add_executable(echotest echotest.cc)  target_link_libraries(echotest tests-nocgal tests-core ${QT_LIBRARIES} ${OPENGL_LIBRARY} ${Boost_LIBRARIES})  # -# Yangli Hector Yee's PerceptualDiff code -# - -add_executable(yee_compare yee_compare.cpp lodepng.cpp) - -#  # dumptest  #  add_executable(dumptest dumptest.cc) @@ -356,7 +365,7 @@ function(add_cmdline_test TESTCMD TESTSUFFIX)    foreach (SCADFILE ${ARGN})      get_filename_component(TESTNAME ${SCADFILE} NAME_WE)      string(REPLACE " " "_" TESTNAME ${TESTNAME}) # Test names cannot include spaces -    add_test("${TESTCMD_NAME}_${TESTNAME}" ${PYTHON_EXECUTABLE} ${tests_SOURCE_DIR}/test_cmdline_tool.py -s ${TESTSUFFIX} ${CMAKE_BINARY_DIR}/${TESTCMD} "${SCADFILE}") +    add_test("${TESTCMD_NAME}_${TESTNAME}" ${PYTHON_EXECUTABLE} ${tests_SOURCE_DIR}/test_cmdline_tool.py -c ${ImageMagick_convert_EXECUTABLE} -s ${TESTSUFFIX} ${CMAKE_BINARY_DIR}/${TESTCMD} "${SCADFILE}" )    endforeach()  endfunction() diff --git a/tests/regression/cgalpngtest/polygon-tests-expected.png b/tests/regression/cgalpngtest/polygon-tests-expected.pngBinary files differ index 89aed2f..5ceabe8 100644 --- a/tests/regression/cgalpngtest/polygon-tests-expected.png +++ b/tests/regression/cgalpngtest/polygon-tests-expected.png diff --git a/tests/regression/dumptest/escape-test-expected.txt b/tests/regression/dumptest/escape-test-expected.txt index bea0156..2097dc4 100644 --- a/tests/regression/dumptest/escape-test-expected.txt +++ b/tests/regression/dumptest/escape-test-expected.txt @@ -1,2 +1,2 @@ -	import(file = "A-\\ B-\" C-\t D-\n E-' F-\\\\", layer = "A:\\ B:\" C:\t D:\n E:' F:\\\\", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); +	import(file = "B-\" C-\t D-\n E-'", layer = "A:\\ B:\" C:\t D:\n E:' F:\\\\", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); diff --git a/tests/regression/dumptest/polygon-tests-expected.txt b/tests/regression/dumptest/polygon-tests-expected.txt index ce4ad87..be66d21 100644 --- a/tests/regression/dumptest/polygon-tests-expected.txt +++ b/tests/regression/dumptest/polygon-tests-expected.txt @@ -29,4 +29,7 @@  	multmatrix([[1, 0, 0, -2], [0, 1, 0, -2], [0, 0, 1, 0], [0, 0, 0, 1]]) {  		polygon(points = [[0, 0], [0.5, -0.2], [1, 0], [1.2, 0.5], [1, 1], [0.5, 1.2], [0, 1], [-0.2, 0.5]], paths = [[0, 1, 2, 3], [4, 5, 6, 7]], convexity = 1);  	} +	multmatrix([[1, 0, 0, 2], [0, 1, 0, -4], [0, 0, 1, 0], [0, 0, 0, 1]]) { +		polygon(points = [[0, 0], [1, 0], [1, 1], [0, 0]], paths = undef, convexity = 1); +	} diff --git a/tests/regression/echotest/builtin-tests-expected.txt b/tests/regression/echotest/builtin-tests-expected.txt index e8b2027..0e8d1a7 100644 --- a/tests/regression/echotest/builtin-tests-expected.txt +++ b/tests/regression/echotest/builtin-tests-expected.txt @@ -1 +1 @@ -ECHO: 3.141592653589793 +ECHO: 3.14159265358979 diff --git a/tests/regression/echotest/dim-all-expected.txt b/tests/regression/echotest/dim-all-expected.txt index 74044a1..d8c3269 100644 --- a/tests/regression/echotest/dim-all-expected.txt +++ b/tests/regression/echotest/dim-all-expected.txt @@ -1,16 +1,16 @@  WARNING: Unsupported DXF Entity `LEADER' (1) in `dim-all.dxf'. -ECHO: linearX = 51.44957554275265 +ECHO: linearX = 51.4495755427526  WARNING: Unsupported DXF Entity `LEADER' (1) in `dim-all.dxf'. -ECHO: linearY = 29.13025467434841 +ECHO: linearY = 29.1302546743484  WARNING: Unsupported DXF Entity `LEADER' (1) in `dim-all.dxf'. -ECHO: aligned = 60.00000000000001 +ECHO: aligned = 60.0000000000000  WARNING: Unsupported DXF Entity `LEADER' (1) in `dim-all.dxf'. -ECHO: ordinateX = -49.17542445724735 +ECHO: ordinateX = -49.175424457247  WARNING: Unsupported DXF Entity `LEADER' (1) in `dim-all.dxf'. -ECHO: ordinateY = 30.86974532565159 +ECHO: ordinateY = 30.8697453256515  WARNING: Unsupported DXF Entity `LEADER' (1) in `dim-all.dxf'.  ECHO: radius = 60  WARNING: Unsupported DXF Entity `LEADER' (1) in `dim-all.dxf'.  ECHO: diameter = 120  WARNING: Unsupported DXF Entity `LEADER' (1) in `dim-all.dxf'. -ECHO: arc = 59.03624346792648 +ECHO: arc = 59.0362434679264 diff --git a/tests/regression/opencsgtest/polygon-tests-expected.png b/tests/regression/opencsgtest/polygon-tests-expected.pngBinary files differ index 4d88973..fe84a80 100644 --- a/tests/regression/opencsgtest/polygon-tests-expected.png +++ b/tests/regression/opencsgtest/polygon-tests-expected.png diff --git a/tests/regression/throwntogethertest/polygon-tests-expected.png b/tests/regression/throwntogethertest/polygon-tests-expected.pngBinary files differ index c9cdb36..779b878 100644 --- a/tests/regression/throwntogethertest/polygon-tests-expected.png +++ b/tests/regression/throwntogethertest/polygon-tests-expected.png diff --git a/tests/test_cmdline_tool.py b/tests/test_cmdline_tool.py index 40aa4d6..43ceda0 100755 --- a/tests/test_cmdline_tool.py +++ b/tests/test_cmdline_tool.py @@ -49,13 +49,15 @@ def execute_and_redirect(cmd, params, outfile):      retval = -1      try:          proc = subprocess.Popen([cmd] + params, stdout=outfile) +        out = proc.communicate()[0]          retval = proc.wait()      except:          print >> sys.stderr, "Error running subprocess: ", sys.exc_info()[1]          print >> sys.stderr, " cmd:", cmd          print >> sys.stderr, " params:", params          print >> sys.stderr, " outfile:", outfile -    return retval +    if outfile == subprocess.PIPE: return (retval, out) +    else: return retval  def get_normalized_text(filename):      text = open(filename).read() @@ -74,15 +76,21 @@ def compare_default(resultfilename):      return True  def compare_png(resultfilename): -    print >> sys.stderr, 'Yee image compare:' +#    args = [expectedfilename, resultfilename, "-alpha", "Off", "-compose", "difference", "-composite", "-threshold", "10%", "-blur", "2", "-threshold", "30%", "-format", "%[fx:w*h*mean]", "info:"] +    args = [expectedfilename, resultfilename, "-alpha", "Off", "-compose", "difference", "-composite", "-threshold", "10%", "-morphology", "Erode", "Square", "-format", "%[fx:w*h*mean]", "info:"] +    print >> sys.stderr, 'ImageMagick image comparison: convert ', ' '.join(args[2:])      print >> sys.stderr, ' expected image: ', expectedfilename      if not resultfilename:          print >> sys.stderr, "Error: OpenSCAD did not generate an image to test"          return False      print >> sys.stderr, ' actual image: ', resultfilename -    if execute_and_redirect("./yee_compare", [expectedfilename, resultfilename, "-downsample", "2", "-threshold", "300"], sys.stderr) != 0: -        return False -    return True + +    (retval, output) = execute_and_redirect(options.convert_exec, args, subprocess.PIPE) +    if retval == 0: +        pixelerr = int(float(output.strip())) +        if pixelerr < 32: return True +        else: print >> sys.stderr, pixelerr, ' pixel errors' +    return False  def compare_with_expected(resultfilename):      if not options.generate: @@ -135,11 +143,12 @@ def usage():      print >> sys.stderr, "  -g, --generate        Generate expected output for the given tests"      print >> sys.stderr, "  -s, --suffix=<suffix> Write -expected and -actual files with the given suffix instead of .txt"      print >> sys.stderr, "  -t, --test=<name>     Specify test name instead of deducting it from the argument" +    print >> sys.stderr, "  -c, --convexec=<name> Path to ImageMagick 'convert' executable"  if __name__ == '__main__':      # Handle command-line arguments      try: -        opts, args = getopt.getopt(sys.argv[1:], "gs:t:", ["generate", "suffix=", "test="]) +        opts, args = getopt.getopt(sys.argv[1:], "gs:c:t:", ["generate", "convexec=", "suffix=", "test="])      except getopt.GetoptError, err:          usage()          sys.exit(2) @@ -157,6 +166,8 @@ if __name__ == '__main__':              else: options.suffix = a          elif o in ("-t", "--test"):              options.testname = a +	elif o in ("-c", "--convexec"):  +            options.convert_exec = os.path.normpath( a )      # <cmdline-tool> and <argument>      if len(args) < 2: diff --git a/tests/test_pretty_print.py b/tests/test_pretty_print.py index fb88c2f..fc22908 100755 --- a/tests/test_pretty_print.py +++ b/tests/test_pretty_print.py @@ -76,7 +76,7 @@ def read_sysinfo(filename):  	data += read_gitinfo() -	data += 'Image comparison: PerceptualDiff by H. Yee' +	data += 'Image comparison: ImageMagick'  	data = data.strip() @@ -116,7 +116,7 @@ class Test:  def parsetest(teststring):  	patterns = ["Test:(.*?)\n", # fullname  		"Test time =(.*?) sec\n", -		"Test time.*?Test (Passed)", +		"Test time.*?Test (Passed)", # pass/fail  		"Output:(.*?)<end of output>",  		'Command:.*?-s" "(.*?)"', # type  		"actual .*?:(.*?)\n", @@ -147,7 +147,8 @@ def wikify_filename(testname,filename,sysid):  	return result.replace('/','_') -def towiki(wiki_rootpath, startdate, tests, enddate, sysinfo, sysid, testlog): +def towiki(wiki_rootpath, startdate, tests, enddate, sysinfo, sysid): +  	wiki_template = """  <h3>[[WIKI_ROOTPATH]] test run report</h3> @@ -165,14 +166,25 @@ end time  : ENDDATE <br>  '''Failed image tests''' -{| border=1 cellspacing=0 cellpadding=1 -! Testname !! expected output !! actual output  <REPEAT1> +{| border=1 cellspacing=0 cellpadding=1  |- -| FTESTNAME || [[File:EXPECTEDFILE|thumb|250px]] || ACTUALFILE_WIKI -</REPEAT1> +| colspan=2 | FTESTNAME   +|- +| Expected image || Actual image +|- +| [[File:EXPECTEDFILE|250px]] || ACTUALFILE_WIKI  |} +<pre> + TESTLOG +</pre> + + + +</REPEAT1> + +  '''Failed text tests'''  {|border=1 cellspacing=0 cellpadding=1 @@ -183,47 +195,40 @@ end time  : ENDDATE <br>  </REPEAT2>  |} -'''Test logs''' - -(excerpted from Testing/Temporary/LastTest.Log) - -<pre> -FAILED_TESTLOGS -</pre>  """ -	numpassed = len(filter(lambda x: x.passed, tests)) -	percent = str(int(100.0*numpassed / len(tests))) +	passed_tests = filter(lambda x: x.passed, tests) +	failed_tests = filter(lambda x: not x.passed, tests) +	percent = str(int(100.0*len(passed_tests) / len(tests)))  	manifest = {}  	s = wiki_template  	repeat1 = ezsearch('(<REPEAT1>.*?</REPEAT1>)',s)  	repeat2 = ezsearch('(<REPEAT2>.*?</REPEAT2>)',s)  	dic = { 'STARTDATE': startdate, 'ENDDATE': enddate, 'WIKI_ROOTPATH': wiki_rootpath, -		'SYSINFO': sysinfo, 'SYSID':sysid, 'LASTTESTLOG':testlog,  -		'NUMTESTS':len(tests), 'NUMPASSED':numpassed, 'PERCENTPASSED':percent } +		'SYSINFO': sysinfo, 'SYSID':sysid,  +		'NUMTESTS':len(tests), 'NUMPASSED':len(passed_tests), 'PERCENTPASSED':percent }  	for key in dic.keys(): -		s = re.sub(key,str(dic[key]),s) +		s = s.replace(key,str(dic[key]))  	testlogs = '' -	for t in tests: -		# if t.passed: noop -		if not t.passed: -			testlogs += '\n\n'+t.fulltestlog -			if t.type=='txt': -				newchunk = re.sub('FTEST_OUTPUTFILE',t.fullname,repeat2) -				newchunk = re.sub('FTESTNAME',t.fullname,repeat2) -				s = s.replace(repeat2, newchunk+repeat2) -			elif t.type=='png': -				manifest[t.actualfile] = wikify_filename(t.fullname,t.actualfile,sysid) -				manifest[t.expectedfile] = wikify_filename(t.fullname,t.expectedfile,sysid) -				if t.actualfile:  -					actualfile_wiki = '[[File:'+manifest[t.actualfile]+'|thumb|250px]]' -				else: -					actualfile_wiki = 'No file generated.<br/>See log for details' -				newchunk = re.sub('FTESTNAME',t.fullname,repeat1) -				newchunk = newchunk.replace('ACTUALFILE_WIKI',actualfile_wiki) -				newchunk = newchunk.replace('EXPECTEDFILE',manifest[t.expectedfile]) -				s = s.replace(repeat1, newchunk+repeat1) -	s = s.replace('FAILED_TESTLOGS',testlogs) +	for t in failed_tests: +		testlogs += '\n\n'+t.fulltestlog +		if t.type=='txt': +			newchunk = re.sub('FTEST_OUTPUTFILE',t.fullname,repeat2) +			newchunk = re.sub('FTESTNAME',t.fullname,repeat2) +			s = s.replace(repeat2, newchunk+repeat2) +		elif t.type=='png': +			manifest[t.actualfile] = wikify_filename(t.fullname,t.actualfile,sysid) +			manifest[t.expectedfile] = wikify_filename(t.fullname,t.expectedfile,sysid) +			if t.actualfile:  +				actualfile_wiki = '[[File:'+manifest[t.actualfile]+'|250px]]' +			else: +				actualfile_wiki = 'No image generated.' +			newchunk = re.sub('FTESTNAME',t.fullname,repeat1) +			newchunk = newchunk.replace('ACTUALFILE_WIKI',actualfile_wiki) +			newchunk = newchunk.replace('EXPECTEDFILE',manifest[t.expectedfile]) +			newchunk = newchunk.replace('TESTLOG',t.fulltestlog) +			s = s.replace(repeat1, newchunk+repeat1) +  	s = s.replace(repeat1,'')  	s = s.replace(repeat2,'')  	s = re.sub('<REPEAT.*?>\n','',s) @@ -253,7 +258,7 @@ def upload_dryrun(wikiurl,api_php_path,wikidata,manifest,wiki_rootpath,sysid,bot  	print 'save ', len(wikidata), ' bytes to page ',wiki_rootpath+sysid  	for localfile in manifest.keys():  		if localfile: -			localf=open(localfile) +			localf=open(localfile,'rb')  			wikifile = manifest[localfile]  			print 'upload',localfile,wikifile @@ -289,7 +294,7 @@ def upload(wikiurl,api_php_path,wikidata,manifest,wiki_rootpath,sysid,botname,bo  	print 'upload images'  	for localfile in sorted(manifest.keys()):  		if localfile: -			localf = open(localfile) +			localf = open(localfile,'rb')  			wikifile = manifest[localfile]  			skip=False  			if 'expected.png' in wikifile.lower(): @@ -301,7 +306,10 @@ def upload(wikiurl,api_php_path,wikidata,manifest,wiki_rootpath,sysid,botname,bo  				print 'uploading',wikifile,'...'  				site.upload(localf,wikifile,wiki_rootpath + ' test', ignore=True) -wikisite = 'cakebaby.referata.com' +#wikisite = 'cakebaby.referata.com' +#wiki_api_path = '' +wikisite = 'cakebaby.wikia.com' +wiki_api_path = '/'  wiki_rootpath = 'OpenSCAD'  builddir = os.getcwd()  logpath = os.path.join(builddir,'Testing','Temporary') @@ -314,11 +322,11 @@ def main():  	sysinfo, sysid = read_sysinfo('sysinfo.txt')  	if '--forceupload' in sys.argv: forceupl=True  	else: forceupl=False -	manifest, wikidata = towiki(wiki_rootpath, startdate, tests, enddate, sysinfo, sysid, testlog) +	manifest, wikidata = towiki(wiki_rootpath, startdate, tests, enddate, sysinfo, sysid)  	trysave(wikidata, os.path.join(logpath,sysid+'.wiki'))  	htmldata = wikitohtml(wiki_rootpath, sysid, wikidata, manifest)  	trysave(htmldata, os.path.join(logpath,sysid+'.html'))  	if '--upload' in sys.argv: -		upload(wikisite,'',wikidata,manifest,wiki_rootpath,sysid,'openscadbot','tobdacsnepo',dryrun=False,forceupload=forceupl) +		upload(wikisite,wiki_api_path,wikidata,manifest,wiki_rootpath,sysid,'openscadbot','tobdacsnepo',dryrun=False,forceupload=forceupl)  main() diff --git a/tests/yee_compare.cpp b/tests/yee_compare.cpp deleted file mode 100644 index 9de4720..0000000 --- a/tests/yee_compare.cpp +++ /dev/null @@ -1,681 +0,0 @@ -// modified from PerceptualDiff source for OpenSCAD, 2011 September - -#include "yee_compare.h" -#include "lodepng.h" -#include <cstdlib> -#include <cstring> -#include <cstdio> -#include <math.h> - -static const char* copyright =  -"PerceptualDiff version 1.1.1, Copyright (C) 2006 Yangli Hector Yee\n\ -PerceptualDiff comes with ABSOLUTELY NO WARRANTY;\n\ -This is free software, and you are welcome\n\ -to redistribute it under certain conditions;\n\ -See the GPL page for details: http://www.gnu.org/copyleft/gpl.html\n\n"; - -static const char *usage = -"PeceptualDiff image1.tif image2.tif\n\n\ -   Compares image1.tif and image2.tif using a perceptually based image metric\n\ -   Options:\n\ -\t-verbose       : Turns on verbose mode\n\ -\t-fov deg       : Field of view in degrees (0.1 to 89.9)\n\ -\t-threshold p	 : #pixels p below which differences are ignored\n\ -\t-gamma g       : Value to convert rgb into linear space (default 2.2)\n\ -\t-luminance l   : White luminance (default 100.0 cdm^-2)\n\ -\t-luminanceonly : Only consider luminance; ignore chroma (color) in the comparison\n\ -\t-colorfactor   : How much of color to use, 0.0 to 1.0, 0.0 = ignore color.\n\ -\t-downsample    : How many powers of two to down sample the image.\n\ -\t-output o.ppm  : Write difference to the file o.ppm\n\ -\n\ -\n Note: Input or Output files can also be in the PNG or JPG format or any format\ -\n that FreeImage supports.\ -\n"; - -CompareArgs::CompareArgs() -{ -	ImgA = NULL; -	ImgB = NULL; -	ImgDiff = NULL; -	Verbose = false; -	LuminanceOnly = false; -	FieldOfView = 45.0f; -	Gamma = 2.2f; -	ThresholdPixels = 100; -	Luminance = 100.0f; -   ColorFactor = 1.0f; -   DownSample = 0; -} - -CompareArgs::~CompareArgs() -{ -	if (ImgA) delete ImgA; -	if (ImgB) delete ImgB; -	if (ImgDiff) delete ImgDiff; -} - -bool CompareArgs::Parse_Args(int argc, char **argv) -{ -	if (argc < 3) { -		ErrorStr = copyright; -		ErrorStr += usage; -		return false; -	} -	int image_count = 0; -	const char* output_file_name = NULL; -	for (int i = 1; i < argc; i++) { -		if (strcmp(argv[i], "-fov") == 0) { -			if (++i < argc) { -				FieldOfView = (float) atof(argv[i]); -			} -		} else if (strcmp(argv[i], "-verbose") == 0) { -			Verbose = true; -		} else if (strcmp(argv[i], "-threshold") == 0) { -			if (++i < argc) { -				ThresholdPixels = atoi(argv[i]); -			} -		} else if (strcmp(argv[i], "-gamma") == 0) { -			if (++i < argc) { -				Gamma = (float) atof(argv[i]); -			} -		} else if (strcmp(argv[i], "-luminance") == 0) { -			if (++i < argc) { -				Luminance = (float) atof(argv[i]); -			} -		} else if (strcmp(argv[i], "-luminanceonly") == 0) { -			LuminanceOnly = true; -		} else if (strcmp(argv[i], "-colorfactor") == 0) { -			if (++i < argc) { -				ColorFactor = (float) atof(argv[i]); -			} -		} else if (strcmp(argv[i], "-downsample") == 0) { -			if (++i < argc) { -				DownSample = (int) atoi(argv[i]); -			} -		} else if (strcmp(argv[i], "-output") == 0) { -			if (++i < argc) { -				output_file_name = argv[i]; -			} -		} else if (image_count < 2) { -			RGBAImage* img = RGBAImage::ReadFromFile(argv[i]); -			if (!img) { -				ErrorStr = "FAIL: Cannot open "; -				ErrorStr += argv[i]; -				ErrorStr += "\n"; -				return false; -			} else { -				++image_count; -				if(image_count == 1) -					ImgA = img; -				else -					ImgB = img; -			} -		} else { -			fprintf(stderr, "Warning: option/file \"%s\" ignored\n", argv[i]); -		} -	} // i -	if(!ImgA || !ImgB) { -		ErrorStr = "FAIL: Not enough image files specified\n"; -		return false; -	} -   for (int i = 0; i < DownSample; i++) { -      if (Verbose) printf("Downsampling by %d\n", 1 << (i+1)); -      RGBAImage *tmp = ImgA->DownSample(); -      if (tmp) { -         delete ImgA; -         ImgA = tmp; -      } -      tmp = ImgB->DownSample(); -      if (tmp) { -         delete ImgB; -         ImgB = tmp; -      } -   } -	if(output_file_name) { -		ImgDiff = new RGBAImage(ImgA->Get_Width(), ImgA->Get_Height(), output_file_name); -	} -	return true; -} - -void CompareArgs::Print_Args() -{ -	printf("Field of view is %f degrees\n", FieldOfView); -	printf("Threshold pixels is %d pixels\n", ThresholdPixels); -	printf("The Gamma is %f\n", Gamma); -	printf("The Display's luminance is %f candela per meter squared\n", Luminance); -} - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -LPyramid::LPyramid(float *image, int width, int height) : -	Width(width), -	Height(height) -{ -	// Make the Laplacian pyramid by successively -	// copying the earlier levels and blurring them -	for (int i=0; i<MAX_PYR_LEVELS; i++) { -		if (i == 0) { -			Levels[i] = Copy(image); -		} else { -			Levels[i] = new float[Width * Height]; -			Convolve(Levels[i], Levels[i - 1]); -		} -	} -} - -LPyramid::~LPyramid() -{ -	for (int i=0; i<MAX_PYR_LEVELS; i++) { -		if (Levels[i]) delete Levels[i]; -	} -} - -float *LPyramid::Copy(float *img) -{ -	int max = Width * Height; -	float *out = new float[max]; -	for (int i = 0; i < max; i++) out[i] = img[i]; -	 -	return out; -} - -void LPyramid::Convolve(float *a, float *b) -// convolves image b with the filter kernel and stores it in a -{ -	int y,x,i,j,nx,ny; -	const float Kernel[] = {0.05f, 0.25f, 0.4f, 0.25f, 0.05f}; - -	for (y=0; y<Height; y++) { -		for (x=0; x<Width; x++) { -			int index = y * Width + x; -			a[index] = 0.0f; -			for (i=-2; i<=2; i++) { -				for (j=-2; j<=2; j++) { -					nx=x+i; -					ny=y+j; -					if (nx<0) nx=-nx; -					if (ny<0) ny=-ny; -					if (nx>=Width) nx=2*Width-nx-1; -					if (ny>=Height) ny=2*Height-ny-1; -					a[index] += Kernel[i+2] * Kernel[j+2] * b[ny * Width + nx]; -				}  -			} -		} -	} -} - -float LPyramid::Get_Value(int x, int y, int level) -{ -	int index = x + y * Width; -	int l = level; -	if (l > MAX_PYR_LEVELS) l = MAX_PYR_LEVELS; -	return Levels[level][index]; -} - - - -#ifndef M_PI -#define M_PI 3.14159265f -#endif - -/* -* Given the adaptation luminance, this function returns the -* threshold of visibility in cd per m^2 -* TVI means Threshold vs Intensity function -* This version comes from Ward Larson Siggraph 1997 -*/  - -float tvi(float adaptation_luminance) -{ -      // returns the threshold luminance given the adaptation luminance -      // units are candelas per meter squared - -      float log_a, r, result;  -      log_a = log10f(adaptation_luminance); - -      if (log_a < -3.94f) { -            r = -2.86f; -      } else if (log_a < -1.44f) { -            r = powf(0.405f * log_a + 1.6f , 2.18f) - 2.86f; -      } else if (log_a < -0.0184f) { -            r = log_a - 0.395f; -      } else if (log_a < 1.9f) { -            r = powf(0.249f * log_a + 0.65f, 2.7f) - 0.72f; -      } else { -            r = log_a - 1.255f; -      } - -      result = powf(10.0f , r);  - -      return result; - -}  - -// computes the contrast sensitivity function (Barten SPIE 1989) -// given the cycles per degree (cpd) and luminance (lum) -float csf(float cpd, float lum) -{ -	float a, b, result;  -	 -	a = 440.0f * powf((1.0f + 0.7f / lum), -0.2f); -	b = 0.3f * powf((1.0f + 100.0f / lum), 0.15f); -		 -	result = a * cpd * expf(-b * cpd) * sqrtf(1.0f + 0.06f * expf(b * cpd));  -	 -	return result;	 -} - -/* -* Visual Masking Function -* from Daly 1993 -*/ -float mask(float contrast) -{ -      float a, b, result; -      a = powf(392.498f * contrast,  0.7f); -      b = powf(0.0153f * a, 4.0f); -      result = powf(1.0f + b, 0.25f);  - -      return result; -}  - -// convert Adobe RGB (1998) with reference white D65 to XYZ -void AdobeRGBToXYZ(float r, float g, float b, float &x, float &y, float &z) -{ -	// matrix is from http://www.brucelindbloom.com/ -	x = r * 0.576700f + g * 0.185556f + b * 0.188212f; -	y = r * 0.297361f + g * 0.627355f + b * 0.0752847f; -	z = r * 0.0270328f + g * 0.0706879f + b * 0.991248f; -} - -void XYZToLAB(float x, float y, float z, float &L, float &A, float &B) -{ -	static float xw = -1; -	static float yw; -	static float zw; -	// reference white -	if (xw < 0) { -		AdobeRGBToXYZ(1, 1, 1, xw, yw, zw); -	} -	const float epsilon  = 216.0f / 24389.0f; -	const float kappa = 24389.0f / 27.0f; -	float f[3]; -	float r[3]; -	r[0] = x / xw; -	r[1] = y / yw; -	r[2] = z / zw; -	for (int i = 0; i < 3; i++) { -		if (r[i] > epsilon) { -			f[i] = powf(r[i], 1.0f / 3.0f); -		} else { -			f[i] = (kappa * r[i] + 16.0f) / 116.0f; -		} -	} -	L = 116.0f * f[1] - 16.0f; -	A = 500.0f * (f[0] - f[1]); -	B = 200.0f * (f[1] - f[2]); -} - -bool Yee_Compare(CompareArgs &args) -{ -	if ((args.ImgA->Get_Width() != args.ImgB->Get_Width()) || -		(args.ImgA->Get_Height() != args.ImgB->Get_Height())) { -		args.ErrorStr = "Image dimensions do not match\n"; -		return false; -	} -	 -	unsigned int i, dim; -	dim = args.ImgA->Get_Width() * args.ImgA->Get_Height(); -	bool identical = true; -	for (i = 0; i < dim; i++) { -		if (args.ImgA->Get(i) != args.ImgB->Get(i)) { -		  identical = false; -		  break; -		} -	} -	if (identical) { -		args.ErrorStr = "Images are binary identical\n"; -		return true; -	} -	 -	// assuming colorspaces are in Adobe RGB (1998) convert to XYZ -	float *aX = new float[dim]; -	float *aY = new float[dim]; -	float *aZ = new float[dim]; -	float *bX = new float[dim]; -	float *bY = new float[dim]; -	float *bZ = new float[dim]; -	float *aLum = new float[dim]; -	float *bLum = new float[dim]; -	 -	float *aA = new float[dim]; -	float *bA = new float[dim]; -	float *aB = new float[dim]; -	float *bB = new float[dim]; - -	if (args.Verbose) printf("Converting RGB to XYZ\n"); -	 -	unsigned int x, y, w, h; -	w = args.ImgA->Get_Width(); -	h = args.ImgA->Get_Height(); -	for (y = 0; y < h; y++) { -		for (x = 0; x < w; x++) { -			float r, g, b, l; -			i = x + y * w; -			r = powf(args.ImgA->Get_Red(i) / 255.0f, args.Gamma); -			g = powf(args.ImgA->Get_Green(i) / 255.0f, args.Gamma); -			b = powf(args.ImgA->Get_Blue(i) / 255.0f, args.Gamma);						 -			AdobeRGBToXYZ(r,g,b,aX[i],aY[i],aZ[i]);			 -			XYZToLAB(aX[i], aY[i], aZ[i], l, aA[i], aB[i]); -			r = powf(args.ImgB->Get_Red(i) / 255.0f, args.Gamma); -			g = powf(args.ImgB->Get_Green(i) / 255.0f, args.Gamma); -			b = powf(args.ImgB->Get_Blue(i) / 255.0f, args.Gamma);						 -			AdobeRGBToXYZ(r,g,b,bX[i],bY[i],bZ[i]); -			XYZToLAB(bX[i], bY[i], bZ[i], l, bA[i], bB[i]); -			aLum[i] = aY[i] * args.Luminance; -			bLum[i] = bY[i] * args.Luminance; -		} -	} -	 -	if (args.Verbose) printf("Constructing Laplacian Pyramids\n"); -	 -	LPyramid *la = new LPyramid(aLum, w, h); -	LPyramid *lb = new LPyramid(bLum, w, h); -	 -	float num_one_degree_pixels = (float) (2 * tan( args.FieldOfView * 0.5 * M_PI / 180) * 180 / M_PI); -	float pixels_per_degree = w / num_one_degree_pixels; -	 -	if (args.Verbose) printf("Performing test\n"); -	 -	float num_pixels = 1; -	unsigned int adaptation_level = 0; -	for (i = 0; i < MAX_PYR_LEVELS; i++) { -		adaptation_level = i; -		if (num_pixels > num_one_degree_pixels) break; -		num_pixels *= 2; -	} -	 -	float cpd[MAX_PYR_LEVELS]; -	cpd[0] = 0.5f * pixels_per_degree; -	for (i = 1; i < MAX_PYR_LEVELS; i++) cpd[i] = 0.5f * cpd[i - 1]; -	float csf_max = csf(3.248f, 100.0f); -	 -	float F_freq[MAX_PYR_LEVELS - 2]; -	for (i = 0; i < MAX_PYR_LEVELS - 2; i++) F_freq[i] = csf_max / csf( cpd[i], 100.0f); -	 -	unsigned int pixels_failed = 0; -	for (y = 0; y < h; y++) { -	  for (x = 0; x < w; x++) { -		int index = x + y * w; -		float contrast[MAX_PYR_LEVELS - 2]; -		float sum_contrast = 0; -		for (i = 0; i < MAX_PYR_LEVELS - 2; i++) { -			float n1 = fabsf(la->Get_Value(x,y,i) - la->Get_Value(x,y,i + 1)); -			float n2 = fabsf(lb->Get_Value(x,y,i) - lb->Get_Value(x,y,i + 1)); -			float numerator = (n1 > n2) ? n1 : n2; -			float d1 = fabsf(la->Get_Value(x,y,i+2)); -			float d2 = fabsf(lb->Get_Value(x,y,i+2)); -			float denominator = (d1 > d2) ? d1 : d2; -			if (denominator < 1e-5f) denominator = 1e-5f; -			contrast[i] = numerator / denominator; -			sum_contrast += contrast[i]; -		} -		if (sum_contrast < 1e-5) sum_contrast = 1e-5f; -		float F_mask[MAX_PYR_LEVELS - 2]; -		float adapt = la->Get_Value(x,y,adaptation_level) + lb->Get_Value(x,y,adaptation_level); -		adapt *= 0.5f; -		if (adapt < 1e-5) adapt = 1e-5f; -		for (i = 0; i < MAX_PYR_LEVELS - 2; i++) { -			F_mask[i] = mask(contrast[i] * csf(cpd[i], adapt));  -		} -		float factor = 0; -		for (i = 0; i < MAX_PYR_LEVELS - 2; i++) { -			factor += contrast[i] * F_freq[i] * F_mask[i] / sum_contrast; -		} -		if (factor < 1) factor = 1; -		if (factor > 10) factor = 10; -		float delta = fabsf(la->Get_Value(x,y,0) - lb->Get_Value(x,y,0)); -		bool pass = true; -		// pure luminance test -		if (delta > factor * tvi(adapt)) { -			pass = false; -		} else if (!args.LuminanceOnly) { -			// CIE delta E test with modifications -                        float color_scale = args.ColorFactor; -			// ramp down the color test in scotopic regions -			if (adapt < 10.0f) { -                          // Don't do color test at all. -                          color_scale = 0.0; -			} -			float da = aA[index] - bA[index]; -			float db = aB[index] - bB[index]; -			da = da * da; -			db = db * db; -			float delta_e = (da + db) * color_scale; -			if (delta_e > factor) { -				pass = false; -			} -		} -		if (!pass) { -			pixels_failed++; -			if (args.ImgDiff) { -				args.ImgDiff->Set(255, 0, 0, 255, index); -			} -		} else { -			if (args.ImgDiff) { -				args.ImgDiff->Set(0, 0, 0, 255, index); -			} -		} -	  } -	} -	 -	if (aX) delete[] aX; -	if (aY) delete[] aY; -	if (aZ) delete[] aZ; -	if (bX) delete[] bX; -	if (bY) delete[] bY; -	if (bZ) delete[] bZ; -	if (aLum) delete[] aLum; -	if (bLum) delete[] bLum; -	if (la) delete la; -	if (lb) delete lb; -	if (aA) delete aA; -	if (bA) delete bA; -	if (aB) delete aB; -	if (bB) delete bB; - -	char different[100]; -	sprintf(different, "%d pixels are different\n", pixels_failed); - -        // Always output image difference if requested. -	if (args.ImgDiff) { -		if (args.ImgDiff->WriteToFile(args.ImgDiff->Get_Name().c_str())) { -			args.ErrorStr += "Wrote difference image to "; -			args.ErrorStr+= args.ImgDiff->Get_Name(); -			args.ErrorStr += "\n"; -		} else { -			args.ErrorStr += "Could not write difference image to "; -			args.ErrorStr+= args.ImgDiff->Get_Name(); -			args.ErrorStr += "\n"; -		} -	} - -	if (pixels_failed < args.ThresholdPixels) { -		args.ErrorStr = "Images are perceptually indistinguishable\n"; -                args.ErrorStr += different; -		return true; -	} -	 -	args.ErrorStr = "Images are visibly different\n"; -	args.ErrorStr += different; -	 -	return false; -} - -RGBAImage* RGBAImage::DownSample() const { -   if (Width <=1 || Height <=1) return NULL; -   int nw = Width / 2; -   int nh = Height / 2; -   RGBAImage* img = new RGBAImage(nw, nh, Name.c_str()); -   for (int y = 0; y < nh; y++) { -      for (int x = 0; x < nw; x++) { -         int d[4]; -         // Sample a 2x2 patch from the parent image. -         d[0] = Get(2 * x + 0, 2 * y + 0); -         d[1] = Get(2 * x + 1, 2 * y + 0); -         d[2] = Get(2 * x + 0, 2 * y + 1); -         d[3] = Get(2 * x + 1, 2 * y + 1); -         int rgba = 0; -         // Find the average color. -         for (int i = 0; i < 4; i++) { -            int c = (d[0] >> (8 * i)) & 0xFF; -            c += (d[1] >> (8 * i)) & 0xFF; -            c += (d[2] >> (8 * i)) & 0xFF; -            c += (d[3] >> (8 * i)) & 0xFF; -            c /= 4; -            rgba |= (c & 0xFF) << (8 * i); -         } -         img->Set(x, y, rgba); -      } -   } -   return img; -} - - -bool RGBAImage::WriteToFile(const char* filename) -{ -	LodePNG::Encoder encoder; -	encoder.addText("Comment","lodepng"); -	encoder.getSettings().zlibsettings.windowSize = 2048; -	 - -/* -	const FREE_IMAGE_FORMAT fileType = FreeImage_GetFIFFromFilename(filename); -	if(FIF_UNKNOWN == fileType) -	{ -		printf("Can't save to unknown filetype %s\n", filename); -		return false; -	} - -	FIBITMAP* bitmap = FreeImage_Allocate(Width, Height, 32, 0x000000ff, 0x0000ff00, 0x00ff0000); -	if(!bitmap) -	{ -		printf("Failed to create freeimage for %s\n", filename); -		return false; -	} - -	const unsigned int* source = Data; -	for( int y=0; y < Height; y++, source += Width ) -	{ -		unsigned int* scanline = (unsigned int*)FreeImage_GetScanLine(bitmap, Height - y - 1 ); -		memcpy(scanline, source, sizeof(source[0]) * Width); -	}	 -	 -	FreeImage_SetTransparent(bitmap, false); -	FIBITMAP* converted = FreeImage_ConvertTo24Bits(bitmap); -	 -	 -	const bool result = !!FreeImage_Save(fileType, converted, filename); -	if(!result) -		printf("Failed to save to %s\n", filename); -	 -	FreeImage_Unload(converted); -	FreeImage_Unload(bitmap); -	return result; -*/ -	return true; -} - -RGBAImage* RGBAImage::ReadFromFile(const char* filename) -{ -  unsigned char* buffer; -  unsigned char* image; -  size_t buffersize, imagesize, i; -  LodePNG_Decoder decoder; -   -  LodePNG_loadFile(&buffer, &buffersize, filename); /*load the image file with given filename*/ -  LodePNG_Decoder_init(&decoder); -  LodePNG_Decoder_decode(&decoder, &image, &imagesize, buffer, buffersize); /*decode the png*/ -   -  /*load and decode*/ -  /*if there's an error, display it, otherwise display information about the image*/ -  if(decoder.error) printf("error %u: %s\n", decoder.error, LodePNG_error_text(decoder.error)); - -  int w = decoder.infoPng.width; -  int h = decoder.infoPng.height; -   - -  RGBAImage* result = new RGBAImage(w, h, filename); -  // Copy the image over to our internal format, FreeImage has the scanlines bottom to top though. -  unsigned int* dest = result->Data; -  memcpy(dest, (void *)image, h*w*4); - -  /*cleanup decoder*/ -  free(image); -  free(buffer); -  LodePNG_Decoder_cleanup(&decoder); - -  return result; -/* -	const FREE_IMAGE_FORMAT fileType = FreeImage_GetFileType(filename); -	if(FIF_UNKNOWN == fileType) -	{ -		printf("Unknown filetype %s\n", filename); -		return 0; -	} -	 -	FIBITMAP* freeImage = 0; -	if(FIBITMAP* temporary = FreeImage_Load(fileType, filename, 0)) -	{ -		freeImage = FreeImage_ConvertTo32Bits(temporary); -		FreeImage_Unload(temporary); -	} -	if(!freeImage) -	{ -		printf( "Failed to load the image %s\n", filename); -		return 0; -	} - -	const int w = FreeImage_GetWidth(freeImage); -	const int h = FreeImage_GetHeight(freeImage); - -	RGBAImage* result = new RGBAImage(w, h, filename); -	// Copy the image over to our internal format, FreeImage has the scanlines bottom to top though. -	unsigned int* dest = result->Data; -	for( int y=0; y < h; y++, dest += w ) -	{ -		const unsigned int* scanline = (const unsigned int*)FreeImage_GetScanLine(freeImage, h - y - 1 ); -		memcpy(dest, scanline, sizeof(dest[0]) * w); -	}	 - -	FreeImage_Unload(freeImage); -	return result; -	return NULL; -*/ -} - - -int main(int argc, char **argv) -{ -	CompareArgs args; -	 -	if (!args.Parse_Args(argc, argv)) { -		printf("%s", args.ErrorStr.c_str()); -		return -1; -	} else { -		if (args.Verbose) args.Print_Args(); -	} -	 -	const bool passed = Yee_Compare(args); -	if (passed) { -		if(args.Verbose) -			printf("PASS: %s\n", args.ErrorStr.c_str()); -	} else { -		printf("FAIL: %s\n", args.ErrorStr.c_str()); -	} - -	return passed ? 0 : 1; -} - diff --git a/tests/yee_compare.h b/tests/yee_compare.h deleted file mode 100644 index 041ae4c..0000000 --- a/tests/yee_compare.h +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef _yee_compare_h -#define _yee_compare_h - -// source code modified for OpenSCAD, Sept 2011 -// original copyright notice follows: -/* -Metric -RGBAImage.h -Comapre Args -Laplacian Pyramid -Copyright (C) 2006 Yangli Hector Yee - -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 the Free Software Foundation; either version 2 of the License, -or (at your option) any later version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with this program; -if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include <string> - -class RGBAImage; - -// Args to pass into the comparison function -class CompareArgs -{ -public: -	CompareArgs(); -	~CompareArgs(); -	bool Parse_Args(int argc, char **argv);	 -	void Print_Args(); -	 -	RGBAImage		*ImgA;				// Image A -	RGBAImage		*ImgB;				// Image B -	RGBAImage		*ImgDiff;			// Diff image -	bool			Verbose;			// Print lots of text or not -	bool			LuminanceOnly;		// Only consider luminance; ignore chroma channels in the comparison. -	float			FieldOfView;		// Field of view in degrees -	float			Gamma;				// The gamma to convert to linear color space -	float			Luminance;			// the display's luminance -	unsigned int	ThresholdPixels;	// How many pixels different to ignore -	std::string		ErrorStr;			// Error string -  // How much color to use in the metric. -  // 0.0 is the same as LuminanceOnly = true, -  // 1.0 means full strength. -  float ColorFactor; -  // How much to down sample image before comparing, in powers of 2. -  int DownSample; -}; - -#define MAX_PYR_LEVELS 8 - -class LPyramid -{ -public:	 -	LPyramid(float *image, int width, int height); -	virtual ~LPyramid(); -	float Get_Value(int x, int y, int level); -protected: -	float *Copy(float *img); -	void Convolve(float *a, float *b); -	 -	// Succesively blurred versions of the original image -	float *Levels[MAX_PYR_LEVELS]; - -	int Width; -	int Height; -}; - -class CompareArgs; - -// Image comparison metric using Yee's method -// References: A Perceptual Metric for Production Testing, Hector Yee, Journal of Graphics Tools 2004 -bool Yee_Compare(CompareArgs &args); - -/** Class encapsulating an image containing R,G,B,A channels. - * - * Internal representation assumes data is in the ABGR format, with the RGB - * color channels premultiplied by the alpha value.  Premultiplied alpha is - * often also called "associated alpha" - see the tiff 6 specification for some - * discussion - http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf - * - */ -class RGBAImage -{ -	RGBAImage(const RGBAImage&); -	RGBAImage& operator=(const RGBAImage&); -public: -	RGBAImage(int w, int h, const char *name = 0) -	{ -		Width = w; -		Height = h; -		if (name) Name = name; -		Data = new unsigned int[w * h]; -	}; -	~RGBAImage() { if (Data) delete[] Data; } -	unsigned char Get_Red(unsigned int i) { return (Data[i] & 0xFF); } -	unsigned char Get_Green(unsigned int i) { return ((Data[i]>>8) & 0xFF); } -	unsigned char Get_Blue(unsigned int i) { return ((Data[i]>>16) & 0xFF); } -	unsigned char Get_Alpha(unsigned int i) { return ((Data[i]>>24) & 0xFF); } -	void Set(unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned int i) -	{ Data[i] = r | (g << 8) | (b << 16) | (a << 24); } -	int Get_Width(void) const { return Width; } -	int Get_Height(void) const { return Height; } -	void Set(int x, int y, unsigned int d) { Data[x + y * Width] = d; } -	unsigned int Get(int x, int y) const { return Data[x + y * Width]; } -	unsigned int Get(int i) const { return Data[i]; } -	const std::string &Get_Name(void) const { return Name; } -   RGBAImage* DownSample() const; -	 -	bool WriteToFile(const char* filename); -	static RGBAImage* ReadFromFile(const char* filename); -	 -protected: -	int Width; -	int Height; -	std::string Name; -	unsigned int *Data; -}; - -#endif | 
