diff --git a/data-pipeline/scripts/muscle-descriptions.mjs b/data-pipeline/scripts/muscle-descriptions.mjs index 9935743..e081814 100644 --- a/data-pipeline/scripts/muscle-descriptions.mjs +++ b/data-pipeline/scripts/muscle-descriptions.mjs @@ -17,7 +17,7 @@ export const MUSCLE_DESCRIPTIONS = { "pectoralis major": "Músculo grande e em leque do tórax anterior; aduz e roda medialmente o braço, e o flexiona a partir de posição estendida.", "pectoralis minor": "Sob o peitoral maior; traciona a escápula para baixo e para frente, e eleva as costelas na respiração forçada.", "rectus abdominis": "Par de músculos verticais na linha média do abdome; flexiona o tronco e comprime o conteúdo abdominal. Na malha 3D aparece como uma superfície lisa, mas na pessoa de verdade é cruzado por 3-4 intersecções tendíneas horizontais que criam o 'tanquinho' — veja a ilustração na descrição.", - "external oblique": "Camada mais superficial dos músculos laterais do abdome; flexiona e roda o tronco para o lado oposto, e comprime o abdome. Suas fibras superiores se entrelaçam (interdigitam) com as do serrátil anterior nas costelas, um encaixe que não aparece na malha 3D — veja a ilustração na descrição.", + "external oblique": "Camada mais superficial das 4 que formam a parede abdominal (por fora do oblíquo interno e do transverso — veja a ilustração na descrição); flexiona e roda o tronco para o lado oposto, e comprime o abdome. Suas fibras superiores também se entrelaçam com as do serrátil anterior nas costelas.", "internal oblique": "Camada intermediária dos músculos laterais do abdome; flexiona e roda o tronco para o mesmo lado, e comprime o abdome.", "latissimus dorsi": "O maior músculo do dorso; estende, aduz e roda medialmente o braço — o principal músculo do movimento de 'puxar para baixo' (ex: nadar, remar).", "gluteus maximus": "O maior e mais superficial músculo glúteo; principal extensor do quadril, essencial para subir escadas e levantar-se de uma cadeira.", @@ -92,9 +92,9 @@ export const MUSCLE_DESCRIPTIONS = { "thyro-epiglottic part of thyro-arytenoid muscle": "Porção tireoepiglótica do tireoaritenóideo; auxilia a estreitar a entrada da laringe durante a deglutição, protegendo a via aérea.", // ---- Coluna, dorso e parede do tronco ---- - "external abdominal oblique muscle": "Mesma função do 'external oblique': camada mais superficial da parede lateral do abdome, flexiona e roda o tronco para o lado oposto. Suas fibras superiores se entrelaçam (interdigitam) com as do serrátil anterior nas costelas — um encaixe que a malha 3D não modela; veja a ilustração na descrição.", - "internal abdominal oblique muscle": "Mesma função do 'internal oblique': camada intermediária, flexiona e roda o tronco para o mesmo lado.", - "transversus abdominis muscle": "Camada mais profunda da parede abdominal, com fibras horizontais; comprime o conteúdo abdominal (como uma 'cinta' natural), estabilizando o tronco.", + "external abdominal oblique muscle": "Mesma função do 'external oblique': camada mais superficial das 4 que formam a parede abdominal (veja a ilustração na descrição), flexiona e roda o tronco para o lado oposto. Suas fibras superiores também se entrelaçam com as do serrátil anterior nas costelas.", + "internal abdominal oblique muscle": "Mesma função do 'internal oblique': camada intermediária, flexiona e roda o tronco para o mesmo lado. Fica sob o oblíquo externo e sobre o transverso do abdome — veja a ilustração na descrição.", + "transversus abdominis muscle": "Camada mais profunda da parede abdominal, com fibras horizontais; comprime o conteúdo abdominal (como uma 'cinta' natural), estabilizando o tronco. É a camada mais interna das 4 que formam a parede abdominal — veja a ilustração na descrição.", "rectus abdominis muscle": "Mesma função do 'rectus abdominis': flexiona o tronco e comprime o abdome. Na pessoa de verdade é cruzado por 3-4 intersecções tendíneas horizontais (o 'tanquinho'), que a malha 3D não modela — veja a ilustração na descrição.", "pyramidalis muscle": "Pequeno músculo variável na frente do reto abdominal; tensiona a linha alba.", "quadratus lumborum muscle": "Na parede posterior do abdome; flexiona lateralmente o tronco e estabiliza a 12ª costela durante a respiração.", diff --git a/frontend/public/muscular/parede-abdominal-camadas.svg b/frontend/public/muscular/parede-abdominal-camadas.svg new file mode 100644 index 0000000..2a8ee05 --- /dev/null +++ b/frontend/public/muscular/parede-abdominal-camadas.svg @@ -0,0 +1,104 @@ + diff --git a/frontend/public/muscular/parede-abdominal-gray392.png b/frontend/public/muscular/parede-abdominal-gray392.png deleted file mode 100644 index 1b436f4..0000000 Binary files a/frontend/public/muscular/parede-abdominal-gray392.png and /dev/null differ diff --git a/frontend/public/muscular/serratil-obliquo-digitacoes.svg b/frontend/public/muscular/serratil-obliquo-digitacoes.svg new file mode 100644 index 0000000..ad17f1a --- /dev/null +++ b/frontend/public/muscular/serratil-obliquo-digitacoes.svg @@ -0,0 +1,59 @@ + diff --git a/frontend/src/components/StructureInfoPanel.tsx b/frontend/src/components/StructureInfoPanel.tsx index d2beb1c..6c54ab6 100644 --- a/frontend/src/components/StructureInfoPanel.tsx +++ b/frontend/src/components/StructureInfoPanel.tsx @@ -1,6 +1,6 @@ import { useAtlasStore } from "../store/useAtlasStore.js"; import type { Structure } from "../lib/api.js"; -import { MUSCLE_REFERENCE_IMAGE, hasMuscleReferenceImage } from "../data/muscleReferenceImages.js"; +import { muscleReferenceImageFor } from "../data/muscleReferenceImages.js"; export function StructureInfoPanel({ bySlug, @@ -60,17 +60,16 @@ export function StructureInfoPanel({
{structure.description}
)} - {hasMuscleReferenceImage(structure.slug) && ( -{MUSCLE_REFERENCE_IMAGE.caption}
-{MUSCLE_REFERENCE_IMAGE.credit}
-{ref.caption}
+{structure.regionPath.join(" › ")}
diff --git a/frontend/src/data/muscleReferenceImages.ts b/frontend/src/data/muscleReferenceImages.ts index 7a4f2b6..11c77c5 100644 --- a/frontend/src/data/muscleReferenceImages.ts +++ b/frontend/src/data/muscleReferenceImages.ts @@ -1,26 +1,41 @@ // Referência visual 2D pra músculos cuja malha 3D real (Z-Anatomy) não tem -// as subdivisões que a ilustração clássica de anatomia mostra — reto do -// abdome (intersecções tendíneas, o "tanquinho"), serrátil anterior e -// oblíquo externo do abdome (digitações que se entrelaçam nas costelas). -// Confirmamos (comparando com a exportação bruta do Z-Anatomy E com o app -// oficial completo, não só a amostra do GitHub) que essa é uma limitação -// real do dado de origem, não um bug do pipeline — ver extract-manifest.mjs. -// Em vez de tentar esculpir essas divisões em cima de uma malha que não as -// tem, mostramos a prancha clássica de Gray's Anatomy (Henry Vandyke -// Carter, 1918 — domínio público, sem restrição de uso) que já ilustra -// exatamente essas três estruturas e como se relacionam. -export const MUSCLE_REFERENCE_IMAGE = { - image: "/muscular/parede-abdominal-gray392.png", - credit: - "Henry Vandyke Carter, em Henry Gray, Anatomy of the Human Body (1918) — domínio público (via Wikimedia Commons).", +// as subdivisões que os livros de anatomia mostram: as 4 camadas da parede +// abdominal (reto, oblíquo externo, oblíquo interno, transverso — cada uma +// aparece como uma superfície única e lisa no modelo 3D, sem a +// sobreposição em camadas de verdade) e a interdigitação entre serrátil +// anterior e oblíquo externo nas costelas. Confirmamos (comparando com a +// exportação bruta do Z-Anatomy E com o app oficial completo, não só a +// amostra do GitHub) que essa é uma limitação real do dado de origem, não +// um bug do pipeline — ver extract-manifest.mjs. +// +// Em vez de usar uma imagem de terceiros (a primeira tentativa, a prancha +// de Gray's Anatomy, saiu com o texto em latim pequeno demais pra ler), +// essas são ilustrações esquemáticas PRÓPRIAS em SVG — texto vetorial de +// verdade (nunca sai ilegível ou embaralhado, porque não é imagem +// rasterizada), em português, sem depender de licença de terceiros. +const ABDOMINAL_LAYERS = { + image: "/muscular/parede-abdominal-camadas.svg", caption: - "No modelo 3D esses três músculos aparecem como superfícies únicas e lisas (o Z-Anatomy não modela essas subdivisões). Esta ilustração clássica mostra onde fica cada um e como se relacionam de verdade.", + "No modelo 3D cada um desses músculos aparece como uma superfície única e lisa (o Z-Anatomy não modela a sobreposição real). Este esquema mostra as 4 camadas da parede abdominal, da mais superficial (oblíquo externo) à mais profunda (transverso).", }; -// Substrings do slug (sem o prefixo de sistema nem o sufixo de lado) que -// identificam um músculo coberto por essa referência. -const MUSCLE_REFERENCE_KEYS = ["rectus-abdominis-muscle", "serratus-anterior-muscle", "external-abdominal-oblique-muscle"]; +const SERRATUS_OBLIQUE_DIGITATIONS = { + image: "/muscular/serratil-obliquo-digitacoes.svg", + caption: + "No modelo 3D o serrátil anterior e o oblíquo externo aparecem sem esse encaixe (o Z-Anatomy não modela a interdigitação). Este esquema mostra como as digitações dos dois se entrelaçam nas costelas.", +}; -export function hasMuscleReferenceImage(slug: string): boolean { - return MUSCLE_REFERENCE_KEYS.some((key) => slug.includes(key)); +// Substring do slug (sem o prefixo de sistema nem o sufixo de lado) → +// referência aplicável. +const MUSCLE_REFERENCE_MAP: Record