slice angled

This commit is contained in:
Nicolas Predella 2026-06-02 10:18:25 +03:00
parent 083aa66436
commit 370a2d95cc
3 changed files with 21 additions and 10 deletions

View file

@ -38,22 +38,28 @@ class SLICENODE_SliceShells(SliceNode):
def init(self, context):
self.add_input("SLICESOCK_Mesh")
self.add_input("SLICESOCK_Float", "Layer Height").value = 0.2
self.add_input("SLICESOCK_VectorRotation", "Rotation")
self.add_output("SLICESOCK_Paths")
def evaluate_output(self, socket_name: str, **_kwargs) -> SlicePaths:
if socket_name != "Paths": return SlicePaths()
slicing_collection: SlicingCollection | None = self.resolve("Mesh")
coll: SlicingCollection | None = self.resolve("Mesh")
layer_height: float = self.resolve("Layer Height")
rotation: Any = self.resolve("Rotation") or (0.0, 0.0, 0.0)
if not slicing_collection: return SlicePaths()
if not coll: return SlicePaths()
merged_object = SlicingObject()
coll: SlicingCollection = self.resolve("Mesh")
if coll:
for obj in coll.objects:
merged_object.mesh = np.concatenate([merged_object.mesh, obj.mesh], axis=0)
if rotation and any(rotation):
from mathutils import Euler
mat = np.array(Euler(rotation).to_matrix().inverted())
merged_object.mesh[:, :3, :] = merged_object.mesh[:, :3, :] @ mat.T
merged_object.mesh[:, 3:4, :] = merged_object.mesh[:, 3:4, :] @ mat.T
min_z = merged_object.mesh[:,0:3,2:3].min()
from math import floor
min_z = floor(min_z / layer_height) * layer_height
@ -63,9 +69,14 @@ class SLICENODE_SliceShells(SliceNode):
slices_group: list[list[np.ndarray]] | None = slice_at_range([merged_object.mesh], z_values)
assert slices_group
slices = slices_group[0]
slices = SlicePaths(slices_group[0])
return SlicePaths(slices)
if rotation and any(rotation):
from mathutils import Euler
mat_inv = np.array(Euler(rotation).to_matrix())
slices = slices.transform(mat_inv)
return slices
@register_class
class SLICENODE_BufferShells(SliceNode):

View file

@ -57,7 +57,7 @@ All nodes are found in the **Add (Shift+A)** menu under the **SliceNodes** categ
- **Extrusion Multiplier Attribute**: Mesh attribute to use for per-segment extrusion rates.
- **Feedrate Attribute**: Mesh attribute to use for per-segment feedrates.
- **Extra Attributes**: Dictionary mapping mesh attribute names to custom G-code prefixes (e.g., `opening_size` -> `S`).
- **Slice Shells**: Slices a `SlicingObject` into 2D `SlicePaths` at a given layer height.
- **Slice Shells**: Slices a `SlicingObject` into 2D `SlicePaths` at a given layer height. Supports rotation for slicing at an angle.
- **Buffer Shells**: Offsets/buffers 2D `SlicePaths`. Supports rotated offsetting and multiple miter types.
- **Infill**: Generates a cross-hatch grid or parallel lines clipped by boundary paths.
- **Infill Type**: Switch between **Grid** (cross-hatch) and **Rectilinear** (alternating parallel lines).

View file

@ -67,5 +67,5 @@ Once you are happy with the preview:
## 5. Tips for Success
* **Scale**: The slicer treats 1 Blender unit as 1 meter, but scales everything to **mm** for the G-code output.
* **Orientation**: The slicer currently assumes your object is oriented correctly for printing (Z is up).
* **Orientation**: The slicer currently assumes your object is oriented correctly for printing (Z is up). You can use the **Rotation** input on the **Slice Shells** node to slice at an angle if needed.
* **Performance**: For very complex meshes, the "Get Mesh" and "Slice Shells" nodes might take a moment to compute. The result is cached, so changing settings further down the chain (like Infill density) will be much faster.