7. Computer-Controlled Machining


💧 From the Rational to the Irrational.

This week, we will be working with subtractive manufacturing through CNC machining. I began by reflecting on the purpose of machining—not just from a functional perspective but an expressive one.

I concluded that machining allows us to transform industrialized and standardized materials into opportunities to push their material and formal characteristics to their limits. A clear example is how wooden planks and sheets can be shaped into free, organic, and innovative elements that, in a way, serve as spiritual guides to their natural origins, sensitive to the variations present across ecosystems. They return to their irrational essence. Erosion as an algorithm, and erosion as an encounter.

Imagen

Learning Plan:

The research project will take place in two phases. The first phase consists of studying erosion as a material shaping process, while the second is an experimentation of erosion as an interaction between two surfaces.

To achieve this, it is essential to understand how to use CNC machining software (CAM). In this case, we will work with VCarve for toolpath generation, while Rhinoceros will be used for modeling. Additionally, we will learn how to operate the CNC remote control, which plays a crucial role in machine operation. This controller is called Richauto.


Among the machining software options, there is the entire family of programs from Vectric, including Aspire, VCarve, and Pathworks. Among them, VCarve is used because it is the default native program that came with the CNC machine. In addition to these software options, manufacturing assistants such as Fusion can also be used.



💧 Research Objectives & Workflow

As previously stated, two exploration paths will be pursued:

1. Algorithmic Folding Pattern

The first approach is based on the shapes of erosion patterns in foam. These are taken as formal objectives to develop a pattern that allows the folding of the machined material to achieve the desired shape. To accomplish this, an algorithm is developed in Grasshopper.

Imagen

2. 3D Machining as an Encounter

In the second phase, the three-dimensional form of the foam's wounds is processed as an opportunity for interaction. This is achieved through 3D machining of columns that support a large, mechanized laceration.

Imagen

💧 Testing tolerances of machined joints (Group Asignment)

1. To test the tolerances we will use for machining, we will employ a catalog of joints, focusing on four of them. This will allow us to identify suitable strategies for different types of connections.

Imagen

Plywood CNC Machining (Laguna Swift)

This week's experiments will be conducted on the newest CNC machine in my workshop, the Laguna Swift. This CNC allows machining all types of wood composites, solid wood, and even different materials such as acrylic and thin metal sheets.

  • Technical Information
  • Spindle Power: 3 HorsePower
  • Spindle Speed: 6,000 - 24,000 RPM
  • Controller Hand-Held Controller (HHC)
  • Gantry Clearance: 7.5 inches
  • Voltage: U220V / 30A
  • Worktable Type: T-Slot
  • Work Area: 1.50 m x 2.60 m
Imagen

💧 Synthesizing the erosions (Personal Asignment)

2. In personal experimentation, the initial step involved converting the foam material into a three-dimensional mesh. To achieve this, two approaches were tested. The first relied on using the HandyScan, which, through the application of targets, allowed for the capture of an initial surface—although with some imperfections.

Imagen

3. Given the failed mesh, another 3D scanning approach was chosen using photogrammetry. A dataset of approximately 100 photos taken with my phone was processed using Agisoft Metashape, resulting in a much more coherent mesh suitable for the intended workflow.

Imagen
Imagen

4. Once we have the 3D mesh, we proceed to manipulate it in Blender to extract parts of the model while simultaneously recreating a laceration in isolation. This allows us to later synthesize it and use it as a subtractive element..

Imagen
Imagen

5. To continue the research, a workflow is proposed using three elements: a Base Mesh (MB) that will function as the receiver of subtractions, a Mehs Cutter (MC) that will move along the MB performing the Boolean subtraction operation, and a script that will allow both elements to interact iteratively. This approach aims to outline an initial simulator for the finishing process of the subtractive machine. The goal is to synthesize the experiments to obtain the first formal results of the project.

Imagen
Imagen
            
                import Rhino.Geometry as rg
                import rhinoscriptsyntax as rs
                import scriptcontext as sc
                import random  # Importar módulo random para el factor de escala
                
                # Definir clave de almacenamiento persistente en scriptcontext
                STICKY_KEY = "MeshBase"
                
                # Si es la primera ejecución o se resetea, usar el MeshBase inicial
                if Reset or STICKY_KEY not in sc.sticky:
                    sc.sticky[STICKY_KEY] = MeshBase
                
                # Obtener el MeshBase almacenado
                CurrentMesh = sc.sticky[STICKY_KEY]
                
                # Capturar clic en la vista de Rhino
                click_pos = rs.GetPoint("Haz clic en el mesh")
                
                # Verificar si hay un Mesh válido y un MeshCutter definido
                if click_pos and CurrentMesh and MeshCutter:
                    # Obtener la vista activa y su cámara
                    view = sc.doc.Views.ActiveView
                    camera_loc = view.ActiveViewport.CameraLocation
                    camera_dir = click_pos - camera_loc  # Dirección del rayo
                    
                    # Crear un rayo desde la cámara hacia el punto clickeado
                    ray = rg.Ray3d(camera_loc, camera_dir)
                
                    # Encontrar la intersección con la malla
                    t = rg.Intersect.Intersection.MeshRay(CurrentMesh, ray)
                
                    # Si hay intersección, calcular el punto exacto
                    if t >= 0:
                        ClosestPoint = camera_loc + (camera_dir * t)
                
                        # Mover el MeshCutter a la posición del clic
                        transformation = rg.Transform.Translation(ClosestPoint - MeshCutter.GetBoundingBox(True).Center)
                        MeshCutterTransformed = MeshCutter.DuplicateMesh()
                        MeshCutterTransformed.Transform(transformation)
                        
                        # Escalar aleatoriamente el MeshCutter entre 0.75 y 2
                        scale_factor = random.uniform(0.75, 1.5)
                        scale_transform = rg.Transform.Scale(ClosestPoint, scale_factor)
                        MeshCutterTransformed.Transform(scale_transform)
                
                        # Realizar la sustracción booleana
                        new_meshes = rg.Mesh.CreateBooleanDifference([CurrentMesh], [MeshCutterTransformed])
                
                        if new_meshes and len(new_meshes) > 0:
                            MeshNew = new_meshes[0]  # Nuevo resultado
                            sc.sticky[STICKY_KEY] = MeshNew  # Guardar en scriptcontext para la siguiente iteración
                        else:
                            print("Error: No se pudo realizar la sustracción booleana.")
                            MeshNew = CurrentMesh  # Mantener el mesh anterior
                    else:
                        print("No se detectó intersección con el MeshBase.")
                        ClosestPoint = None
                        MeshCutterTransformed = None
                        MeshNew = CurrentMesh
                else:
                    print("Error: MeshBase o MeshCutter no válidos.")
                    ClosestPoint = None
                    MeshCutterTransformed = None
                    MeshNew = CurrentMesh
                
                # Outputs
                ResultMesh = MeshNew               # Mesh final después de la sustracción
                CutterPreview = MeshCutterTransformed  # Para visualizar el MeshCutter movido
                ClickPoint = ClosestPoint           # Punto donde se detectó el clic
                
            
            

7.To conclude the workflow, it is necessary to print the two explorations carried out. On one hand, a generic model of the sponge generated with the Grasshopper and Python algorithm. Additionally, the deformed and adjusted model of the original scan, which is given an architectural character by accompanying it with human figurines. The printing was done using an Artillery Sidewinder X4 printer.

  • Build Volume: 300 x 300 x 400 mm
  • Printing Technology: Fused Deposition Modeling (FDM)
  • Nozzle Diameter: 0.4 mm (standard), compatible con otros tamaños
  • Filament Compatibility: PLA, ABS, PETG, TPU, Wood, Carbon Fiber
  • Bed Type: Plataforma de vidrio calefactada
  • Bed Temperature: Hasta 110°C
  • Hotend Temperature: Hasta 300°C
  • Layer Resolution: 50 - 300 micrones
  • Connectivity: Tarjeta SD, USB, Wi-Fi
  • Display: Pantalla táctil a color
  • Power Supply: 110V/220V
  • Auto Bed Leveling:
  • Extruder Type: Direct Drive
  • Dual Z-axis:
Imagen
Imagen
Imagen
Imagen
Imagen

💧 Downloadable Files