city_retrofit/venv/lib/python3.7/site-packages/trimesh/boolean.py

98 lines
2.5 KiB
Python

"""
boolean.py
-------------
Do boolean operations on meshes using either Blender or OpenSCAD.
"""
from . import interfaces
def difference(meshes, engine=None, **kwargs):
"""
Compute the boolean difference between a mesh an n other meshes.
Parameters
----------
meshes : list of trimesh.Trimesh
Meshes to be processed
engine : str
Which backend to use, i.e. 'blender' or 'scad'
Returns
----------
difference : a - (other meshes), **kwargs for a Trimesh
"""
result = _engines[engine](meshes, operation='difference', **kwargs)
return result
def union(meshes, engine=None, **kwargs):
"""
Compute the boolean union between a mesh an n other meshes.
Parameters
----------
meshes : list of trimesh.Trimesh
Meshes to be processed
engine : str
Which backend to use, i.e. 'blender' or 'scad'
Returns
----------
union : a + (other meshes), **kwargs for a Trimesh
"""
result = _engines[engine](meshes, operation='union', **kwargs)
return result
def intersection(meshes, engine=None, **kwargs):
"""
Compute the boolean intersection between a mesh an n other meshes.
Parameters
----------
meshes : list of trimesh.Trimesh
Meshes to be processed
engine : str
Which backend to use, i.e. 'blender' or 'scad'
Returns
----------
intersection : **kwargs for a Trimesh object of the
volume that is contained by all meshes
"""
result = _engines[engine](meshes, operation='intersection', **kwargs)
return result
def boolean_automatic(meshes, operation, **kwargs):
"""
Automatically pick an engine for booleans based on availability.
Parameters
--------------
meshes : list of Trimesh
Meshes to be booleaned
operation : str
Type of boolean, i.e. 'union', 'intersection', 'difference'
Returns
---------------
result : trimesh.Trimesh
Result of boolean operation
"""
if interfaces.blender.exists:
result = interfaces.blender.boolean(meshes, operation, **kwargs)
elif interfaces.scad.exists:
result = interfaces.scad.boolean(meshes, operation, **kwargs)
else:
raise ValueError('No backends available for boolean operations!')
return result
# which backend boolean engines
_engines = {None: boolean_automatic,
'auto': boolean_automatic,
'scad': interfaces.scad.boolean,
'blender': interfaces.blender.boolean}