Closed Nicolaus93 closed 5 months ago
For anybody facing the same issue. A possible workaround could be to instantiate the rtree outside of trimesh and then store it into the mesh cache
def set_mesh_rtree(mesh: trimesh.Trimesh, tree_path: str) -> None:
if pathlib.Path(tree_path).exists():
raise FileExistsError(f"RTree already exists at specified location {tree_path}")
min_bounds = mesh.triangles.min(axis=1)
max_bounds = mesh.triangles.max(axis=1)
bounds = np.column_stack((min_bounds, max_bounds))
tree = rtree.index.Index(
tree_path,
zip(np.arange(len(mesh.faces)), bounds, [None] * len(mesh.faces)),
properties=rtree.index.Property(dimension=3),
)
mesh._cache.cache["triangles_tree"] = tree
In the end it was a permission error, similar to https://github.com/Toblerity/rtree/issues/185 The problem with the current version of rtree is that it doesn't write to the /tmp directory but to the current working directory. Hopefully this will be fixed in the next release of rtree - see https://github.com/libspatialindex/libspatialindex/pull/220 (which is included in the latest release of libspatialindex).
I'm using trimesh on some big meshes (> 1 million faces). It often happens that when I'm calling
mesh.triangles_tree
I get the following rtree error:rtree.exceptions.RTreeError: Error in "Index_CreateWithStream": Tools::TemporaryFile: Cannot create temporary file name.
This is caused by the rtree library. My guess is that this happens because the rtree is first initialized with default parameters here. This means that the storage will be set toRT_Memory
. Probably with big meshes the rtee implementation realizes that it doesn't have enough memory to keep all data and starts writing to a temporary file. Then I get the error for some reason, but unfortunately I wasn't able to fully reproduce the bug yet. I have 2 questions:filename
as first argument in the constructor? This way I would create manually the file and make sure there are no problems