mirror of https://github.com/vitalif/openscad
Merge branch 'master' of github.com:openscad/openscad
commit
6dde0695f1
|
@ -39,6 +39,8 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const ProjectionNode &node)
|
|||
ps->convexity = node.convexity;
|
||||
ps->is2d = true;
|
||||
|
||||
// In cut mode, the model is intersected by a large but very thin box living on the
|
||||
// XY plane.
|
||||
if (node.cut_mode)
|
||||
{
|
||||
PolySet cube;
|
||||
|
@ -82,8 +84,17 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const ProjectionNode &node)
|
|||
cube.append_vertex(x1, y2, z2);
|
||||
CGAL_Nef_polyhedron Ncube = this->cgalevaluator.evaluateCGALMesh(cube);
|
||||
|
||||
// N.p3 *= CGAL_Nef_polyhedron3(CGAL_Plane(0, 0, 1, 0), CGAL_Nef_polyhedron3::INCLUDED);
|
||||
sum *= Ncube;
|
||||
|
||||
// FIXME: Instead of intersecting with a thin volume, we could intersect
|
||||
// with a plane. This feels like a better solution. However, as the result
|
||||
// of such an intersection isn't simple, we cannot convert the resulting
|
||||
// Nef polyhedron to a Polyhedron using convertToPolyset() and we need
|
||||
// another way of extracting the result. kintel 20120203.
|
||||
// *sum.p3 = sum.p3->intersection(CGAL_Nef_polyhedron3::Plane_3(0, 0, 1, 0),
|
||||
// CGAL_Nef_polyhedron3::PLANE_ONLY);
|
||||
|
||||
|
||||
if (!sum.p3->is_simple()) {
|
||||
PRINT("WARNING: Body of projection(cut = true) isn't valid 2-manifold! Modify your design..");
|
||||
goto cant_project_non_simple_polyhedron;
|
||||
|
@ -91,6 +102,12 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const ProjectionNode &node)
|
|||
|
||||
PolySet *ps3 = sum.convertToPolyset();
|
||||
if (!ps3) return NULL;
|
||||
|
||||
// Extract polygons in the XY plane, ignoring all other polygons
|
||||
// FIXME: If the polyhedron is really thin, there might be unwanted polygons
|
||||
// in the XY plane, causing the resulting 2D polygon to be self-intersection
|
||||
// and cause a crash in CGALEvaluator::PolyReducer. The right solution is to
|
||||
// filter these polygons here. kintel 20120203.
|
||||
Grid2d<int> conversion_grid(GRID_COARSE);
|
||||
for (size_t i = 0; i < ps3->polygons.size(); i++) {
|
||||
for (size_t j = 0; j < ps3->polygons[i].size(); j++) {
|
||||
|
@ -114,6 +131,7 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const ProjectionNode &node)
|
|||
}
|
||||
delete ps3;
|
||||
}
|
||||
// In projection mode all the triangles are projected manually into the XY plane
|
||||
else
|
||||
{
|
||||
if (!sum.p3->is_simple()) {
|
||||
|
|
|
@ -53,7 +53,6 @@ void export_stl(CGAL_Nef_polyhedron *root_N, std::ostream &output)
|
|||
|
||||
output << "solid OpenSCAD_Model\n";
|
||||
|
||||
int facet_count = 0;
|
||||
for (FCI fi = P.facets_begin(); fi != P.facets_end(); ++fi) {
|
||||
HFCC hc = fi->facet_begin();
|
||||
HFCC hc_end = hc;
|
||||
|
@ -198,3 +197,20 @@ void export_dxf(CGAL_Nef_polyhedron *root_N, std::ostream &output)
|
|||
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
#include <boost/foreach.hpp>
|
||||
void export_stl(const PolySet &ps, std::ostream &output)
|
||||
{
|
||||
output << "solid OpenSCAD_PolySet\n";
|
||||
BOOST_FOREACH(const PolySet::Polygon &p, ps.polygons) {
|
||||
output << "facet\n";
|
||||
output << "outer loop\n";
|
||||
BOOST_FOREACH(const Vector3d &v, p) {
|
||||
output << "vertex " << v[0] << " " << v[1] << " " << v[2] << "\n";
|
||||
}
|
||||
output << "endloop\n";
|
||||
output << "endfacet\n";
|
||||
}
|
||||
output << "endsolid OpenSCAD_PolySet\n";
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1,13 +1,18 @@
|
|||
#ifndef EXPORT_H_
|
||||
#define EXPORT_H_
|
||||
|
||||
#ifdef ENABLE_CGAL
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#ifdef ENABLE_CGAL
|
||||
|
||||
void export_stl(class CGAL_Nef_polyhedron *root_N, std::ostream &output);
|
||||
void export_off(CGAL_Nef_polyhedron *root_N, std::ostream &output);
|
||||
void export_dxf(CGAL_Nef_polyhedron *root_N, std::ostream &output);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
void export_stl(const class PolySet &ps, std::ostream &output);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
// This causes OpenSCAD to crash. See source code comments:
|
||||
// PolySetCGALEvaluator::evaluatePolySet(const ProjectionNode &node)
|
||||
// Se also https://github.com/openscad/openscad/issues/80
|
||||
|
||||
projection(cut=true) translate([0,0,-4.999999]) cube(10, center=true);
|
|
@ -8,3 +8,6 @@ projection(cut=true) { square(); }
|
|||
linear_extrude(height=20) projection(cut=false) sphere(r=10);
|
||||
translate([22,0,0]) linear_extrude(height=20) projection(cut=true) translate([0,0,9]) sphere(r=10);
|
||||
translate([44,0,0]) linear_extrude(height=20) projection(cut=true) translate([0,0,7]) sphere(r=10);
|
||||
|
||||
// Boundary case: clipping the top of a cube
|
||||
translate([0,-22,0]) linear_extrude(height=5) projection(cut=true) translate([0,0,-4.999999]) cube(10, center=true);
|
||||
|
|
Loading…
Reference in New Issue