Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
If True raise a ValueError if a mesh
that should be loadable returns a non- Trimesh object.
Returns
----------
meshes : list
Trimesh objects from models folder
"""
# use deterministic file name order
file_names = sorted(os.listdir(dir_models))
meshes = []
for file_name in file_names:
extension = trimesh.util.split_extension(file_name).lower()
if extension in trimesh.available_formats():
loaded = trimesh.util.make_sequence(get_mesh(file_name))
for m in loaded:
# is the loaded mesh a Geometry object or a subclass:
# Trimesh, PointCloud, Scene
type_ok = isinstance(m, trimesh.parent.Geometry)
if raise_error and not type_ok:
raise ValueError('%s returned a non- Trimesh object!',
file_name)
if not isinstance(m, trimesh.Trimesh) or (
only_watertight and not m.is_watertight):
continue
meshes.append(m)
yield m
else:
log.warning('%s has no loader, not running test on!',
file_name)
to run, total points sampled is
count * factor * max_iter
Returns
-----------
hit : (n, 2) float
Random points inside polygon
"""
poly = self.polygons_full
if len(poly) == 0:
samples = np.array([])
elif len(poly) == 1:
samples = polygons.sample(poly[0], count=count, **kwargs)
else:
samples = util.vstack_empty([
polygons.sample(i, count=count, **kwargs)
for i in poly])
return samples
as_int : (n, d) int
Data as integers
"""
# convert to any numpy array
data = np.asanyarray(data)
# if data is already an integer or boolean we're done
# if the data is empty we are also done
if data.dtype.kind in 'ib' or data.size == 0:
return data.astype(dtype)
# populate digits from kwargs
if digits is None:
digits = util.decimal_to_digits(tol.merge)
elif isinstance(digits, float) or isinstance(digits, np.float):
digits = util.decimal_to_digits(digits)
elif not (isinstance(digits, int) or isinstance(digits, np.integer)):
log.warning('Digits were passed as %s!', digits.__class__.__name__)
raise ValueError('Digits must be None, int, or float!')
# data is float so convert to large integers
data_max = np.abs(data).max() * 10**digits
# ignore passed dtype if we have something large
dtype = [np.int32, np.int64][int(data_max > 2**31)]
# multiply by requested power of ten
# then subtract small epsilon to avoid "go either way" rounding
# then do the rounding and convert to integer
as_int = np.round((data * 10 ** digits) - 1e-6).astype(dtype)
return as_int
# if vertex normals are stored in cache export them
# these will have been autogenerated if they have ever been called
face_type.append('vn')
export += 'vn '
export += util.array_to_string(mesh.vertex_normals,
col_delim=' ',
row_delim='\nvn ',
digits=8) + '\n'
if (include_texture and
'vertex_texture' in mesh.metadata and
len(mesh.metadata['vertex_texture']) == len(mesh.vertices)):
# if vertex texture exists and is the right shape export here
face_type.append('vt')
export += 'vt '
export += util.array_to_string(mesh.metadata['vertex_texture'],
col_delim=' ',
row_delim='\nvt ',
digits=8) + '\n'
# the format for a single vertex reference of a face
face_format = face_formats[tuple(face_type)]
faces = 'f ' + util.array_to_string(mesh.faces + 1,
col_delim=' ',
row_delim='\nf ',
value_format=face_format)
# add the exported faces to the export
export += faces
return export
Return the discrete mean curvature measure of a sphere centered
at a point as detailed in 'Restricted Delaunay triangulations and normal
cycle', Cohen-Steiner and Morvan.
Parameters
----------
points : (n,3) float, list of points in space
radius : float, the sphere radius
Returns
--------
mean_curvature: (n,) float, discrete mean curvature measure.
"""
points = np.asanyarray(points, dtype=np.float64)
if not util.is_shape(points, (-1, 3)):
raise ValueError('points must be (n,3)!')
# axis aligned bounds
bounds = np.column_stack((points - radius,
points + radius))
# line segments that intersect axis aligned bounding box
candidates = [list(mesh.face_adjacency_tree.intersection(b))
for b in bounds]
mean_curv = np.empty(len(points))
for i, (x, x_candidates) in enumerate(zip(points, candidates)):
endpoints = mesh.vertices[mesh.face_adjacency_edges[x_candidates]]
lengths = line_ball_intersection(
endpoints[:, 0],
endpoints[:, 1],
obj : shapely.geometry.Polygon, str (wkb), or (n, 2) float
Object which might be a polygon
Returns
------------
polygon : shapely.geometry.Polygon
Valid polygon object
Raises
-------------
ValueError
If a valid finite- area polygon isn't available
"""
if isinstance(obj, Polygon):
polygon = obj
elif util.is_shape(obj, (-1, 2)):
polygon = Polygon(obj)
elif util.is_string(obj):
polygon = load_wkb(obj)
else:
raise ValueError('Input not a polygon!')
if (not polygon.is_valid or
polygon.area < tol.zero):
raise ValueError('Polygon is zero- area or invalid!')
return polygon
increment : bool
If True increment group code per point
Example:
[[X0, Y0, Z0], [X1, Y1, Z1]]
Result, new lines replaced with spaces:
True -> 10 X0 20 Y0 30 Z0 11 X1 21 Y1 31 Z1
False -> 10 X0 20 Y0 30 Z0 10 X1 20 Y1 30 Z1
Returns
-----------
packed : str
Points formatted with group code
"""
points = np.asanyarray(points, dtype=np.float64)
# get points in 3D
three = util.stack_3D(points)
if increment:
group = np.tile(
np.arange(len(three), dtype=np.int).reshape((-1, 1)),
(1, 3))
else:
group = np.zeros((len(three), 3), dtype=np.int)
group += [10, 20, 30]
if as_2D:
group = group[:, :2]
three = three[:, :2]
packed = '\n'.join('{:d}\n{:.12f}'.format(g, v)
for g, v in zip(group.reshape(-1),
three.reshape(-1)))
Take a sparse (n,3) list of integer indexes of filled cells,
turn it into a dense (m,o,p) matrix.
Parameters
-----------
sparse : (n, 3) int
Index of filled cells
Returns
------------
dense : (m, o, p) bool
Matrix of filled cells
"""
sparse = np.asanyarray(sparse, dtype=np.int)
if not util.is_shape(sparse, (-1, 3)):
raise ValueError('sparse must be (n,3)!')
shape = sparse.max(axis=0) + 1
matrix = np.zeros(np.product(shape), dtype=np.bool)
multiplier = np.array([np.product(shape[1:]), shape[2], 1])
index = (sparse * multiplier).sum(axis=1)
matrix[index] = True
dense = matrix.reshape(shape)
return dense
Returns
----------
closest : (m, 3) float
Closest point on triangles for each point
distance : (m,) float
Distances between point and triangle
triangle_id : (m,) int
Index of triangle containing closest point
"""
# get triangles from mesh
triangles = mesh.triangles.view(np.ndarray)
# establish that input points are sane
points = np.asanyarray(points, dtype=np.float64)
if not util.is_shape(triangles, (-1, 3, 3)):
raise ValueError('triangles shape incorrect')
if not util.is_shape(points, (-1, 3)):
raise ValueError('points must be (n,3)')
# create a giant tiled array of each point tiled len(triangles) times
points_tiled = np.tile(points, (1, len(triangles)))
on_triangle = np.array([closest_point_corresponding(
triangles, i.reshape((-1, 3))) for i in points_tiled])
# distance squared
distance_2 = [((i - q)**2).sum(axis=1)
for i, q in zip(on_triangle, points)]
triangle_id = np.array([i.argmin() for i in distance_2])
# closest cartesian point
closest = np.array([g[i] for i, g in zip(triangle_id, on_triangle)])
distance = np.array([g[i] for i, g in zip(triangle_id, distance_2)]) ** .5