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); |