summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dxftess.cc20
-rw-r--r--examples/example015.scad2
-rw-r--r--import.cc1
-rw-r--r--openscad.h2
-rw-r--r--polyset.cc36
-rw-r--r--render.cc1
6 files changed, 45 insertions, 17 deletions
diff --git a/dxftess.cc b/dxftess.cc
index 3a567fa..bf89557 100644
--- a/dxftess.cc
+++ b/dxftess.cc
@@ -341,3 +341,23 @@ void dxf_tesselate(PolySet *ps, DxfData *dxf, double rot, bool up, double h)
tess_tri.clear();
}
+
+void dxf_border_to_ps(PolySet *ps, DxfData *dxf)
+{
+ for (int i = 0; i < dxf->paths.count(); i++) {
+ DxfData::Path *pt = &dxf->paths[i];
+ if (!pt->is_closed)
+ continue;
+ ps->borders.append(PolySet::Polygon());
+ for (int j = 1; j < pt->points.count(); j++) {
+ double x = pt->points[j]->x, y = pt->points[j]->y, z = 0.0;
+ ps->grid.align(x, y, z);
+ if (pt->is_inner) {
+ ps->borders.last().append(PolySet::Point(x, y, z));
+ } else {
+ ps->borders.last().insert(0, PolySet::Point(x, y, z));
+ }
+ }
+ }
+}
+
diff --git a/examples/example015.scad b/examples/example015.scad
index ce89404..22a2ad0 100644
--- a/examples/example015.scad
+++ b/examples/example015.scad
@@ -18,4 +18,4 @@ difference()
}
import_dxf(filename = "example009.dxf",
- layername = "body", convexity = 10, scale=2);
+ layername = "body", convexity = 6, scale=2);
diff --git a/import.cc b/import.cc
index 1703cdb..03780e4 100644
--- a/import.cc
+++ b/import.cc
@@ -181,6 +181,7 @@ PolySet *ImportNode::render_polyset(render_mode_e) const
DxfData dd(fn, fs, fa, filename, layername, origin_x, origin_y, scale);
p->is2d = true;
dxf_tesselate(p, &dd, 0, true, 0);
+ dxf_border_to_ps(p, &dd);
}
return p;
diff --git a/openscad.h b/openscad.h
index d78453b..50f5bf7 100644
--- a/openscad.h
+++ b/openscad.h
@@ -521,6 +521,7 @@ public:
};
typedef QList<Point> Polygon;
QVector<Polygon> polygons;
+ QVector<Polygon> borders;
Grid3d<void*> grid;
bool is2d;
@@ -688,6 +689,7 @@ void progress_report_prep(AbstractNode *root, void (*f)(const class AbstractNode
void progress_report_fin();
void dxf_tesselate(PolySet *ps, DxfData *dxf, double rot, bool up, double h);
+void dxf_border_to_ps(PolySet *ps, DxfData *dxf);
#endif /* INCLUDE_ABSTRACT_NODE_DETAILS */
diff --git a/polyset.cc b/polyset.cc
index 56c90b9..38e1026 100644
--- a/polyset.cc
+++ b/polyset.cc
@@ -151,11 +151,11 @@ void PolySet::render_surface(colormode_e colormode, csgmode_e csgmode, GLint *sh
#endif /* ENABLE_OPENCSG */
if (this->is2d) {
double zbase = csgmode;
+ glBegin(GL_TRIANGLES);
for (double z = -zbase/2; z < zbase; z += zbase)
{
for (int i = 0; i < polygons.size(); i++) {
const Polygon *poly = &polygons[i];
- glBegin(GL_TRIANGLES);
if (poly->size() == 3) {
if (z < 0) {
gl_draw_triangle(shaderinfo, &poly->at(0), &poly->at(2), &poly->at(1), true, true, true, z);
@@ -190,19 +190,23 @@ void PolySet::render_surface(colormode_e colormode, csgmode_e csgmode, GLint *sh
}
}
}
- if (z < 0) {
- for (int j = 1; j <= poly->size(); j++) {
- Point p1 = poly->at(j - 1), p2 = poly->at(j - 1);
- Point p3 = poly->at(j % poly->size()), p4 = poly->at(j % poly->size());
- p1.z -= zbase/2, p2.z += zbase/2;
- p3.z -= zbase/2, p4.z += zbase/2;
- gl_draw_triangle(shaderinfo, &p2, &p1, &p3, true, true, false, 0);
- gl_draw_triangle(shaderinfo, &p2, &p3, &p4, false, true, true, 0);
- }
- }
- glEnd();
}
}
+ const QVector<Polygon> *borders_p = &borders;
+ if (borders_p->size() == 0)
+ borders_p = &polygons;
+ for (int i = 0; i < borders_p->size(); i++) {
+ const Polygon *poly = &borders_p->at(i);
+ for (int j = 1; j <= poly->size(); j++) {
+ Point p1 = poly->at(j - 1), p2 = poly->at(j - 1);
+ Point p3 = poly->at(j % poly->size()), p4 = poly->at(j % poly->size());
+ p1.z -= zbase/2, p2.z += zbase/2;
+ p3.z -= zbase/2, p4.z += zbase/2;
+ gl_draw_triangle(shaderinfo, &p2, &p1, &p3, true, true, false, 0);
+ gl_draw_triangle(shaderinfo, &p2, &p3, &p4, false, true, true, 0);
+ }
+ }
+ glEnd();
} else {
for (int i = 0; i < polygons.size(); i++) {
const Polygon *poly = &polygons[i];
@@ -247,8 +251,8 @@ void PolySet::render_edges(colormode_e colormode, csgmode_e csgmode) const
double zbase = csgmode;
for (double z = -zbase/2; z < zbase; z += zbase)
{
- for (int i = 0; i < polygons.size(); i++) {
- const Polygon *poly = &polygons[i];
+ for (int i = 0; i < borders.size(); i++) {
+ const Polygon *poly = &borders[i];
glBegin(GL_LINE_LOOP);
for (int j = 0; j < poly->size(); j++) {
const Point *p = &poly->at(j);
@@ -257,8 +261,8 @@ void PolySet::render_edges(colormode_e colormode, csgmode_e csgmode) const
glEnd();
}
}
- for (int i = 0; i < polygons.size(); i++) {
- const Polygon *poly = &polygons[i];
+ for (int i = 0; i < borders.size(); i++) {
+ const Polygon *poly = &borders[i];
glBegin(GL_LINES);
for (int j = 0; j < poly->size(); j++) {
const Point *p = &poly->at(j);
diff --git a/render.cc b/render.cc
index a554f6a..23f7352 100644
--- a/render.cc
+++ b/render.cc
@@ -164,6 +164,7 @@ CSGTerm *RenderNode::render_csg_term(double m[16], QVector<CSGTerm*> *highlights
ps = new PolySet();
ps->is2d = true;
dxf_tesselate(ps, &dd, 0, true, 0);
+ dxf_border_to_ps(ps, &dd);
}
if (N.dim == 3)
contact: Jan Huwald // Impressum