summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--example.scad124
-rw-r--r--examples/example001.scad25
-rw-r--r--examples/example002.scad23
-rw-r--r--examples/example003.scad20
-rw-r--r--examples/example004.scad11
-rw-r--r--examples/example005.scad21
-rw-r--r--examples/example006.scad44
-rw-r--r--mainwin.cc2
-rw-r--r--openscad.h1
-rw-r--r--polyset.cc1
-rw-r--r--render.cc18
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();
+
diff --git a/mainwin.cc b/mainwin.cc
index 79aa0a9..12b0c11 100644
--- a/mainwin.cc
+++ b/mainwin.cc
@@ -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);
}
diff --git a/openscad.h b/openscad.h
index 0ee83eb..014355c 100644
--- a/openscad.h
+++ b/openscad.h
@@ -327,6 +327,7 @@ public:
typedef QList<Point> Polygon;
QVector<Polygon> polygons;
double m[16];
+ int convexity;
PolySet();
diff --git a/polyset.cc b/polyset.cc
index 7bb7f2c..9ff03ce 100644
--- a/polyset.cc
+++ b/polyset.cc
@@ -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()
diff --git a/render.cc b/render.cc
index 1d73f1e..55b7b50 100644
--- a/render.cc
+++ b/render.cc
@@ -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);
contact: Jan Huwald // Impressum