forked from s_ranjbar/city_retrofit
98 lines
2.5 KiB
Python
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}
|