Ir al contenido

Geometría y coordenadas anidadas

interface ArchiBounds {
x: number | null;
y: number | null;
width: number | null;
height: number | null;
}

Para obtener coordenadas absolutas, sume x/y hacia arriba por la cadena parentId hasta la raíz. Los objetos a nivel de raíz (parentId === null) ya tienen coordenadas relativas a la vista (es decir, absolutas):

function absoluteBounds(
object: ArchiDiagramObject,
byId: Map<string, ArchiDiagramObject>,
): ArchiBounds | null {
let current = object;
let offsetX = 0;
let offsetY = 0;
while (current.parentId) {
const parent = byId.get(current.parentId);
if (!parent?.bounds?.x || !parent?.bounds?.y) break;
offsetX += parent.bounds.x;
offsetY += parent.bounds.y;
current = parent;
}
return object.bounds
? {
x: object.bounds.x !== null ? object.bounds.x + offsetX : null,
y: object.bounds.y !== null ? object.bounds.y + offsetY : null,
width: object.bounds.width,
height: object.bounds.height,
}
: null;
}

Cualquiera de los cuatro campos puede ser null de forma independiente — el analizador nunca fabrica un 0 para un atributo faltante o no numérico. validateArchiModel no comprueba la integridad de los límites; trate un campo null como “no puede posicionarse”.

interface ArchiBendpoint {
startX: number | null;
startY: number | null;
endX: number | null;
endY: number | null;
}

Los valores de ArchiBendpoint siguen la representación nativa del propio Archi: cada punto de control almacena su propio par inicio/fin en lugar de un único punto medio, lo que permite reconstruir la curva de una conexión doblada sin lógica geométrica adicional.