From a55e8c50dfda6b82a8f8e69b72132a5c538d309e Mon Sep 17 00:00:00 2001 From: Rodrigo Bertoldo de Sousa Martins Date: Tue, 22 Sep 2026 10:53:11 -0300 Subject: [PATCH] atualizacao atlas Signed-off-by: Rodrigo Bertoldo de Sousa Martins --- data-pipeline/scripts/extract-manifest.mjs | 36 +++++++++++++++++-- data-pipeline/scripts/muscle-descriptions.mjs | 6 ++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/data-pipeline/scripts/extract-manifest.mjs b/data-pipeline/scripts/extract-manifest.mjs index f51d241..3742777 100644 --- a/data-pipeline/scripts/extract-manifest.mjs +++ b/data-pipeline/scripts/extract-manifest.mjs @@ -560,6 +560,33 @@ function stripSideSuffix(rawName) { return { base: rawName.trim(), suffix: null }; } +// O Z-Anatomy tem os 3 músculos intercostais (externo/interno/íntimo) +// como 11 instâncias repetidas por lado (uma por espaço intercostal), mas +// só com o nome genérico — sem indicar QUAL espaço. Nomeamos cada +// instância pelo espaço intercostal, usando `n` (o contador de ocorrência +// já calculado por nome bruto — ver `nameCounts` no loop principal): a +// ordem em que o Z-Anatomy lista as instâncias no arquivo original segue +// a ordem anatômica das costelas (1º espaço primeiro, ao lado da +// clavícula), então o contador de ocorrência já serve como número do +// espaço, sem precisar calcular posição 3D nenhuma. Só pra pedidos de +// espaço intercostal — não altera nenhum outro músculo. +const INTERCOSTAL_MUSCLE_BASES = new Set([ + "external intercostal muscles", + "internal intercostal muscles", + "innermost intercostal muscles", +]); + +function ordinalEn(n) { + const rem100 = n % 100; + if (rem100 >= 11 && rem100 <= 13) return `${n}th`; + switch (n % 10) { + case 1: return `${n}st`; + case 2: return `${n}nd`; + case 3: return `${n}rd`; + default: return `${n}th`; + } +} + // Retorna null se o nome bruto não corresponder a nenhum dos 206 ossos — // nesse caso a malha é ignorada (não vira estrutura, mas continua no // arquivo .glb; como não há "structure" apontando pra ela, o frontend já @@ -848,8 +875,13 @@ for (const { fbx, key } of SOURCES) { const { base, suffix } = stripSideSuffix(rawName); const sideLabelPt = suffix === "l" ? " Esquerdo" : suffix === "r" ? " Direito" : ""; const sideWordEn = suffix === "l" ? "Left " : suffix === "r" ? "Right " : ""; - namePt = `${translateToPt(base)}${sideLabelPt}` + (n > 1 ? ` (${n})` : ""); - nameEn = `${sideWordEn}${base}` + (n > 1 ? ` (${n})` : ""); + const isIntercostal = key === "muscular" && INTERCOSTAL_MUSCLE_BASES.has(base.toLowerCase()); + namePt = isIntercostal + ? `${translateToPt(base)}${sideLabelPt} — ${n}º Espaço Intercostal` + : `${translateToPt(base)}${sideLabelPt}` + (n > 1 ? ` (${n})` : ""); + nameEn = isIntercostal + ? `${sideWordEn}${base} — ${ordinalEn(n)} Intercostal Space` + : `${sideWordEn}${base}` + (n > 1 ? ` (${n})` : ""); description = key === "regions" ? REGION_DESCRIPTIONS[base.toLowerCase()] ?? "" diff --git a/data-pipeline/scripts/muscle-descriptions.mjs b/data-pipeline/scripts/muscle-descriptions.mjs index e081814..6ccf566 100644 --- a/data-pipeline/scripts/muscle-descriptions.mjs +++ b/data-pipeline/scripts/muscle-descriptions.mjs @@ -100,9 +100,9 @@ export const MUSCLE_DESCRIPTIONS = { "quadratus lumborum muscle": "Na parede posterior do abdome; flexiona lateralmente o tronco e estabiliza a 12ª costela durante a respiração.", "psoas major": "Junto ao ilíaco (iliopsoas), é o principal flexor do quadril, essencial para caminhar e subir escadas.", "iliacus muscle": "Junto ao psoas maior (iliopsoas), flexiona o quadril.", - "external intercostal muscles": "Elevam as costelas durante a inspiração, aumentando o volume da caixa torácica.", - "internal intercostal muscles": "Abaixam as costelas, auxiliando a expiração forçada (e estabilizam o espaço intercostal).", - "innermost intercostal muscles": "Camada mais profunda dos intercostais; função semelhante aos intercostais internos.", + "external intercostal muscles": "Elevam as costelas durante a inspiração, aumentando o volume da caixa torácica. Cada uma das 11 instâncias por lado ocupa um espaço intercostal diferente (o nome indica qual) — é essa referência que se usa clinicamente pra localizar achados, como \"2º espaço intercostal\" nos focos de ausculta cardíaca.", + "internal intercostal muscles": "Abaixam as costelas, auxiliando a expiração forçada (e estabilizam o espaço intercostal). Cada uma das 11 instâncias por lado ocupa um espaço intercostal diferente (o nome indica qual).", + "innermost intercostal muscles": "Camada mais profunda dos intercostais; função semelhante aos intercostais internos. Cada uma das 11 instâncias por lado ocupa um espaço intercostal diferente (o nome indica qual).", "transversus thoracis muscle": "Face interna da parede torácica anterior; auxilia na expiração ao abaixar as costelas.", "levatores breves costarum": "Pequenos feixes que elevam a costela imediatamente abaixo, auxiliando a inspiração.", "levatores longi costarum": "Feixes mais longos que elevam a costela dois níveis abaixo, auxiliando a inspiração.",