kapy academy

Objetos hechos de código

8 min readUpdated ago 2026

Algunos objetos son una lista corta de pasos. Otros son una regla: una rejilla de ventilación cuyo número de ranuras sale de la cara donde aterriza, una textura calculada sobre un área, un entramado que se afina donde la pared es gruesa. Esos no puedes dibujarlos una vez y reproducirlos, porque la geometría es distinta cada vez. Crea uno con Nuevo Smart Object y el agarre Code, y escribe la regla.

Como toda la autoría, esto es cosa de Maker. Colocar el objeto de código de otro es gratis.

El editor partido

El panel de Diseño se parte en un editor de código a la izquierda y una vista previa 3D viva a la derecha, con un separador que puedes arrastrar; dónde lo dejes se recuerda. La línea de tiempo de operaciones desaparece, porque no hay operaciones que listar. El código es el modelo.

Al lado del código hay un deslizador vertical que funciona como el marcador de la línea de tiempo que ya conoces. El marcador salta entre sentencias de primer nivel, y todo lo que queda por debajo se dibuja atenuado, así que puedes bajar por tu propio script y ver aparecer la forma paso a paso. Un bloque for o if cuenta como una sola parada: el bloque entero o nada.

La vista previa recompila alrededor de un tercio de segundo después de que dejes de teclear. Esa cadencia es el ritmo de trabajo real de este editor: teclear, mirar a la derecha, seguir tecleando.

El archivo del que partes

Un objeto de código nuevo no viene vacío. Llega ejecutable, para que la vista previa tenga algo que mostrar desde que se abre la pestaña:

export const meta = {
    id: "my-object",
    name: "My object",
    version: "1.0.0",
    category: "Custom",
} satisfies PartMeta;

export default smartObject(
    ({ region }: { region: Region<{ prompt: "Pick a face to build on" }> }) => {
        const [cx, cy] = region.anchor;
        const radius = 5;
        // …build a ring of points…
        return region.cut([[ring]], { depth: 5 });
    },
);

Dos mitades, y las dos importan. meta es la identidad del objeto, incluida la cadena de versión que va a publicar el guardado. La exportación por defecto es la regla: declara lo que tiene que elegir quien lo coloca, en la firma desestructurada, y devuelve geometría construida a partir de ahí.

El arranque corta un agujero de 5 mm de radio y 5 mm de profundidad en la cara que le señalen. Cambia los números, mira la vista previa, y ya has aprendido el bucle.

El fuente es TypeScript, y la extensión del archivo es .kpycode.

Qué elige quien lo coloca

La firma es la interfaz. Declarar region pide una cara plana o una región de croquis dibujada sobre una, y la cadena prompt es el texto que se le muestra mientras elige. Declarar un cuerpo en su lugar pide un sólido entero, y el resultado sustituye a ese cuerpo en vez de añadirse a él.

Cambiar de una cosa a la otra mientras editas está permitido, y el objeto te sigue: pasa la selección de una región a un cuerpo y el objeto queda reclasificado como objeto sobre cuerpo en el siguiente guardado. Lo que no conviene es cambiarlo a la ligera en un objeto que otros ya han colocado, porque después su colocación apunta a algo del tipo equivocado.

Los parámetros de configuración van en la misma firma, y llegan al popover de la colocación igual que cualquier parámetro exportado. Qué parámetros exponer vale aquí sin cambios: expón las decisiones, calcula las consecuencias.

El sandbox es puro a propósito

Tu script se ejecuta en un sandbox pequeño dentro del navegador, con un techo de 30 segundos y unos cientos de megabytes de memoria. Dentro hay tres cosas apagadas: Math.random, Date y performance.

Eso es la garantía que hace que el objeto merezca publicarse, no una limitación que haya que sortear. Mismas entradas, misma geometría, en tu máquina y en la de un desconocido, este mes y dentro de un año. Una variación aleatoria significaría que nadie puede reproducir jamás una pieza construida con tu objeto.

Ten claro cómo vas a enterarte, porque tanto la comprobación de tipos del editor como el mensaje de error te mandan por el camino equivocado. Llamar a Math.random() compila en verde y luego revienta al construir con Math.random is disabled: the KapyCode sandbox is pure (same inputs → same solid). Use random(seed) (smart object, Phase 2). Sigue ese consejo y random(seed) revienta a su vez, con random(seed) is a smart-object feature (Phase 2); a MODEL is deterministic without it. No hay ningún generador con semilla al que llegar en el sandbox, ni en un objeto de código ni en ningún otro sitio.

Así que deriva el ruido de las entradas. Un hash de las coordenadas, o del índice del bucle, te da una dispersión que es estable y que quien coloque el objeto puede reproducir.

Las constantes de calibración están disponibles para los scripts, y esa es la razón más fuerte para escribir un objeto como código. Una textura que lee MIN_GAP, o un encaje a presión que dimensiona su hueco desde FIT_SLIDE, sale bien en la impresora de quien lo coloca en vez de en la tuya. Material, máquina y tus propios números explica qué representan esos valores.

Guardar, y qué hace guardar

Dos mecanismos, y se comportan distinto.

El autoguardado se salta un búfer que no compila. Se ejecuta un par de segundos después de que dejes de teclear, y un borrador roto no se escribe nunca encima de uno bueno: el guardado se reprograma hasta que el código vuelve a construir. Puedes dejar media expresión en pantalla e irte a comer.

Cmd/Ctrl+S, o el botón de guardar, guarda y publica. Escribe una versión local sellada con la cadena version de meta. Sobre un búfer roto se niega, con el mensaje Fix the errors before publishing, sin traducir.

Guardar sobrescribe la versión en su sitio

Las versiones locales de un objeto de código se sellan desde meta.version, y guardar con la misma cadena sobrescribe esa versión en lugar de crear una nueva. Las colocaciones fijadas a 1.0.0 en otros documentos se llevan la geometría nueva.

Eso es cómodo mientras desarrollas y peligroso en cuanto lo usa alguien más. La disciplina es sencilla: sube meta.version antes de guardar un cambio que altere la geometría, igual que subirías cualquier otro paquete publicado. Parche para un arreglo en el que nadie tiene que pensar, menor para parámetros nuevos que dejan funcionando los ajustes viejos, mayor para cualquier cosa que rompa una configuración existente.

La inmutabilidad de la que habrás leído se aplica a las publicaciones de la tienda. Aquí no.

Compartir un objeto de código

Un objeto de código no se puede publicar hoy en la tienda pública. La tienda acepta documentos, y un script .kpycode no lo es.

Lo que sí puedes hacer es mandar el archivo. El botón de exportar de un objeto de código dice Export .kpycode, sin traducir, y soltar el archivo en el gestor de archivos de otra persona lo importa. Reimportar un archivo con el mismo nombre sobrescribe el borrador de ese objeto, lo que convierte el archivo en un canal de actualización razonable dentro de un equipo y malo con desconocidos.

Hay una condición en el otro extremo. Importar un objeto inteligente pide el plan Maker. Un compañero con plan gratuito que suelte tu .kpycode recibe el panel de mejora de plan, no un objeto, así que el archivo solo llega a gente que ya tiene el plan.

Cuando falla

Preview unavailable, con The code doesn't compile (line {N}). Fix it to resume the live preview. Los dos mensajes llegan sin traducir. La última vista previa buena se queda congelada detrás de la capa de aviso, así que lo que estás mirando no es lo que construiría el búfer actual. Ve a la línea que te nombra.

El guardado se niega con Fix the errors before publishing. Misma causa. El autoguardado también lleva rato saltándose el turno en silencio, así que el borrador del servidor es más viejo de lo que crees.

La vista previa está vacía y el código compila. El script se ejecutó y no devolvió ninguna geometría que corte el cuerpo de entrada. Arrastra el deslizador sentencia a sentencia y busca la primera que no produce nada.

El script agota el tiempo. Treinta segundos dan para mucha geometría. Un bucle que escala con el área de la cara llegará al techo en una pieza grande aunque fuera instantáneo sobre el cubo de referencia, así que prueba sobre una cara grande antes de soltarlo.

Una colocación hecha con un guardado anterior se ve distinta ahora. Guardaste sobre la misma meta.version. Súbela.

Ver también

Discord