summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--RELEASE_NOTES5
-rw-r--r--src/CGALEvaluator.cc58
-rw-r--r--src/CGAL_Nef_polyhedron.cc2
-rw-r--r--src/PolySetCGALEvaluator.cc28
-rw-r--r--src/transform.cc9
-rw-r--r--src/value.cc4
-rw-r--r--src/value.h2
-rw-r--r--tests/regression/cgalpngtest/scale2D-tests-expected.pngbin0 -> 7215 bytes
-rw-r--r--tests/regression/cgalpngtest/scale3D-tests-expected.pngbin0 -> 6642 bytes
-rw-r--r--tests/regression/dumptest/scale2D-tests-expected.txt34
-rw-r--r--tests/regression/dumptest/scale3D-tests-expected.txt43
-rw-r--r--tests/regression/opencsgtest/scale2D-tests-expected.pngbin0 -> 7716 bytes
-rw-r--r--tests/regression/opencsgtest/scale3D-tests-expected.pngbin0 -> 7278 bytes
-rw-r--r--tests/regression/throwntogethertest/scale2D-tests-expected.pngbin0 -> 7716 bytes
-rw-r--r--tests/regression/throwntogethertest/scale3D-tests-expected.pngbin0 -> 7278 bytes
15 files changed, 143 insertions, 42 deletions
diff --git a/RELEASE_NOTES b/RELEASE_NOTES
index a78fa7b..1a10b10 100644
--- a/RELEASE_NOTES
+++ b/RELEASE_NOTES
@@ -7,6 +7,8 @@ o The size of the misc. caches can now be adjusted from Preferences
o The limit for when to disable OpenCSG can now be adjusted from Preferences
o Added Dot product operator: vec * vec
o Added Matrix multiplication operator: vec * mat, mat * mat
+o Added search() function
+o Dependencies are now tracked - any changes in uses/included files will be detected and cause a recompile
Bugfixes:
o use'ing an non-existing file sometimes crashed under Windows
@@ -14,6 +16,9 @@ o Better font handling: Ensure a monospace font is chosen as default
o Division by zero caused hang in some cases (e.g. sin(1/0))
o Larger minkowski operations sometimes caused a crash after a CGAL assert was thrown
o Fixed crashes in shared_ptr.hpp (or similar places) due to a cache management bug
+o scale() with a scale factor of zero could cause a crash
+o Fixed a number of issues related to use/include
+o Providing an unknown parameter on the cmd-line caused a crash
Deprecations:
o The old include syntax "<filename.scad>" without the include keyword is no
diff --git a/src/CGALEvaluator.cc b/src/CGALEvaluator.cc
index 15fa746..0e849a8 100644
--- a/src/CGALEvaluator.cc
+++ b/src/CGALEvaluator.cc
@@ -252,31 +252,45 @@ Response CGALEvaluator::visit(State &state, const TransformNode &node)
// objects. So we convert in to our internal 2d data format, transform it,
// tesselate it and create a new CGAL_Nef_polyhedron2 from it.. What a hack!
- CGAL_Aff_transformation2 t(
- node.matrix(0,0), node.matrix(0,1), node.matrix(0,3),
- node.matrix(1,0), node.matrix(1,1), node.matrix(1,3), node.matrix(3,3));
-
- DxfData *dd = N.convertToDxfData();
- for (size_t i=0; i < dd->points.size(); i++) {
- CGAL_Kernel2::Point_2 p = CGAL_Kernel2::Point_2(dd->points[i][0], dd->points[i][1]);
- p = t.transform(p);
- dd->points[i][0] = to_double(p.x());
- dd->points[i][1] = to_double(p.y());
+ Eigen::Matrix2f testmat;
+ testmat << node.matrix(0,0), node.matrix(0,1), node.matrix(1,0), node.matrix(1,1);
+ if (testmat.determinant() == 0) {
+ PRINT("Warning: Scaling a 2D object with 0 - removing object");
+ N.p2.reset();
+ }
+ else {
+ CGAL_Aff_transformation2 t(
+ node.matrix(0,0), node.matrix(0,1), node.matrix(0,3),
+ node.matrix(1,0), node.matrix(1,1), node.matrix(1,3), node.matrix(3,3));
+
+ DxfData *dd = N.convertToDxfData();
+ for (size_t i=0; i < dd->points.size(); i++) {
+ CGAL_Kernel2::Point_2 p = CGAL_Kernel2::Point_2(dd->points[i][0], dd->points[i][1]);
+ p = t.transform(p);
+ dd->points[i][0] = to_double(p.x());
+ dd->points[i][1] = to_double(p.y());
+ }
+
+ PolySet ps;
+ ps.is2d = true;
+ dxf_tesselate(&ps, *dd, 0, true, false, 0);
+
+ N = evaluateCGALMesh(ps);
+ delete dd;
}
-
- PolySet ps;
- ps.is2d = true;
- dxf_tesselate(&ps, *dd, 0, true, false, 0);
-
- N = evaluateCGALMesh(ps);
- delete dd;
}
else if (N.dim == 3) {
- CGAL_Aff_transformation t(
- node.matrix(0,0), node.matrix(0,1), node.matrix(0,2), node.matrix(0,3),
- node.matrix(1,0), node.matrix(1,1), node.matrix(1,2), node.matrix(1,3),
- node.matrix(2,0), node.matrix(2,1), node.matrix(2,2), node.matrix(2,3), node.matrix(3,3));
- N.p3->transform(t);
+ if (node.matrix.matrix().determinant() == 0) {
+ PRINT("Warning: Scaling a 3D object with 0 - removing object");
+ N.p3.reset();
+ }
+ else {
+ CGAL_Aff_transformation t(
+ node.matrix(0,0), node.matrix(0,1), node.matrix(0,2), node.matrix(0,3),
+ node.matrix(1,0), node.matrix(1,1), node.matrix(1,2), node.matrix(1,3),
+ node.matrix(2,0), node.matrix(2,1), node.matrix(2,2), node.matrix(2,3), node.matrix(3,3));
+ N.p3->transform(t);
+ }
}
}
else {
diff --git a/src/CGAL_Nef_polyhedron.cc b/src/CGAL_Nef_polyhedron.cc
index 04783e5..ba298ad 100644
--- a/src/CGAL_Nef_polyhedron.cc
+++ b/src/CGAL_Nef_polyhedron.cc
@@ -61,6 +61,8 @@ CGAL_Nef_polyhedron &CGAL_Nef_polyhedron::minkowski(const CGAL_Nef_polyhedron &o
int CGAL_Nef_polyhedron::weight() const
{
+ if (this->empty()) return 0;
+
size_t memsize = sizeof(CGAL_Nef_polyhedron);
if (this->dim == 2) {
memsize += sizeof(CGAL_Nef_polyhedron2) +
diff --git a/src/PolySetCGALEvaluator.cc b/src/PolySetCGALEvaluator.cc
index 81ae31e..6ed1ab4 100644
--- a/src/PolySetCGALEvaluator.cc
+++ b/src/PolySetCGALEvaluator.cc
@@ -281,12 +281,14 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const LinearExtrudeNode &node)
BOOST_FOREACH (AbstractNode * v, node.getChildren()) {
if (v->modinst->isBackground()) continue;
CGAL_Nef_polyhedron N = this->cgalevaluator.evaluateCGALMesh(*v);
- if (N.dim != 2) {
- PRINT("ERROR: linear_extrude() is not defined for 3D child objects!");
- }
- else {
- if (sum.empty()) sum = N.copy();
- else sum += N;
+ if (!N.empty()) {
+ if (N.dim != 2) {
+ PRINT("ERROR: linear_extrude() is not defined for 3D child objects!");
+ }
+ else {
+ if (sum.empty()) sum = N.copy();
+ else sum += N;
+ }
}
}
@@ -379,12 +381,14 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const RotateExtrudeNode &node)
BOOST_FOREACH (AbstractNode * v, node.getChildren()) {
if (v->modinst->isBackground()) continue;
CGAL_Nef_polyhedron N = this->cgalevaluator.evaluateCGALMesh(*v);
- if (N.dim != 2) {
- PRINT("ERROR: rotate_extrude() is not defined for 3D child objects!");
- }
- else {
- if (sum.empty()) sum = N.copy();
- else sum += N;
+ if (!N.empty()) {
+ if (N.dim != 2) {
+ PRINT("ERROR: rotate_extrude() is not defined for 3D child objects!");
+ }
+ else {
+ if (sum.empty()) sum = N.copy();
+ else sum += N;
+ }
}
}
diff --git a/src/transform.cc b/src/transform.cc
index f5038b1..c2ac194 100644
--- a/src/transform.cc
+++ b/src/transform.cc
@@ -87,11 +87,10 @@ AbstractNode *TransformModule::evaluate(const Context *ctx, const ModuleInstanti
{
Vector3d scalevec(1,1,1);
Value v = c.lookup_variable("v");
- v.getnum(scalevec[0]);
- v.getnum(scalevec[1]);
- v.getnum(scalevec[2]);
- v.getv3(scalevec[0], scalevec[1], scalevec[2]);
- if (scalevec[2] == 0) scalevec[2] = 1;
+ if (!v.getv3(scalevec[0], scalevec[1], scalevec[2], 1.0)) {
+ double num;
+ if (v.getnum(num)) scalevec.setConstant(num);
+ }
node->matrix.scale(scalevec);
}
else if (this->type == ROTATE)
diff --git a/src/value.cc b/src/value.cc
index c9dbd55..93c4d5e 100644
--- a/src/value.cc
+++ b/src/value.cc
@@ -359,11 +359,11 @@ bool Value::getv2(double &x, double &y) const
return true;
}
-bool Value::getv3(double &x, double &y, double &z) const
+bool Value::getv3(double &x, double &y, double &z, double defaultval) const
{
if (this->type == VECTOR && this->vec.size() == 2) {
if (getv2(x, y)) {
- z = 0;
+ z = defaultval;
return true;
}
return false;
diff --git a/src/value.h b/src/value.h
index a2cfbdf..4a67fbc 100644
--- a/src/value.h
+++ b/src/value.h
@@ -73,7 +73,7 @@ public:
bool getnum(double &v) const;
bool getv2(double &x, double &y) const;
- bool getv3(double &x, double &y, double &z) const;
+ bool getv3(double &x, double &y, double &z, double defaultval = 0.0) const;
std::string toString() const;
diff --git a/tests/regression/cgalpngtest/scale2D-tests-expected.png b/tests/regression/cgalpngtest/scale2D-tests-expected.png
new file mode 100644
index 0000000..c23b7a0
--- /dev/null
+++ b/tests/regression/cgalpngtest/scale2D-tests-expected.png
Binary files differ
diff --git a/tests/regression/cgalpngtest/scale3D-tests-expected.png b/tests/regression/cgalpngtest/scale3D-tests-expected.png
new file mode 100644
index 0000000..cbd8227
--- /dev/null
+++ b/tests/regression/cgalpngtest/scale3D-tests-expected.png
Binary files differ
diff --git a/tests/regression/dumptest/scale2D-tests-expected.txt b/tests/regression/dumptest/scale2D-tests-expected.txt
new file mode 100644
index 0000000..aa1eca2
--- /dev/null
+++ b/tests/regression/dumptest/scale2D-tests-expected.txt
@@ -0,0 +1,34 @@
+ multmatrix([[2, 0, 0, 0], [0, 1.33333, 0, 0], [0, 0, 2, 0], [0, 0, 0, 1]]) {
+ group() {
+ square(size = [2, 3], center = true);
+ }
+ }
+ multmatrix([[1, 0, 0, 5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ multmatrix([[2, 0, 0, 0], [0, 1.33333, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ square(size = [2, 3], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 10], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ multmatrix([[2, 0, 0, 0], [0, 2, 0, 0], [0, 0, 2, 0], [0, 0, 0, 1]]) {
+ group() {
+ square(size = [2, 3], center = true);
+ }
+ }
+ }
+ linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ square(size = [2, 3], center = true);
+ }
+ }
+ }
+ linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ square(size = [2, 3], center = true);
+ }
+ }
+ }
+
diff --git a/tests/regression/dumptest/scale3D-tests-expected.txt b/tests/regression/dumptest/scale3D-tests-expected.txt
new file mode 100644
index 0000000..c06b2fe
--- /dev/null
+++ b/tests/regression/dumptest/scale3D-tests-expected.txt
@@ -0,0 +1,43 @@
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ multmatrix([[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 3, 0], [0, 0, 0, 1]]) {
+ group() {
+ cylinder($fn = 8, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ multmatrix([[2, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cylinder($fn = 8, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 10], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ multmatrix([[2, 0, 0, 0], [0, 2, 0, 0], [0, 0, 2, 0], [0, 0, 0, 1]]) {
+ group() {
+ cylinder($fn = 8, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = true);
+ }
+ }
+ }
+ linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1]]) {
+ group() {
+ cylinder($fn = 8, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = true);
+ }
+ }
+ }
+ linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1]]) {
+ group() {
+ cylinder($fn = 8, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = true);
+ }
+ }
+ }
+ linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1]]) {
+ group() {
+ cylinder($fn = 8, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = true);
+ }
+ }
+ }
+
diff --git a/tests/regression/opencsgtest/scale2D-tests-expected.png b/tests/regression/opencsgtest/scale2D-tests-expected.png
new file mode 100644
index 0000000..515265b
--- /dev/null
+++ b/tests/regression/opencsgtest/scale2D-tests-expected.png
Binary files differ
diff --git a/tests/regression/opencsgtest/scale3D-tests-expected.png b/tests/regression/opencsgtest/scale3D-tests-expected.png
new file mode 100644
index 0000000..7401b99
--- /dev/null
+++ b/tests/regression/opencsgtest/scale3D-tests-expected.png
Binary files differ
diff --git a/tests/regression/throwntogethertest/scale2D-tests-expected.png b/tests/regression/throwntogethertest/scale2D-tests-expected.png
new file mode 100644
index 0000000..515265b
--- /dev/null
+++ b/tests/regression/throwntogethertest/scale2D-tests-expected.png
Binary files differ
diff --git a/tests/regression/throwntogethertest/scale3D-tests-expected.png b/tests/regression/throwntogethertest/scale3D-tests-expected.png
new file mode 100644
index 0000000..7401b99
--- /dev/null
+++ b/tests/regression/throwntogethertest/scale3D-tests-expected.png
Binary files differ
contact: Jan Huwald // Impressum