diff options
| -rw-r--r-- | example.scad | 124 | ||||
| -rw-r--r-- | examples/example001.scad | 25 | ||||
| -rw-r--r-- | examples/example002.scad | 23 | ||||
| -rw-r--r-- | examples/example003.scad | 20 | ||||
| -rw-r--r-- | examples/example004.scad | 11 | ||||
| -rw-r--r-- | examples/example005.scad | 21 | ||||
| -rw-r--r-- | examples/example006.scad | 44 | ||||
| -rw-r--r-- | mainwin.cc | 2 | ||||
| -rw-r--r-- | openscad.h | 1 | ||||
| -rw-r--r-- | polyset.cc | 1 | ||||
| -rw-r--r-- | render.cc | 18 | 
11 files changed, 163 insertions, 127 deletions
| diff --git a/example.scad b/example.scad deleted file mode 100644 index 8c991cb..0000000 --- a/example.scad +++ /dev/null @@ -1,124 +0,0 @@ - -module test001() -{ -	function r_from_dia(d) = d / 2; - -	module rotcy(rot, r, h) { -		rotate(90, rot) cylinder(r = r, h = h, center = true); -	} - -	difference() { -		sphere(r = r_from_dia(size)); -		rotcy([0  0 0], cy_r, cy_h); -		rotcy([1  0 0], cy_r, cy_h); -		rotcy([ 0 1 0], cy_r, cy_h); -	} - -	size = 50; -	hole = 25; - -	cy_r = r_from_dia(hole); -	cy_h = r_from_dia(size * 2.5); -} - -module test002() -{ -	intersection() { -		difference() { -			union() { -				cube([30 30 30], center = true); -				translate([0 0 -25]) -					cube([15 15 50], center = true); -			} -			union() { -				cube([50 10 10], center = true); -				cube([10 50 10], center = true); -				cube([10 10 50], center = true); -			} -		} -		translate([0 0 5]) -			cylinder(h = 50, r1 = 20, r2 = 5, center = true); -	} -} - -module test003() -{ -	difference() { -		union() { -			cube([30 30 30], center = true); -			cube([40 15 15], center = true); -			cube([15 40 15], center = true); -			cube([15 15 40], center = true); -		} -		union() { -			cube([50 10 10], center = true); -			cube([10 50 10], center = true); -			cube([10 10 50], center = true); -		} -	} -} - -module test004() -{ -	difference() { -		cube(30, center = true); -		sphere(20); -	} -} - -module test005() -{ -	translate([0 0 -120]) { -		difference() { -			cylinder(h = 50, r = 100); -			translate([0 0 10]) cylinder(h = 50, r = 80); -			translate([100 0 35]) cube(50, center = true); -		} -		for (i = [0:5]) { -			echo(360*i/6, sin(360*i/6)*80, cos(360*i/6)*80); -			translate([sin(360*i/6)*80, cos(360*i/6)*80, 0 ]) -				cylinder(h = 200, r=10); -		} -		translate([0 0 200]) -			cylinder(h = 80, r1 = 120, r2 = 0); -	} -} - -module test006() -{ -	module edgeprofile() -	{ -		render() difference() { -			cube([20 20 150], center = true); -			translate([-10 -10 0]) -				cylinder(h = 150, r = 10, center = true); -		} -	} - -	difference() -	{ -		cube(100, center = true); -		for (rot = [ [0 0 0], [1 0 0], [0 1 0] ]) { -			rotate(90, rot) -				for (p = [[+1 +1 0], [-1 +1 90], [-1 -1 180], [+1 -1 270]]) { -					translate([ p[0]*50, p[1]*50, 0 ]) -						rotate(p[2], [0 0 1]) -							edgeprofile(); -				} -		} -		for (i = [ -			[ 0, 0, [ [0 0] ] ], -			[ 90, 0, [ [-20 -20], [+20 +20] ] ], -			[ 180, 0, [ [-20 -30], [-20 0], [-20 +30], [+20 -30], [+20 0], [+20 +30] ] ], -			[ 270, 0, [ [0 0], [-30 -30], [+30 -30], [-30 +30], [+30 +30] ] ], -			[ 0, 90, [ [-30 -30], [0 0], [+30 +30] ] ], -			[ 0, -90, [ [-25 -25], [+25 -25], [-25 +25], [+25 +25] ] ] -		]) { -			rotate(i[0], [0 0 1]) rotate(i[1], [1 0 0]) translate([0 -50 0]) -				for (j = i[2]) -					translate([j[0], 0, j[1]]) sphere(10); -		} -	} -} - -test006(); diff --git a/examples/example001.scad b/examples/example001.scad new file mode 100644 index 0000000..87e091d --- /dev/null +++ b/examples/example001.scad @@ -0,0 +1,25 @@ + +module example001() +{ +	function r_from_dia(d) = d / 2; + +	module rotcy(rot, r, h) { +		rotate(90, rot) cylinder(r = r, h = h, center = true); +	} + +	difference() { +		sphere(r = r_from_dia(size)); +		rotcy([0  0 0], cy_r, cy_h); +		rotcy([1  0 0], cy_r, cy_h); +		rotcy([ 0 1 0], cy_r, cy_h); +	} + +	size = 50; +	hole = 25; + +	cy_r = r_from_dia(hole); +	cy_h = r_from_dia(size * 2.5); +} + +example001(); + diff --git a/examples/example002.scad b/examples/example002.scad new file mode 100644 index 0000000..ce9a516 --- /dev/null +++ b/examples/example002.scad @@ -0,0 +1,23 @@ + +module example002() +{ +	intersection() { +		difference() { +			union() { +				cube([30 30 30], center = true); +				translate([0 0 -25]) +					cube([15 15 50], center = true); +			} +			union() { +				cube([50 10 10], center = true); +				cube([10 50 10], center = true); +				cube([10 10 50], center = true); +			} +		} +		translate([0 0 5]) +			cylinder(h = 50, r1 = 20, r2 = 5, center = true); +	} +} + +example002(); + diff --git a/examples/example003.scad b/examples/example003.scad new file mode 100644 index 0000000..2add654 --- /dev/null +++ b/examples/example003.scad @@ -0,0 +1,20 @@ + +module example003() +{ +	difference() { +		union() { +			cube([30 30 30], center = true); +			cube([40 15 15], center = true); +			cube([15 40 15], center = true); +			cube([15 15 40], center = true); +		} +		union() { +			cube([50 10 10], center = true); +			cube([10 50 10], center = true); +			cube([10 10 50], center = true); +		} +	} +} + +example003(); + diff --git a/examples/example004.scad b/examples/example004.scad new file mode 100644 index 0000000..9cfc4f6 --- /dev/null +++ b/examples/example004.scad @@ -0,0 +1,11 @@ + +module example004() +{ +	difference() { +		cube(30, center = true); +		sphere(20); +	} +} + +example004(); + diff --git a/examples/example005.scad b/examples/example005.scad new file mode 100644 index 0000000..9256149 --- /dev/null +++ b/examples/example005.scad @@ -0,0 +1,21 @@ + +module example005() +{ +	translate([0 0 -120]) { +		difference() { +			cylinder(h = 50, r = 100); +			translate([0 0 10]) cylinder(h = 50, r = 80); +			translate([100 0 35]) cube(50, center = true); +		} +		for (i = [0:5]) { +			echo(360*i/6, sin(360*i/6)*80, cos(360*i/6)*80); +			translate([sin(360*i/6)*80, cos(360*i/6)*80, 0 ]) +				cylinder(h = 200, r=10); +		} +		translate([0 0 200]) +			cylinder(h = 80, r1 = 120, r2 = 0); +	} +} + +example005(); + diff --git a/examples/example006.scad b/examples/example006.scad new file mode 100644 index 0000000..26143a1 --- /dev/null +++ b/examples/example006.scad @@ -0,0 +1,44 @@ + +module example006() +{ +	module edgeprofile() +	{ +		render(convexity = 2) difference() { +			cube([20 20 150], center = true); +			translate([-10 -10 0]) +				cylinder(h = 80, r = 10, center = true); +			translate([-10 -10 +40]) +				sphere(r = 10); +			translate([-10 -10 -40]) +				sphere(r = 10); +		} +	} + +	difference() +	{ +		cube(100, center = true); +		for (rot = [ [0 0 0], [1 0 0], [0 1 0] ]) { +			rotate(90, rot) +				for (p = [[+1 +1 0], [-1 +1 90], [-1 -1 180], [+1 -1 270]]) { +					translate([ p[0]*50, p[1]*50, 0 ]) +						rotate(p[2], [0 0 1]) +							edgeprofile(); +				} +		} +		for (i = [ +			[ 0, 0, [ [0 0] ] ], +			[ 90, 0, [ [-20 -20], [+20 +20] ] ], +			[ 180, 0, [ [-20 -25], [-20 0], [-20 +25], [+20 -25], [+20 0], [+20 +25] ] ], +			[ 270, 0, [ [0 0], [-25 -25], [+25 -25], [-25 +25], [+25 +25] ] ], +			[ 0, 90, [ [-25 -25], [0 0], [+25 +25] ] ], +			[ 0, -90, [ [-25 -25], [+25 -25], [-25 +25], [+25 +25] ] ] +		]) { +			rotate(i[0], [0 0 1]) rotate(i[1], [1 0 0]) translate([0 -50 0]) +				for (j = i[2]) +					translate([j[0], 0, j[1]]) sphere(10); +		} +	} +} + +example006(); + @@ -807,7 +807,7 @@ static void renderCSGChainviaOpenCSG(CSGChain *chain, GLint *shaderinfo, bool hi  			break;  		OpenCSGPrim *prim = new OpenCSGPrim(chain->types[i] == CSGTerm::DIFFERENCE ? -				OpenCSG::Subtraction : OpenCSG::Intersection, 1); +				OpenCSG::Subtraction : OpenCSG::Intersection, chain->polysets[i]->convexity);  		prim->p = chain->polysets[i];  		primitives.push_back(prim);  	} @@ -327,6 +327,7 @@ public:  	typedef QList<Point> Polygon;  	QVector<Polygon> polygons;  	double m[16]; +	int convexity;  	PolySet(); @@ -26,6 +26,7 @@ PolySet::PolySet()  {  	for (int i = 0; i < 16; i++)  		m[i] = i % 5 == 0 ? 1.0 : 0.0; +	convexity = 1;  }  void PolySet::append_poly() @@ -35,7 +35,8 @@ public:  class RenderNode : public AbstractNode  {  public: -	RenderNode(const ModuleInstanciation *mi) : AbstractNode(mi) { } +	int convexity; +	RenderNode(const ModuleInstanciation *mi) : AbstractNode(mi), convexity(1) { }  #ifdef ENABLE_CGAL  	virtual CGAL_Nef_polyhedron render_cgal_nef_polyhedron() const;  #endif @@ -43,14 +44,26 @@ public:  	virtual QString dump(QString indent) const;  }; -AbstractNode *RenderModule::evaluate(const Context*, const ModuleInstanciation *inst) const +AbstractNode *RenderModule::evaluate(const Context *ctx, const ModuleInstanciation *inst) const  {  	RenderNode *node = new RenderNode(inst); + +	QVector<QString> argnames = QVector<QString>() << "convexity"; +	QVector<Expression*> argexpr; + +	Context c(ctx); +	c.args(argnames, argexpr, inst->argnames, inst->argvalues); + +	Value v = c.lookup_variable("convexity"); +	if (v.type == Value::NUMBER) +		node->convexity = v.num; +  	foreach (ModuleInstanciation *v, inst->children) {  		AbstractNode *n = v->evaluate(inst->ctx);  		if (n != NULL)  			node->children.append(n);  	} +  	return node;  } @@ -138,6 +151,7 @@ CSGTerm *RenderNode::render_csg_term(double m[16], QVector<CSGTerm*> *highlights  	PolySet *ps = new PolySet();  	ps->setmatrix(m); +	ps->convexity = convexity;  	CGAL_Polyhedron P;  	N.convert_to_Polyhedron(P); | 
