diff --git a/core/nodeslicer/nodes/preview.py b/core/nodeslicer/nodes/preview.py index 4968f00..de1b683 100644 --- a/core/nodeslicer/nodes/preview.py +++ b/core/nodeslicer/nodes/preview.py @@ -15,23 +15,20 @@ class SLICENODE_GcodeToMesh(ExecSliceNode): def init(self, context): self._init_exec() - self.add_input("SLICESOCK_Gcode", "Gcode") self.add_input("SLICESOCK_String", "Name") + self.add_multi_socket_group("SLICESOCK_Gcode", name="Gcode") def draw_buttons(self, context, layout): super().draw_buttons(context, layout) layout.prop(self, 'show_e_0') - def evaluate(self, operator=None): - gcode: str = self.resolve("Gcode") - mesh_name: str = self.resolve("Name") - + def _process_gcode(self, gcode: str, mesh_name: str, operator=None): if not gcode: if mesh_name in bpy.data.objects: obj = bpy.data.objects[mesh_name] if obj.type == 'MESH': obj.data.clear_geometry() - return 'empty' + return vertices = [] edges = [] @@ -128,7 +125,7 @@ class SLICENODE_GcodeToMesh(ExecSliceNode): last_e = new_e if not vertices: - return 'no segments' + return # Create or find "Debug" mesh object 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.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'