From 56f35524047ab87f5de4a642ae823ea66286f01a Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 23 Feb 2015 19:12:44 -0500 Subject: [PATCH] #1225 Added testcase --- testdata/scad/bugs/issue1225.scad | 5 ++++ tests/CMakeLists.txt | 3 +- .../cgalpngtest/issue1225-expected.png | Bin 0 -> 7247 bytes .../monotonepngtest/issue1225-expected.png | Bin 0 -> 7247 bytes .../opencsgtest/issue1225-expected.png | Bin 0 -> 7414 bytes tests/validatestl.py | 26 ++++++++++++++---- 6 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 testdata/scad/bugs/issue1225.scad create mode 100644 tests/regression/cgalpngtest/issue1225-expected.png create mode 100644 tests/regression/monotonepngtest/issue1225-expected.png create mode 100644 tests/regression/opencsgtest/issue1225-expected.png diff --git a/testdata/scad/bugs/issue1225.scad b/testdata/scad/bugs/issue1225.scad new file mode 100644 index 00000000..4792cbc8 --- /dev/null +++ b/testdata/scad/bugs/issue1225.scad @@ -0,0 +1,5 @@ +cylinder(h = 19.05, r = 25.4); +translate([-20, -2.26, 19.05]) { + translate([0, 4.375, 0]) sphere(1); + translate([7.5, 1.875, 0]) sphere(1); +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 93658a0f..2804c9c8 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1274,7 +1274,8 @@ list(APPEND BUGS_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue13.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue945d.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue945e.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue1223.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue1223b.scad) + ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue1223b.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue1225.scad) # We know that we cannot import weakly manifold files into CGAL, so to make tests easier # to manage, don't try. Once we improve import, we can reenable this diff --git a/tests/regression/cgalpngtest/issue1225-expected.png b/tests/regression/cgalpngtest/issue1225-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..e72475a733e801a92a7a94ab1cc96056a8eb11fe GIT binary patch literal 7247 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 literal 0 HcmV?d00001 diff --git a/tests/regression/monotonepngtest/issue1225-expected.png b/tests/regression/monotonepngtest/issue1225-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..e72475a733e801a92a7a94ab1cc96056a8eb11fe GIT binary patch literal 7247 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 literal 0 HcmV?d00001 diff --git a/tests/regression/opencsgtest/issue1225-expected.png b/tests/regression/opencsgtest/issue1225-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..997ced686020963d27467e44a9b5bf18aec22d41 GIT binary patch literal 7414 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 # @@ -17,14 +20,15 @@ import io import hashlib import os import subprocess +import math from collections import Counter def read_stl(filename): triangles = list() with open(filename, "r") as fd: triangle = { - "facet": [0, 0, 0], - "points": list() + 'normal': [0, 0, 0], + 'points': list() } for line in fd: line = line.strip() @@ -37,7 +41,7 @@ def read_stl(filename): elif line.startswith('facet'): parts = line.split(' ') for i in range(2, 5): - triangle['facet'][i-2] = float(parts[i]) + triangle['normal'][i-2] = float(parts[i]) continue elif line.startswith('vertex'): parts = line.split(' ') @@ -51,7 +55,7 @@ def read_stl(filename): elif line.startswith('endfacet'): triangles.append(triangle) triangle = { - "facet": [0, 0, 0], + "normal": [0, 0, 0], "points": list() } continue @@ -64,7 +68,9 @@ class Mesh(): def __init__(self, triangles): points = list() p_triangles = list() + p_normals = list() for triangle in triangles: + p_normals.append(triangle['normal']) p_triangle = list() for point in triangle['points']: if point not in points: @@ -75,10 +81,20 @@ class Mesh(): p_triangles.append(p_triangle) self.points = points self.triangles = p_triangles + self.normals = p_normals def validateSTL(filename): mesh = read_stl(filename); + + if len([n[i] for i in range(0,3) for n in mesh.points if math.isinf(n[i]) or math.isnan(n[i])]): + print "NaN of Inf vertices found" + return False + + if len([n[i] for i in range(0,3) for n in mesh.normals if math.isinf(n[i]) or math.isnan(n[i])]): + print "NaN of Inf normals found" + return False + edges = Counter((t[i], t[(i+1)%3]) for i in range(0,3) for t in mesh.triangles) reverse_edges = Counter((t[(i+1)%3], t[i]) for i in range(0,3) for t in mesh.triangles) edges.subtract(reverse_edges)