diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/AboutDialog.h | 4 | ||||
| -rw-r--r-- | src/PolySetCGALEvaluator.cc | 84 | ||||
| -rw-r--r-- | src/cgal.h | 2 | ||||
| -rw-r--r-- | src/cgalutils.cc | 110 | 
4 files changed, 150 insertions, 50 deletions
| diff --git a/src/AboutDialog.h b/src/AboutDialog.h index 34122a0..1ae6533 100644 --- a/src/AboutDialog.h +++ b/src/AboutDialog.h @@ -3,12 +3,16 @@  #include "ui_AboutDialog.h" +#define STRINGIFY(x) #x +#define TOSTRING(x) STRINGIFY(x) +  class AboutDialog : public QDialog, public Ui::AboutDialog  {  	Q_OBJECT;  public:  	AboutDialog(QWidget *) {  		setupUi(this); +		this->setWindowTitle( QString("About OpenSCAD ") + QString(TOSTRING( OPENSCAD_VERSION)) );  		this->aboutText->setOpenExternalLinks(true);  		QUrl flattr_qurl(":icons/flattr.png" );  		this->aboutText->loadResource( QTextDocument::ImageResource, flattr_qurl ); diff --git a/src/PolySetCGALEvaluator.cc b/src/PolySetCGALEvaluator.cc index 19f5325..2a002be 100644 --- a/src/PolySetCGALEvaluator.cc +++ b/src/PolySetCGALEvaluator.cc @@ -74,21 +74,78 @@ public:  			}  			tmpnef2d.reset( new CGAL_Nef_polyhedron2( contour.begin(), contour.end(), boundary ) );  			if ( contour_counter == 0 ) { -				if (debug) out << "\ncontour is a body. make union(). " << contour.size() << " points.\n" ; +				out << "\n <!-- contour is a body. make union(). " << contour.size() << " points. -->\n" ;  				*(output_nefpoly2d) += *(tmpnef2d);  			} else {  				*(output_nefpoly2d) *= *(tmpnef2d); -				if (debug) out << "\ncontour is a hole. make intersection(). " << contour.size() << " points.\n"; +				if (debug) out << "\n<!-- contour is a hole. make intersection(). " << contour.size() << " points. -->\n";  			} -      out << "\n------- tmp: -------\n"; -			if (debug) out << dump_cgal_nef_polyhedron2( *tmpnef2d ); -      out << "\n------- output accumulator: -------\n"; -			if (debug) out << dump_cgal_nef_polyhedron2( *output_nefpoly2d ); +      out << "\n<!-- ======== output tmp nef2d: ====== -->\n"; +			out << dump_cgal_nef_polyhedron2_svg( *tmpnef2d ); +      out << "\n<!-- ======== output accumulator: ==== -->\n"; +			out << dump_cgal_nef_polyhedron2_svg( *output_nefpoly2d );  			contour_counter++;  		} // next facet cycle (i.e. next contour)  	} // visit()  }; + + + +class Flattener2 { +public: +	std::stringstream out; +	CGAL_Nef_polyhedron2::Boundary boundary; +	shared_ptr<CGAL_Nef_polyhedron2> tmpnef2d; +	shared_ptr<CGAL_Nef_polyhedron2> output_nefpoly2d; +	CGAL::Direction_3<CGAL_Kernel3> up; +	bool debug; +	Flattener2(bool debug=false) +	{ +		output_nefpoly2d.reset( new CGAL_Nef_polyhedron2() ); +		boundary = CGAL_Nef_polyhedron2::INCLUDED; +		up = CGAL::Direction_3<CGAL_Kernel3>(0,0,1); +		this->debug = debug; +	} +	std::string dump() +	{ +		return out.str(); +	} +	void visit( CGAL_Nef_polyhedron3::Vertex_const_handle ) {} +	void visit( CGAL_Nef_polyhedron3::Halfedge_const_handle ) {} +	void visit( CGAL_Nef_polyhedron3::SHalfedge_const_handle ) {} +	void visit( CGAL_Nef_polyhedron3::SHalfloop_const_handle ) {} +	void visit( CGAL_Nef_polyhedron3::SFace_const_handle ) {} +	void visit( CGAL_Nef_polyhedron3::Halffacet_const_handle hfacet ) { +		int contour_counter = 0; +		CGAL_Nef_polyhedron3::Halffacet_cycle_const_iterator i; +		CGAL_forall_facet_cycles_of( i, hfacet ) { +			CGAL_Nef_polyhedron3::SHalfedge_around_facet_const_circulator c1(i), c2(c1); +			std::list<CGAL_Nef_polyhedron2::Point> contour; +			CGAL_For_all( c1, c2 ) { +				CGAL_Nef_polyhedron3::Point_3 point3d = c1->source()->source()->point(); +				CGAL_Nef_polyhedron2::Point point2d( point3d.x(), point3d.y() ); +				contour.push_back( point2d ); +			} +			tmpnef2d.reset( new CGAL_Nef_polyhedron2( contour.begin(), contour.end(), boundary ) ); +      out << "\n<!-- ======== output tmp nef2d: ====== -->\n"; +			out << dump_cgal_nef_polyhedron2_svg( *tmpnef2d ); +			if ( contour_counter == 0 ) { +				out << "\n <!-- contour is a body. make union(). " << contour.size() << " points. -->\n" ; +				*(output_nefpoly2d) += *(tmpnef2d); +			} else { +				out << "\n <!-- contour is a hole. make intersection(). " << contour.size() << " points. -->\n"; +				*(output_nefpoly2d) *= *(tmpnef2d); +			} +      out << "\n<!-- ======== output accumulator: ==== -->\n"; +			out << dump_cgal_nef_polyhedron2_svg( *output_nefpoly2d ); +			contour_counter++; +		} // next facet cycle (i.e. next contour) +	} // visit() +}; + + +  PolySetCGALEvaluator::PolySetCGALEvaluator(CGALEvaluator &cgalevaluator)  	: PolySetEvaluator(cgalevaluator.getTree()), cgalevaluator(cgalevaluator)  { @@ -115,7 +172,7 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const ProjectionNode &node)  		}  	} -	// std::cout << "----- input dump \n" << sum.dump_svg() << "\n"; +	// std::cout << sum.dump_svg() << std::flush; // input dump  	CGAL_Nef_polyhedron nef_poly; @@ -160,8 +217,9 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const ProjectionNode &node)  		}  		// remove z coordinates to make CGAL_Nef_polyhedron2 +		std::cout << "<svg width=\"480px\" height=\"100000px\" xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">";  		try { -			Flattener flattener(true); +			Flattener2 flattener(true);  			CGAL_Nef_polyhedron3::Volume_const_iterator i;  			CGAL_Nef_polyhedron3::Shell_entry_const_iterator j;  			CGAL_Nef_polyhedron3::SFace_const_handle sface_handle; @@ -171,8 +229,10 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const ProjectionNode &node)  					sum.p3->visit_shell_objects( sface_handle , flattener );  				}  			} +			std::cout << flattener.out.str(); +			std::cout << "</svg>" << std::flush; -			std::cout << "------- flattener dump \n" << flattener.dump() << "\n"; +			//std::cout << "------- flattener dump \n" << flattener.dump() << "\n";  			nef_poly.p2 = flattener.output_nefpoly2d;  			nef_poly.dim = 2;  		}	catch (const CGAL::Failure_exception &e) { @@ -181,8 +241,10 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const ProjectionNode &node)  		CGAL::set_error_behaviour(old_behaviour); -		std::cout << "------- 3d cut dump \n" << sum.dump_svg() << "\n"; -		std::cout << "------- 2d output dump \n" << nef_poly.dump_svg() << "\n"; +		//std::cout << sum.dump_svg() << std::flush; // cut dump +		//std::cout << nef_poly.dump_svg() << std::flush; // post-flattener dump + +		//std::cout << "------- 2d output dump \n" << nef_poly.dump_svg() << "\n";  		// Extract polygons in the XY plane, ignoring all other polygons  		// FIXME: If the polyhedron is really thin, there might be unwanted polygons  		// in the XY plane, causing the resulting 2D polygon to be self-intersection @@ -54,8 +54,6 @@ typedef CGAL::Polyhedron_3<CGAL_Kernel3> CGAL_Polyhedron;  typedef CGAL_Polyhedron::HalfedgeDS CGAL_HDS;  typedef CGAL::Polyhedron_incremental_builder_3<CGAL_HDS> CGAL_Polybuilder; -typedef CGAL::Cartesian<NT>::Iso_cuboid_3 CGAL_Iso_cuboid_3; -  #ifdef PREV_NDEBUG  #define NDEBUG PREV_NDEBUG  #endif diff --git a/src/cgalutils.cc b/src/cgalutils.cc index b3a9407..10c5bbc 100644 --- a/src/cgalutils.cc +++ b/src/cgalutils.cc @@ -6,8 +6,12 @@  #include "cgal.h"  #include <CGAL/bounding_box.h>  typedef CGAL::Point_3<CGAL_Kernel3> CGAL_Point_3; -typedef CGAL::Point_2<CGAL::Simple_cartesian<NT> > CGAL_Point_2; -typedef CGAL::Simple_cartesian<NT>::Iso_rectangle_2 CGAL_Iso_rectangle_2; +typedef CGAL_Kernel3::Iso_cuboid_3 CGAL_Iso_cuboid_3; + +typedef CGAL_Nef_polyhedron2::Explorer::Point CGAL_Point_2; +// Note- Explorer::Point is incompatible with CGAL::Point_2<CGAL_Kernel2> +typedef CGAL_Kernel2::Iso_rectangle_2 CGAL_Iso_rectangle_2; +  #include <boost/algorithm/string.hpp>  #include <map> @@ -150,10 +154,9 @@ CGAL_Polyhedron *createPolyhedronFromPolySet(const PolySet &ps) -  CGAL_Point_2 project_svg_3to2( CGAL_Point_3 p, CGAL_Iso_cuboid_3 bbox )  { -	// do extremely simple fake isometric projection, based on bounding box +	// do simple fake isometric projection, based on bounding box  	double x = CGAL::to_double( p.x() );  	double y = CGAL::to_double( p.y() );  	double z = CGAL::to_double( p.z() ); @@ -161,12 +164,12 @@ CGAL_Point_2 project_svg_3to2( CGAL_Point_3 p, CGAL_Iso_cuboid_3 bbox )  	double screenh = 480;  	double xcenter = screenw / 2;  	double ycenter = screenh / 2; -	double xdist = ( 2 * CGAL::to_double( bbox.xmax() - bbox.xmin() ) ); -	double ydist = ( 2 * CGAL::to_double( bbox.ymax() - bbox.ymin() ) ); -	double zdist = ( 2 * CGAL::to_double( bbox.zmax() - bbox.zmin() ) ); -	double xscale = (xdist==0) ? 1 : screenw / (xdist * 1.618); -	double yscale = (ydist==0) ? 1 : screenh / (ydist * 1.618 * 3); -	double zscale = (zdist==0) ? 1 : screenh / (zdist * 1.618); +	double xdist = ( CGAL::to_double( bbox.xmax() - bbox.xmin() ) ); +	double ydist = ( CGAL::to_double( bbox.ymax() - bbox.ymin() ) ); +	double zdist = ( CGAL::to_double( bbox.zmax() - bbox.zmin() ) ); +	double xscale = (xdist==0) ? 1 : screenw / (xdist * 2 * 1.618); +	double yscale = (ydist==0) ? 1 : screenh / (ydist * 2 * 1.618 * 3); +	double zscale = (zdist==0) ? 1 : screenh / (zdist * 2 * 1.618);  	double tx = xcenter + x * xscale + y * yscale;  	double ty = ycenter - z * zscale - y * yscale;  	return CGAL_Point_2( tx, ty ); @@ -174,29 +177,41 @@ CGAL_Point_2 project_svg_3to2( CGAL_Point_3 p, CGAL_Iso_cuboid_3 bbox )  CGAL_Point_2 project_svg_2to2( CGAL_Point_2 p, CGAL_Iso_rectangle_2 bbox )  { -	CGAL_Point_3 origin( 0, 0, 0 ); +	// pass thru 3d projection by making 'y' into 'z'. +/*	CGAL_Point_3 origin( 0, 0, 0 );  	CGAL_Iso_cuboid_3 bbox3d( bbox.xmin(), bbox.ymin(), origin.z(),  													  bbox.xmax(), bbox.ymax(), origin.z() );  	CGAL_Point_3 point3d( p.x(), origin.z() , p.y() ); -	return project_svg_3to2( point3d, bbox3d ); +	return project_svg_3to2( point3d, bbox3d );*/ +	double x = CGAL::to_double( p.x() ); +	double y = CGAL::to_double( p.y() ); +	double screenw = 480; +	double screenh = 480; +	double borderw = screenw * 0.1618; +	double borderh = screenh * 0.1618; +	double vizw = screenw - borderw*2; +	double vizh = screenh - borderh*2; +	double bboxw = 0 ; CGAL::to_double( bbox.xmax() - bbox.xmin() ); +	double bboxh = 0 ; CGAL::to_double( bbox.ymax() - bbox.ymin() ); +	double xinbox = CGAL::to_double( p.x() ) - CGAL::to_double( bbox.xmin() ); +	double yinbox = CGAL::to_double( p.y() ) - CGAL::to_double( bbox.ymin() ); +	double tx = borderw + ( xinbox / bboxw ) * ( vizw ); +	double ty = borderh + ( yinbox / bboxh ) * ( vizh ); +	std::cout << "\nx, y " << x << "," << y << "\n"; +	std::cout << "xinb, yinb " << xinbox << "," << yinbox << "\n"; +	std::cout << "vizw, vizh " << vizw <<  "," << vizh << "\n"; +	std::cout << "tx, ty " << tx << "," << ty << "\n"; +	return CGAL_Point_2( tx, ty );  }  // for debugging, not necessarily pretty or useful for users.  std::string dump_cgal_nef_polyhedron2_face_svg(  	CGAL_Nef_polyhedron2::Explorer::Halfedge_around_face_const_circulator c1,  	CGAL_Nef_polyhedron2::Explorer::Halfedge_around_face_const_circulator c2, -	CGAL_Nef_polyhedron2::Explorer explorer ) +	CGAL_Nef_polyhedron2::Explorer explorer, +	CGAL_Iso_rectangle_2 &bbox, +	std::string color )  { -	std::vector<CGAL_Point_2> points; -	CGAL_For_all(c1, c2) -		if ( explorer.is_standard( explorer.source( c1 ) ) ) { -			points.push_back( explorer.point( explorer.source( c1 ) ) ); -			std::cout << points.size() << " point size\n"; -		} -	CGAL_Iso_rectangle_2 bbox( 0,0,0,0 ); -	if ( points.size() > 0 ) -		bbox = CGAL::bounding_box( points.begin(), points.end() ); -    std::stringstream out;  	CGAL_For_all(c1, c2) {  		if ( explorer.is_standard( explorer.target(c1) ) ) { @@ -204,38 +219,59 @@ std::string dump_cgal_nef_polyhedron2_face_svg(  			CGAL_Point_2 target = explorer.point( explorer.target( c1 ) );  			CGAL_Point_2 tp1 = project_svg_2to2( source, bbox );  			CGAL_Point_2 tp2 = project_svg_2to2( target, bbox ); -      out << " <line" +      out << "      <line"  			  << " x1='" << CGAL::to_double(tp1.x()) << "'" -			  << " x2='" << CGAL::to_double(tp1.y()) << "'" -			  << " y1='" << CGAL::to_double(tp2.x()) << "'" +			  << " y1='" << CGAL::to_double(tp1.y()) << "'" +			  << " x2='" << CGAL::to_double(tp2.x()) << "'"  			  << " y2='" << CGAL::to_double(tp2.y()) << "'" -			  << " stroke='red' />\n"; +			  << " stroke='" << color << "' />\n"; +			// crude "arrowhead" to indicate directionality +			out << "      <circle" +			  << " cx='" << CGAL::to_double(tp1.x()+ (tp2.x()-tp1.x())* 7/8) << "'" +			  << " cy='" << CGAL::to_double(tp1.y()+ (tp2.y()-tp1.y())* 7/8) << "'" +			  << " r='2'" +			  << " fill='" << color << "' stroke='" << color << "' />\n"; +  		}  	}  	return out.str();  } +static int svgcounter=0; +  std::string dump_cgal_nef_polyhedron2_svg( const CGAL_Nef_polyhedron2 &N )  {    std::stringstream out;    CGAL_Nef_polyhedron2::Explorer explorer = N.explorer(); +	CGAL_Iso_rectangle_2 bbox = CGAL::bounding_box ( explorer.points_begin(), explorer.points_end() ); + +	out << "      <!-- bounding box: " +		<< CGAL::to_double( bbox.xmin() ) << "," +		<< CGAL::to_double( bbox.ymin() ) << " " +		<< CGAL::to_double( bbox.xmax() ) << "," +		<< CGAL::to_double( bbox.ymax() ) << " " +		<< "-->\n"; +    CGAL_Nef_polyhedron2::Explorer::Face_const_iterator i; -  out << "<svg width='480px' height='480px' xmlns='http://www.w3.org/2000/svg' version='1.1'>\n"; -	out << "<polyline points='0,0 480,0 480,480 0,480' style='fill:none;stroke:black' />\n"; -	out << "<polyline points='10,455 10,475 10,465 18,465 2,465 10,465 14,461 6,469 10,465' style='fill:none;stroke:black;' />"; +  out << " <svg y='" << svgcounter << "' width='480px' height='480px' xmlns='http://www.w3.org/2000/svg' version='1.1'>\n"; +	out << " <polyline points='0,0 480,0 480,480 0,480' style='fill:none;stroke:black' />\n"; +	out << " <polyline points='10,455 10,475 10,465 18,465 2,465 10,465 14,461 6,469 10,465' style='fill:none;stroke:black;' />\n"; +	svgcounter+=480; +	if ((svgcounter/480)%2==0) svgcounter += 24;  	for ( i = explorer.faces_begin(); i!= explorer.faces_end(); ++i ) { +			out << "  <!-- body face begin -->\n";  			CGAL_Nef_polyhedron2::Explorer::Halfedge_around_face_const_circulator c1  				= explorer.face_cycle( i ), c2 ( c1 ); -			out << dump_cgal_nef_polyhedron2_face_svg( c1, c2, explorer ); +			out << dump_cgal_nef_polyhedron2_face_svg( c1, c2, explorer, bbox, "red" ); +			out << "  <!-- body face end -->\n"; -/* -	holes not implemented  		  CGAL_Nef_polyhedron2::Explorer::Hole_const_iterator j;  			for ( j = explorer.holes_begin( i ); j!= explorer.holes_end( i ); ++j ) { +				out << "   <!-- hole face begin -->\n";  				CGAL_Nef_polyhedron2::Explorer::Halfedge_around_face_const_circulator c3( j ), c4 ( c3 ); -				out << dump_cgal_nef_polyhedron2_face_svg( c3, c4, explorer ); +				out << dump_cgal_nef_polyhedron2_face_svg( c3, c4, explorer, bbox, "green" ); +				out << "   <!-- hole face end -->\n";  			} -*/    }    out << "</svg>";  	std::string tmp = out.str(); @@ -302,7 +338,7 @@ class NefPoly3_dumper_svg {  public:  	std::stringstream out;  	CGAL_Iso_cuboid_3 bbox; -	NefPoly3_dumper_svg(const CGAL_Nef_polyhedron3& N) {} +	NefPoly3_dumper_svg(const CGAL_Nef_polyhedron3& N) { }  	void setbbox( CGAL_Iso_cuboid_3 bbox ) { this->bbox = bbox; }  	void visit(CGAL_Nef_polyhedron3::Vertex_const_handle v) {}  	void visit(CGAL_Nef_polyhedron3::Halfedge_const_handle ) {} @@ -349,7 +385,7 @@ std::string dump_cgal_nef_polyhedron3_svg( const CGAL_Nef_polyhedron3 &N )    std::stringstream out;    out << "<svg width='480px' height='480px' xmlns='http://www.w3.org/2000/svg' version='1.1'>\n";  	out << "<polyline points='0,0 480,0 480,480 0,480' style='fill:none;stroke:black' />\n"; -	out << "<polyline points='10,455 10,475 10,465 18,465 2,465 10,465 14,461 6,469 10,465' style='fill:none;stroke:black;' />"; +	out << "<polyline points='10,455 10,475 10,465 18,465 2,465 10,465 14,461 6,469 10,465' style='fill:none;stroke:black;' />\n";  	out << "<!--CGAL_Nef_polyhedron3 dump begin-->\n";  	std::vector<CGAL_Point_3> points; | 
