You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

71 lines
2.6 KiB

# System
from pathlib import Path
import numpy as np
# OCC
from occwl.solid import Solid
from occwl.uvgrid import uvgrid, ugrid, _uvgrid_reverse_u
# Test
from tests.test_base import TestBase
class GridTester(TestBase):
def test_grids_and_normals(self):
data_folder = self.test_folder() / "test_data"
self.run_test_on_all_files_in_folder(data_folder)
def reverse_u_test(self, grid):
reversed_grid = _uvgrid_reverse_u(grid)
for i in range(grid.shape[0]):
self.assertTrue((reversed_grid[i] == grid[grid.shape[0] - 1 - i]).all())
def face_test(self, face):
num_u = 10
num_v = 10
pts = uvgrid(face, num_u, num_v, method="point")
nor = uvgrid(face, num_u, num_v, method="normal")
length_eps = 1e-3
if pts is not None and nor is not None:
g = np.concatenate((pts, nor), axis=2)
self.reverse_u_test(g)
for i in range(1, num_u):
for j in range(1, num_v):
pt00 = np.array(g[i - 1, j - 1, 0:3])
pt10 = np.array(g[i, j - 1, 0:3])
pt01 = np.array(g[i - 1, j, 0:3])
du = pt10 - pt00
dv = pt01 - pt00
approx_normal = np.cross(du, dv)
if np.linalg.norm(approx_normal) < length_eps:
# We can't do this test for very small vectors
continue
normal = np.array(g[i, j, 3:6])
angle = self.angle_between_vectors(approx_normal, normal)
angle_tol = np.pi / 4.0 # Big tol of 45 degrees
self.assertLess(angle, angle_tol)
def edge_test(self, edge):
num_u = 10
pts = ugrid(edge, num_u, method="point")
tgt = ugrid(edge, num_u, method="tangent")
if pts is not None and tgt is not None:
g = np.concatenate((pts, tgt), axis=1)
for i in range(1, num_u):
pt0 = np.array(g[i - 1, 0:3])
pt1 = np.array(g[i, 0:3])
du = pt1 - pt0
tangent = np.array(g[i, 3:6])
angle = self.angle_between_vectors(du, tangent)
angle_tol = np.pi / 4.0 # Big tol of 45 degrees
self.assertLess(angle, angle_tol)
def run_test(self, solid):
faces = solid.faces()
for face in faces:
self.face_test(face)
edges = solid.edges()
for edge in edges:
self.edge_test(edge)