Scapula bone anatomy
scapula bone anatomy

| Category | Components |
|---|---|
| Angles | Lateral (glenoid), Superior, Inferior |
| Borders | Superior, Lateral (axillary), Medial (vertebral) |
| Surfaces | Posterior (dorsal), Costal (anterior/ventral) |
| Processes | Spine, Acromion, Coracoid process |
| Border | Features |
|---|---|
| Lateral (axillary) | Thick and strong; provides muscle attachment (teres major, teres minor) |
| Medial (vertebral) | Thin and sharp; runs parallel to the spine; attachment for serratus anterior |
| Superior | Thin and sharp; bears the suprascapular notch medial to the coracoid process root |
| Angle | Features |
|---|---|
| Lateral angle | Bears the glenoid cavity — shallow, comma-shaped; articulates with the humeral head at the glenohumeral joint |
| Superior angle | Located at junction of medial and superior borders |
| Inferior angle | Located at junction of medial and lateral borders; important palpation landmark; moves forward and laterally when the arm is raised |
| Structure | Location | Significance |
|---|---|---|
| Supraglenoid tubercle | Superior to glenoid cavity | Origin of long head of biceps brachii |
| Infraglenoid tubercle | Inferior to glenoid cavity | Origin of long head of triceps brachii |
| Suprascapular notch | Superior border, medial to coracoid root | Suprascapular nerve passes through it (under transverse scapular ligament); suprascapular artery passes over the ligament |
| Spinoglenoid notch | Between spine and lateral angle | Suprascapular nerve passes through here to enter the infraspinous fossa |
| Muscle | Attachment Site on Scapula |
|---|---|
| Supraspinatus | Supraspinous fossa |
| Infraspinatus | Infraspinous fossa |
| Subscapularis | Subscapular fossa |
| Teres minor | Lateral border (upper) |
| Teres major | Lateral border (lower) / inferior angle |
| Serratus anterior | Medial border and inferior angle (costal surface) |
| Rhomboids | Medial border |
| Trapezius | Spine and acromion |
| Levator scapulae | Superior angle and medial border |
| Pectoralis minor | Coracoid process |
| Biceps brachii (short head) | Coracoid process |
| Biceps brachii (long head) | Supraglenoid tubercle |
| Triceps brachii (long head) | Infraglenoid tubercle |
| Coracobrachialis | Coracoid process |
| Omohyoid | Superior border, medial to suprascapular notch |
Convert it in a pdf format and colorful and mind type
ls /home/daytona/workspace/
mkdir -p /home/daytona/workspace/scapula-pdf && ls /home/daytona/workspace/
~/scapula-pdf/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BaseDocTemplate, PageTemplate, Frame
from reportlab.lib.colors import HexColor
import urllib.request
from reportlab.platypus import Image as RLImage
import io
# ── Colour Palette ────────────────────────────────────────────────
TEAL = HexColor("#0097A7")
DEEP_TEAL = HexColor("#006064")
ORANGE = HexColor("#FF6F00")
AMBER = HexColor("#FFA000")
PURPLE = HexColor("#6A1B9A")
INDIGO = HexColor("#283593")
GREEN = HexColor("#2E7D32")
RED = HexColor("#C62828")
LIGHT_TEAL = HexColor("#E0F7FA")
LIGHT_AMBER= HexColor("#FFF8E1")
LIGHT_PURPLE=HexColor("#F3E5F5")
LIGHT_GREEN= HexColor("#E8F5E9")
LIGHT_RED = HexColor("#FFEBEE")
LIGHT_INDIGO=HexColor("#E8EAF6")
WHITE = colors.white
DARK_GREY = HexColor("#212121")
MID_GREY = HexColor("#546E7A")
# ── Document setup ────────────────────────────────────────────────
OUTPUT = "/home/daytona/workspace/scapula-pdf/Scapula_Anatomy.pdf"
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=1.8*cm, rightMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm
)
# ── Styles ────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
cover_title = S("CoverTitle",
fontName="Helvetica-Bold", fontSize=36,
textColor=WHITE, alignment=TA_CENTER,
spaceAfter=6, leading=42)
cover_sub = S("CoverSub",
fontName="Helvetica", fontSize=15,
textColor=HexColor("#B2EBF2"), alignment=TA_CENTER,
spaceAfter=4, leading=20)
cover_note = S("CoverNote",
fontName="Helvetica-Oblique", fontSize=10,
textColor=HexColor("#80DEEA"), alignment=TA_CENTER)
h1 = S("H1",
fontName="Helvetica-Bold", fontSize=18,
textColor=WHITE, alignment=TA_LEFT,
spaceBefore=14, spaceAfter=6, leading=22,
backColor=TEAL, leftIndent=-4, rightIndent=-4,
borderPad=6)
h2 = S("H2",
fontName="Helvetica-Bold", fontSize=13,
textColor=DEEP_TEAL, alignment=TA_LEFT,
spaceBefore=10, spaceAfter=4, leading=17,
borderPad=3)
body = S("Body",
fontName="Helvetica", fontSize=10.5,
textColor=DARK_GREY, alignment=TA_JUSTIFY,
spaceAfter=5, leading=15)
bullet = S("Bullet",
fontName="Helvetica", fontSize=10.5,
textColor=DARK_GREY, leftIndent=16, spaceAfter=3,
leading=14, bulletIndent=6)
note_style = S("Note",
fontName="Helvetica-Oblique", fontSize=9,
textColor=MID_GREY, alignment=TA_CENTER, spaceAfter=4)
caption = S("Caption",
fontName="Helvetica-Oblique", fontSize=8.5,
textColor=MID_GREY, alignment=TA_CENTER, spaceAfter=6)
table_header = S("TH",
fontName="Helvetica-Bold", fontSize=10,
textColor=WHITE, alignment=TA_CENTER)
table_cell = S("TC",
fontName="Helvetica", fontSize=9.5,
textColor=DARK_GREY, alignment=TA_LEFT, leading=13)
table_cell_c = S("TCC",
fontName="Helvetica", fontSize=9.5,
textColor=DARK_GREY, alignment=TA_CENTER, leading=13)
clinical_title = S("ClinTitle",
fontName="Helvetica-Bold", fontSize=11,
textColor=RED, spaceAfter=2, leading=14)
# ── Helper: coloured section header box ──────────────────────────
def section_header(text, bg=TEAL):
data = [[Paragraph(f"<font color='white'><b>{text}</b></font>",
S("SH", fontName="Helvetica-Bold", fontSize=13,
textColor=WHITE, leading=17, alignment=TA_LEFT))]]
t = Table(data, colWidths=[doc.width])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING",(0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("ROUNDEDCORNERS", [5]),
]))
return t
# ── Helper: two-col info card ─────────────────────────────────────
def info_card(label, value, bg=LIGHT_TEAL, fg=DEEP_TEAL):
data = [[
Paragraph(f"<b>{label}</b>",
S("LC", fontName="Helvetica-Bold", fontSize=10,
textColor=fg, leading=13, alignment=TA_LEFT)),
Paragraph(value,
S("VC", fontName="Helvetica", fontSize=10,
textColor=DARK_GREY, leading=13, alignment=TA_LEFT))
]]
t = Table(data, colWidths=[5*cm, doc.width - 5*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), bg),
("BACKGROUND", (1,0), (1,0), WHITE),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING", (0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("GRID", (0,0),(-1,-1), 0.4, HexColor("#B0BEC5")),
]))
return t
# ── Helper: styled table ──────────────────────────────────────────
def make_table(headers, rows, col_widths, header_bg=TEAL):
header_row = [Paragraph(f"<b>{h}</b>",
S("TH2", fontName="Helvetica-Bold", fontSize=10,
textColor=WHITE, alignment=TA_CENTER, leading=13))
for h in headers]
data = [header_row]
for i, row in enumerate(rows):
data.append([Paragraph(str(c),
S(f"TC{i}", fontName="Helvetica", fontSize=9.5,
textColor=DARK_GREY, alignment=TA_LEFT, leading=13))
for c in row])
t = Table(data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), header_bg),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("ROWBACKGROUNDS",(0,1), (-1,-1), [HexColor("#F5F5F5"), WHITE]),
("GRID", (0,0), (-1,-1), 0.4, HexColor("#B0BEC5")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]
t.setStyle(TableStyle(style))
return t
# ── Fetch scapula image ───────────────────────────────────────────
IMG_URL = ("https://cdn.orris.care/cdss_images/"
"9c6f7e6b8e97815a99e6d1f5590f84e3915f18b32de3e3745408422c93284ce0.png")
try:
with urllib.request.urlopen(IMG_URL, timeout=15) as r:
img_data = io.BytesIO(r.read())
scapula_img = RLImage(img_data, width=14*cm, height=10*cm)
scapula_img.hAlign = "CENTER"
has_image = True
except Exception as e:
print(f"Image download failed: {e}")
has_image = False
# ══════════════════════════════════════════════════════════════════
# STORY
# ══════════════════════════════════════════════════════════════════
story = []
W = doc.width
# ── COVER PAGE ────────────────────────────────────────────────────
# Gradient-like cover block using a table
cover_data = [[
Paragraph("🦴 SCAPULA", cover_title),
], [
Paragraph("Bone Anatomy — Complete Reference", cover_sub),
], [
Paragraph("Angles · Borders · Surfaces · Processes · Muscle Attachments · Clinical Correlates",
cover_note),
], [
Paragraph("Source: Gray's Anatomy for Students", cover_note),
]]
cover_tbl = Table(cover_data, colWidths=[W])
cover_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DEEP_TEAL),
("TOPPADDING", (0,0), (-1,-1), 14),
("BOTTOMPADDING", (0,0), (-1,-1), 14),
("LEFTPADDING", (0,0), (-1,-1), 20),
("RIGHTPADDING", (0,0), (-1,-1), 20),
("ROUNDEDCORNERS",[8]),
]))
story.append(cover_tbl)
story.append(Spacer(1, 0.5*cm))
# ── OVERVIEW ──────────────────────────────────────────────────────
story.append(section_header("📌 Overview", DEEP_TEAL))
story.append(Spacer(1, 3*mm))
story.append(Paragraph(
"The scapula is a large, flat, <b>triangular bone</b> lying on the posterolateral thorax "
"between ribs 2–7. It is entirely surrounded by muscles and has no direct bony articulation "
"with the thorax. It connects the upper limb to the axial skeleton via the clavicle.",
body))
# Quick-reference cards
story.append(Spacer(1, 3*mm))
overview_rows = [
("Bone Type", "Flat, triangular"),
("Location", "Posterolateral thorax — ribs 2 to 7"),
("Angles (3)", "Lateral (glenoid) · Superior · Inferior"),
("Borders (3)", "Superior · Lateral (axillary) · Medial (vertebral)"),
("Surfaces (2)", "Posterior (dorsal) · Costal (anterior/ventral)"),
("Processes (3)", "Spine · Acromion · Coracoid process"),
("Articulations", "Glenohumeral · Acromioclavicular · Scapulothoracic"),
]
for lbl, val in overview_rows:
story.append(info_card(lbl, val))
story.append(Spacer(1, 5*mm))
# ── IMAGE ─────────────────────────────────────────────────────────
if has_image:
story.append(section_header("🖼️ Anatomical Views", INDIGO))
story.append(Spacer(1, 4*mm))
story.append(scapula_img)
story.append(Paragraph(
"Fig. 7.21 Right Scapula — (A) Posterior view (B) Anterior/Costal view (C) Lateral view",
caption))
story.append(Spacer(1, 4*mm))
# ── SURFACES ─────────────────────────────────────────────────────
story.append(section_header("🔵 Surfaces", TEAL))
story.append(Spacer(1, 3*mm))
story.append(Paragraph("<b>Posterior Surface</b>", h2))
surf_data = [
("Supraspinous fossa", "Small, superior compartment above the spine — lodges <b>supraspinatus</b>"),
("Infraspinous fossa", "Larger, inferior compartment below the spine — lodges <b>infraspinatus</b>"),
("Spinoglenoid notch\n(greater scapular notch)", "Region between lateral angle and spine attachment; suprascapular nerve passes through here"),
]
story.append(make_table(["Structure", "Details"],
surf_data,
[5.5*cm, W-5.5*cm], TEAL))
story.append(Spacer(1, 4*mm))
story.append(Paragraph("<b>Costal (Anterior) Surface</b>", h2))
story.append(Paragraph(
"Features a large, shallow concave <b>subscapular fossa</b> over most of its extent, "
"lodging the <i>subscapularis</i> muscle. The costal surface and subscapularis glide "
"freely over the thoracic wall (scapulothoracic 'joint').",
body))
story.append(Spacer(1, 4*mm))
# ── BORDERS ──────────────────────────────────────────────────────
story.append(section_header("🟠 Borders", ORANGE))
story.append(Spacer(1, 3*mm))
border_rows = [
("Lateral (Axillary)", "Thick and strong", "Teres major, Teres minor"),
("Medial (Vertebral)", "Thin and sharp; parallel to spine", "Serratus anterior, Rhomboids"),
("Superior", "Thin and sharp; bears suprascapular notch", "Omohyoid (medial part)"),
]
story.append(make_table(
["Border", "Character", "Key Muscle Attachments"],
border_rows,
[4*cm, 5.5*cm, W-9.5*cm], ORANGE))
story.append(Spacer(1, 5*mm))
# ── ANGLES ────────────────────────────────────────────────────────
story.append(section_header("🟣 Angles", PURPLE))
story.append(Spacer(1, 3*mm))
angle_rows = [
("Lateral angle", "Bears the glenoid cavity — shallow, comma-shaped articular surface",
"Glenohumeral joint with humeral head"),
("Superior angle", "Junction of medial and superior borders",
"Levator scapulae"),
("Inferior angle", "Junction of medial and lateral borders; palpable landmark; moves anterolaterally on arm elevation",
"Teres major, lower serratus anterior"),
]
story.append(make_table(
["Angle", "Features", "Significance"],
angle_rows,
[3.5*cm, 7*cm, W-10.5*cm], PURPLE))
story.append(Spacer(1, 5*mm))
# ── PROCESSES ────────────────────────────────────────────────────
story.append(section_header("🟢 Processes", GREEN))
story.append(Spacer(1, 3*mm))
proc_rows = [
("Spine",
"Prominent horizontal ridge on posterior surface, subdividing it into supra- and infraspinous fossae; rises laterally into acromion",
"Trapezius (insertion)"),
("Acromion",
"Anterolateral projection of spine; arches over glenohumeral joint; distal oval facet → acromioclavicular joint; easily palpated at shoulder tip",
"Deltoid (origin); Trapezius (insertion)"),
("Coracoid process",
"Hook-like structure projecting anterolaterally from superior border; lies inferior to lateral clavicle; palpable through deltopectoral groove",
"Pectoralis minor; Short head biceps; Coracobrachialis; Coracoacromial / coracohumeral / coracoclavicular ligaments"),
]
story.append(make_table(
["Process", "Description", "Attachments"],
proc_rows,
[3.5*cm, 7*cm, W-10.5*cm], GREEN))
story.append(Spacer(1, 5*mm))
# ── TUBERCLES & NOTCHES ───────────────────────────────────────────
story.append(section_header("🔴 Tubercles & Notches", RED))
story.append(Spacer(1, 3*mm))
tn_rows = [
("Supraglenoid tubercle", "Superior to glenoid cavity", "Origin — long head of biceps brachii"),
("Infraglenoid tubercle", "Inferior to glenoid cavity", "Origin — long head of triceps brachii"),
("Suprascapular notch", "Superior border, medial to coracoid root",
"Suprascapular nerve passes through (under transverse scapular lig.); artery passes over"),
("Spinoglenoid notch", "Between spine and lateral angle", "Suprascapular nerve enters infraspinous fossa"),
]
story.append(make_table(
["Structure", "Location", "Clinical / Functional Significance"],
tn_rows,
[4.5*cm, 4.5*cm, W-9*cm], RED))
story.append(Spacer(1, 5*mm))
# ── MUSCLE ATTACHMENTS ────────────────────────────────────────────
story.append(section_header("💪 Muscle Attachments", INDIGO))
story.append(Spacer(1, 3*mm))
muscle_rows = [
("Supraspinatus", "Supraspinous fossa", "Rotator cuff — abduction"),
("Infraspinatus", "Infraspinous fossa", "Rotator cuff — external rotation"),
("Subscapularis", "Subscapular fossa (costal surface)", "Rotator cuff — internal rotation"),
("Teres minor", "Lateral border (upper)", "Rotator cuff — external rotation"),
("Teres major", "Lateral border (lower) / inf. angle", "Adduction & internal rotation"),
("Serratus anterior", "Medial border + inferior angle", "Protraction; holds scapula against chest wall"),
("Rhomboids major & minor", "Medial border", "Retraction; elevation of medial border"),
("Trapezius", "Spine and acromion", "Elevation, retraction, depression of scapula"),
("Levator scapulae", "Superior angle + medial border", "Elevation of scapula"),
("Pectoralis minor", "Coracoid process (tip)", "Protraction; depression of scapula"),
("Biceps brachii (short)", "Coracoid process (tip)", "Forearm flexion / supination"),
("Biceps brachii (long)", "Supraglenoid tubercle", "Forearm flexion / supination"),
("Triceps brachii (long)", "Infraglenoid tubercle", "Elbow extension"),
("Coracobrachialis", "Coracoid process (tip)", "Arm flexion / adduction"),
("Omohyoid (inf. belly)", "Superior border (medial notch)", "Depression of hyoid bone"),
]
story.append(make_table(
["Muscle", "Attachment Site", "Action"],
muscle_rows,
[5*cm, 6*cm, W-11*cm], INDIGO))
story.append(Spacer(1, 5*mm))
# ── ARTICULATIONS ─────────────────────────────────────────────────
story.append(section_header("🔗 Articulations", AMBER))
story.append(Spacer(1, 3*mm))
art_rows = [
("Glenohumeral joint", "Glenoid cavity × head of humerus", "Ball-and-socket (multiaxial); most mobile joint in body"),
("Acromioclavicular joint", "Acromion × lateral clavicle", "Plane synovial joint; stabilised by AC & CC ligaments"),
("Scapulothoracic 'joint'", "Costal surface × thoracic wall", "Physiological gliding interface (not true synovial); serratus anterior essential"),
]
story.append(make_table(
["Joint", "Articulating Surfaces", "Type / Notes"],
art_rows,
[5*cm, 5.5*cm, W-10.5*cm], AMBER))
story.append(Spacer(1, 5*mm))
# ── CLINICAL CORRELATES ───────────────────────────────────────────
story.append(section_header("🏥 Clinical Correlates", RED))
story.append(Spacer(1, 3*mm))
clinicals = [
("⚡ Winged Scapula",
LIGHT_RED, RED,
"Paralysis of <b>serratus anterior</b> due to damage of the <b>long thoracic nerve (C5–C7)</b> "
"causes the medial border and inferior angle to protrude posteriorly. The 'wing' is accentuated "
"on forward arm elevation. Arm abduction is limited beyond 90°.<br/>"
"<i>Vulnerable during:</i> axillary dissection (mastectomy), rucksack/backpack compression, "
"penetrating trauma."),
("⚡ Suprascapular Nerve Entrapment",
LIGHT_AMBER, ORANGE,
"Compression at the <b>suprascapular notch</b> (affects supraspinatus AND infraspinatus — "
"weak abduction + external rotation) or at the <b>spinoglenoid notch</b> (affects infraspinatus "
"only — weak external rotation). Presents as deep, poorly localised posterior shoulder pain."),
("⚡ Scapular Fractures",
LIGHT_INDIGO, INDIGO,
"Rare (<1% of all fractures) due to heavy muscular protection. Requires significant force "
"(high-velocity trauma). The <b>body and neck</b> are most commonly fractured. Always evaluate "
"for associated neurovascular injuries and pneumothorax."),
("⚡ Suprascapular Notch Variation",
LIGHT_GREEN, GREEN,
"The notch may be partially or completely ossified (forming a foramen), increasing risk of "
"suprascapular nerve entrapment. Important consideration before surgical decompression."),
]
for title_text, bg_col, fg_col, content in clinicals:
card_data = [[
Paragraph(title_text,
S("CT", fontName="Helvetica-Bold", fontSize=11,
textColor=fg_col, leading=15)),
],[
Paragraph(content,
S("CB", fontName="Helvetica", fontSize=10,
textColor=DARK_GREY, leading=14, alignment=TA_JUSTIFY)),
]]
card = Table(card_data, colWidths=[W])
card.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), bg_col),
("BACKGROUND", (0,1), (-1,1), WHITE),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("BOX", (0,0), (-1,-1), 0.8, fg_col),
("LINEBELOW", (0,0), (-1,0), 0.5, fg_col),
]))
story.append(KeepTogether([card, Spacer(1, 4*mm)]))
# ── FOOTER NOTE ───────────────────────────────────────────────────
story.append(HRFlowable(width="100%", thickness=1, color=TEAL))
story.append(Spacer(1, 2*mm))
story.append(Paragraph(
"<i>Source: Gray's Anatomy for Students, p. 821–822 · Generated by Orris Medical AI</i>",
note_style))
# ── BUILD ─────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to {OUTPUT}")
cd /home/daytona/workspace/scapula-pdf && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/scapula-pdf/Scapula_Anatomy.pdf
Scapula Anatomy
PDF Document · PDF
| Section | Color Theme |
|---|---|
| 🎨 Cover banner | Deep teal gradient |
| 📌 Overview cards | Teal info cards |
| 🖼️ Anatomical diagram | Posterior / Anterior / Lateral views |
| 🔵 Surfaces | Teal table |
| 🟠 Borders | Orange table |
| 🟣 Angles | Purple table |
| 🟢 Processes | Green table |
| 🔴 Tubercles & Notches | Red table |
| 💪 Muscle Attachments | Indigo table |
| 🔗 Articulations | Amber table |
| 🏥 Clinical Correlates | Color-coded cards (winged scapula, nerve entrapment, fractures) |
Create mind map
python3 -c "import matplotlib; import matplotlib.pyplot; print('matplotlib ok')" 2>&1