diff --git a/src/CGALEvaluator.cc b/src/CGALEvaluator.cc index a5a9d65a..34f5bb6f 100644 --- a/src/CGALEvaluator.cc +++ b/src/CGALEvaluator.cc @@ -185,8 +185,18 @@ CGAL_Nef_polyhedron CGALEvaluator::applyResize(const CgaladvNode &node) // Based on resize() in Giles Bathgate's RapCAD CGAL_Nef_polyhedron N; N = applyToChildren(node, CGE_UNION); + CGAL_Iso_cuboid_3 bb; + + if ( N.dim == 2 ) { + CGAL_Iso_rectangle_2e bbox = bounding_box( *N.p2 ); + CGAL_Point_2e min2(bbox.min()), max2(bbox.max()); + CGAL_Point_3 min3(min2.x(),min2.y(),0), max3(max2.x(),max2.y(),0); + bb = CGAL_Iso_cuboid_3( min3, max3 ); + } + else { + bb = bounding_box( *N.p3 ); + } - CGAL_Iso_cuboid_3 bb = bounding_box( *N.p3 ); Eigen::Matrix scale, bbox_size; scale << 1,1,1; bbox_size << bb.xmax()-bb.xmin(), bb.ymax()-bb.ymin(), bb.zmax()-bb.zmin(); @@ -197,7 +207,10 @@ CGAL_Nef_polyhedron CGALEvaluator::applyResize(const CgaladvNode &node) if (node.autosize) for (int i=0;i<3;i++) scale[i] = autoscale; - + std::cout << autoscale << " ascale \n"; + std::cout << scale[0] << ","; + std::cout << scale[1] << ","; + std::cout << scale[2] << " scalev \n"; Eigen::Matrix4d t; t << CGAL::to_double(scale[0]), 0, 0, 0, 0, CGAL::to_double(scale[1]), 0, 0, diff --git a/src/CGAL_Nef_polyhedron_DxfData.cc b/src/CGAL_Nef_polyhedron_DxfData.cc index 50a99523..8539e0eb 100644 --- a/src/CGAL_Nef_polyhedron_DxfData.cc +++ b/src/CGAL_Nef_polyhedron_DxfData.cc @@ -96,17 +96,21 @@ std::string CGAL_Nef_polyhedron::dump() const void CGAL_Nef_polyhedron::transform( const Transform3d &matrix ) { + std::cout << matrix(0,0) << "," << matrix(1,0) << "," << matrix(2,0) << "," << matrix(3,0) << "\n"; + std::cout << matrix(0,1) << "," << matrix(1,1) << "," << matrix(2,1) << "," << matrix(3,1) << "\n"; + std::cout << matrix(0,2) << "," << matrix(1,2) << "," << matrix(2,2) << "," << matrix(3,2) << "\n"; + std::cout << matrix(0,3) << "," << matrix(1,3) << "," << matrix(2,3) << "," << matrix(3,3) << "\n"; if (!this->isNull()) { if (this->dim == 2) { // Unfortunately CGAL provides no transform method for CGAL_Nef_polyhedron2 // 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! - Eigen::Matrix2f testmat; testmat << matrix(0,0), matrix(0,1), matrix(1,0), matrix(1,1); if (testmat.determinant() == 0) { PRINT("Warning: Scaling a 2D object with 0 - removing object"); this->reset(); + return; } else { CGAL_Aff_transformation2 t( @@ -128,8 +132,7 @@ void CGAL_Nef_polyhedron::transform( const Transform3d &matrix ) Tree nulltree; CGALEvaluator tmpeval(nulltree); CGAL_Nef_polyhedron N = tmpeval.evaluateCGALMesh(ps); - this->p2.reset(); - *(this->p2) = *(N.p2); + this->p2.reset( new CGAL_Nef_polyhedron2( *N.p2 ) ); delete dd; } } diff --git a/src/OffscreenView.cc b/src/OffscreenView.cc index 430d4eac..1e91f3dd 100644 --- a/src/OffscreenView.cc +++ b/src/OffscreenView.cc @@ -23,7 +23,7 @@ OffscreenView::~OffscreenView() #ifdef ENABLE_OPENCSG void OffscreenView::display_opencsg_warning() { - fprintf(stderr, "OpenSCAD recommended OpenGL version is 2.0. \n"); + PRINT("OpenSCAD recommended OpenGL version is 2.0."); } #endif diff --git a/src/cgaladv.cc b/src/cgaladv.cc index 276b59cf..199ace21 100644 --- a/src/cgaladv.cc +++ b/src/cgaladv.cc @@ -155,7 +155,11 @@ std::string CgaladvNode::toString() const stream << "()"; break; case RESIZE: - stream << "(newsize = " << this->newsize << ")"; + stream << "(newsize = [" + << this->newsize[0] << "," + << this->newsize[1] << "," + << this->newsize[2] << "]" + << ", auto = " << this->autosize << ")"; break; default: assert(false); diff --git a/testdata/scad/features/resize-2d-tests.scad b/testdata/scad/features/resize-2d-tests.scad new file mode 100644 index 00000000..76da09eb --- /dev/null +++ b/testdata/scad/features/resize-2d-tests.scad @@ -0,0 +1,45 @@ +// red = reference + +$fn=10; + +// two simple holes +module shape(){ + difference() { + square([5,5]); + translate([1,1]) square(); + translate([3,3]) circle(); + } +} + +// holes that have problems (duplicate vertex) +module shape2(){ + difference() { + square([5,5]); + translate([1,1]) square(); + translate([2,2]) square(); + } +} + +// one square split into two by another +module shape3(){ + difference() { + square([5,5]); + translate([0,2.5]) square([5,1]); + } +} + +translate([0,0]) resize([15,15]) shape(); +translate([0,16]) resize([15,15,0]) shape2(); +translate([0,32]) resize([15,15]) shape3(); + +color("red") { +translate([-16,0]) scale([3,3]) shape(); +translate([-16,16]) scale([3,3]) shape2(); +translate([-16,32]) scale([3,3]) shape3(); +} + +color("green"){ +translate([16,0]) resize([15,0],auto=true) shape(); +translate([16,16]) resize([0,15],auto=true) shape2(); +translate([16,32]) resize([0,0,15],auto=true) shape3(); +} diff --git a/testdata/scad/features/resize-tests.scad b/testdata/scad/features/resize-tests.scad index f2e91488..76f49eef 100644 --- a/testdata/scad/features/resize-tests.scad +++ b/testdata/scad/features/resize-tests.scad @@ -1,6 +1,7 @@ // bottom row = reference // middle row = should match reference // top row = should be inscribed in middle row in 'top' view +// back row = should be all cubes auto-scaled up $fn=10; @@ -39,4 +40,17 @@ translate([2.5,50.5,10]) resize([5,0,7]) sphere(0.5); translate([4,74.5,10]) resize([8,9]) sphere(0.5); translate([4.5,80.5,10]) resize([9]) sphere(0.5); translate([2.5,93,10]) resize([5,6,7]) sphere(0.5); +} + +color("green"){ +translate([10, 0, 0]) cube(); +translate([10,10,0]) resize([5,0,0],auto=true) cube(); +translate([10,20,0]) resize([0,6,0],auto=true) cube(); +translate([10,30,0]) resize([0,0,7],auto=true) cube(); +translate([10,40,0]) resize([5,6,0],true) cube(); +translate([10,60,0]) resize([0,6,7],auto=true) cube(); +translate([10,50,0]) resize([5,0,7],true) cube(); +translate([10,70,0]) resize([8,9],auto=true) cube(); +translate([10,80,0]) resize([9],true) cube(); +translate([10,90,0]) resize([5,6,7],auto=true) cube(); } \ No newline at end of file