batched mesh preview

This commit is contained in:
Nicolas Predella 2026-06-02 12:30:50 +03:00
parent cebc165282
commit c1b3cde57f

View file

@ -15,23 +15,20 @@ class SLICENODE_GcodeToMesh(ExecSliceNode):
def init(self, context): def init(self, context):
self._init_exec() self._init_exec()
self.add_input("SLICESOCK_Gcode", "Gcode")
self.add_input("SLICESOCK_String", "Name") self.add_input("SLICESOCK_String", "Name")
self.add_multi_socket_group("SLICESOCK_Gcode", name="Gcode")
def draw_buttons(self, context, layout): def draw_buttons(self, context, layout):
super().draw_buttons(context, layout) super().draw_buttons(context, layout)
layout.prop(self, 'show_e_0') layout.prop(self, 'show_e_0')
def evaluate(self, operator=None): def _process_gcode(self, gcode: str, mesh_name: str, operator=None):
gcode: str = self.resolve("Gcode")
mesh_name: str = self.resolve("Name")
if not gcode: if not gcode:
if mesh_name in bpy.data.objects: if mesh_name in bpy.data.objects:
obj = bpy.data.objects[mesh_name] obj = bpy.data.objects[mesh_name]
if obj.type == 'MESH': if obj.type == 'MESH':
obj.data.clear_geometry() obj.data.clear_geometry()
return 'empty' return
vertices = [] vertices = []
edges = [] edges = []
@ -128,7 +125,7 @@ class SLICENODE_GcodeToMesh(ExecSliceNode):
last_e = new_e last_e = new_e
if not vertices: if not vertices:
return 'no segments' return
# Create or find "Debug" mesh object # Create or find "Debug" mesh object
if mesh_name in bpy.data.objects: if mesh_name in bpy.data.objects:
@ -179,4 +176,25 @@ class SLICENODE_GcodeToMesh(ExecSliceNode):
mod = obj.modifiers.new(name="Preview", type='NODES') # type: ignore mod = obj.modifiers.new(name="Preview", type='NODES') # type: ignore
mod.node_group = ng mod.node_group = ng
def evaluate(self, operator=None):
gcodes = self.resolve_multi_input("Gcode")
base_mesh_name: str = self.resolve("Name")
if not base_mesh_name:
base_mesh_name = "GcodePreview"
# Filter out empty inputs but keep structure to index properly
valid_gcodes = [g for g in gcodes if g]
if not valid_gcodes:
if base_mesh_name in bpy.data.objects:
obj = bpy.data.objects[base_mesh_name]
if obj.type == 'MESH':
obj.data.clear_geometry()
return 'empty'
for i, gcode in enumerate(valid_gcodes):
mesh_name = base_mesh_name if i == 0 else f"{base_mesh_name}_{i+1}"
self._process_gcode(gcode, mesh_name, operator)
return 'ok' return 'ok'