Surface markings 1. arch of aorta 2. C7 vertebra 3. radial nerve 4. Frontal eminence 5. Anatomical snuff box 6. Brachial artery 7. Radial artery 8. Flexor retinaculum 9. Extensor retinaculum 10. Glabella 11. Median nerve 12. Frankfurt plane 13. Apex beat 14. Angle of mandible 15. Sternal angle 16. Deep palmer arch 17. Superficial palmer arch 18. Zygomatic arch 19. Ulnar artery for Anatomy practical ( MBBS )
| Structure | Key Landmark / Level |
|---|---|
| Arch of Aorta | Sternal angle to T4 vertebra |
| C7 Vertebra | Most prominent spinous process |
| Radial Nerve | Lateral epicondyle / spiral groove |
| Frontal Eminence | 3 cm above midpoint of supraorbital margin |
| Anatomical Snuff Box | Between EPL and EPB/APL tendons |
| Brachial Artery | Medial bicipital groove → cubital fossa |
| Radial Artery | Cubital fossa → lateral wrist (pulse site) |
| Flexor Retinaculum | Distal wrist crease, 2.5 cm wide, anterior wrist |
| Extensor Retinaculum | Oblique band, posterior wrist |
| Glabella | Between superciliary arches, above nasion |
| Median Nerve | Medial to brachial art → midpoint of wrist (PLT) |
| Frankfurt Plane | Infraorbital margin to upper EAM |
| Apex Beat | 5th left ICS, medial to midclavicular line |
| Angle of Mandible | Gonion - posteroinferior corner of jaw |
| Sternal Angle | Manubriosternal junction, level of T4/T5 |
| Deep Palmar Arch | Bases of metacarpals (radial dominant) |
| Superficial Palmar Arch | Level of extended thumb tip (ulnar dominant) |
| Zygomatic Arch | Lateral cheek - zygomatic bone to temporal bone |
| Ulnar Artery | 2.5 cm below med. epicondyle → lateral pisiform |
Create a labeled PDF poster of all surface markings for quick reference
mkdir -p /home/daytona/workspace/surface-markings && ls /home/daytona/workspace/
~/surface-markings/generate_poster.py
from reportlab.lib.pagesizes import A3
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.pdfgen import canvas
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph, Table, TableStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER
import os
OUTPUT = "/home/daytona/workspace/surface-markings/Surface_Markings_MBBS.pdf"
# ── colour palette ──────────────────────────────────────────────────────────
NAVY = colors.HexColor("#0D1B2A")
DARK_TEAL = colors.HexColor("#1B4F72")
TEAL = colors.HexColor("#1A6B8A")
LIGHT_TEAL = colors.HexColor("#D4EEF5")
GOLD = colors.HexColor("#F0A500")
CREAM = colors.HexColor("#FDFAF3")
WHITE = colors.white
GRAY_LINE = colors.HexColor("#AAAAAA")
CARD_HEAD = colors.HexColor("#145374")
CARD_ALT = colors.HexColor("#E8F5FA")
RED_ACCENT = colors.HexColor("#C0392B")
GREEN_ACC = colors.HexColor("#1E8449")
PURPLE = colors.HexColor("#6C3483")
# Page: A3 portrait
PAGE_W, PAGE_H = A3
MARGIN = 1.4 * cm
# ── data ─────────────────────────────────────────────────────────────────────
markings = [
{
"no": "1",
"name": "Arch of Aorta",
"category": "Thorax",
"landmark": "Sternal angle (R) → T4/T5 disc (L)",
"marking": "Inverted U: R 2nd costal cartilage → suprasternal notch → L 2nd CC",
"relations": "Tracheal bifurcation, SVC, ascending aorta",
"clinical": "Aneurysm may cause tracheal tug, Horner's, hoarseness",
},
{
"no": "2",
"name": "C7 Vertebra (Vertebra Prominens)",
"category": "Spine",
"landmark": "Most prominent spinous process at nape of flexed neck",
"marking": "Palpate base of neck with neck flexed — largest, non-bifid spinous process",
"relations": "T1 below (slightly less prominent), first rib level",
"clinical": "Reference to count thoracic vertebrae; cervical rib arises here",
},
{
"no": "3",
"name": "Radial Nerve",
"category": "Upper Limb – Arm",
"landmark": "Spiral groove of humerus → lateral epicondyle",
"marking": "Line from junction upper⅓/middle⅓ of posterior arm → lateral epicondyle",
"relations": "Winds around humeral shaft; divides at lateral epicondyle → superficial & PIN",
"clinical": "Mid-shaft humeral # → wrist drop; Saturday-night palsy",
},
{
"no": "4",
"name": "Frontal Eminence",
"category": "Head",
"landmark": "Frontal bone, ~3 cm above mid-supraorbital margin",
"marking": "Smooth convex bulge on each side of forehead, above orbital rim",
"relations": "Separated by metopic/frontal suture region; more prominent in children",
"clinical": "Craniometric reference; 'bossing' in rickets / thalassaemia",
},
{
"no": "5",
"name": "Anatomical Snuff Box",
"category": "Upper Limb – Wrist",
"landmark": "Dorsolateral wrist between EPL (medial) and EPB + APL (lateral)",
"marking": "Triangular depression on dorsolateral wrist when thumb is extended",
"relations": "Floor: styloid of radius → scaphoid → trapezium; Roof: cephalic vein + superficial radial nerve; Deep: radial artery",
"clinical": "Tenderness = scaphoid #; radial artery palpable in floor",
},
{
"no": "6",
"name": "Brachial Artery",
"category": "Upper Limb – Arm",
"landmark": "Apex of axilla → midpoint of cubital fossa",
"marking": "Line along medial bicipital groove, medial to biceps; bifurcates 2.5 cm below medial epicondyle",
"relations": "Accompanied by median nerve; medial to biceps tendon in cubital fossa",
"clinical": "BP measurement site; injury in supracondylar # → Volkmann's ischaemia",
},
{
"no": "7",
"name": "Radial Artery",
"category": "Upper Limb – Forearm/Wrist",
"landmark": "Midpoint of cubital fossa → medial aspect of radial styloid",
"marking": "Line from lateral cubital fossa to lateral wrist (between FCR and brachioradialis)",
"relations": "Passes through snuff box → deep palmar arch; pulse felt at distal radius",
"clinical": "Radial pulse (lateral to FCR tendon); Allen's test; arterial line site",
},
{
"no": "8",
"name": "Flexor Retinaculum",
"category": "Upper Limb – Wrist",
"landmark": "Anterior wrist: distal wrist crease to 2.5 cm distal",
"marking": "2.5-cm transverse band; pisiform & hamate (medial), scaphoid & trapezium (lateral)",
"relations": "Carpal tunnel contents: FDS×4, FDP×4, FPL, median nerve (superficial-radial)",
"clinical": "Carpal tunnel syndrome (median nerve compression); Phalen's / Tinel's tests",
},
{
"no": "9",
"name": "Extensor Retinaculum",
"category": "Upper Limb – Wrist",
"landmark": "Posterior wrist: oblique band, lateral radius → pisiform/triquetrum",
"marking": "~2-cm oblique band across dorsum of wrist; 6 synovial compartments (APL→ECU)",
"relations": "6 compartments radial to ulnar: APL+EPB / ECRL+ECRB / EPL / EDC+EI / EDM / ECU",
"clinical": "De Quervain's tenosynovitis (1st compartment); intersection syndrome",
},
{
"no": "10",
"name": "Glabella",
"category": "Head",
"landmark": "Smooth area on frontal bone between the two superciliary arches",
"marking": "Flat bony point above the root of the nose, between the eyebrows",
"relations": "Above nasion; below frontal eminences; above nasal bones",
"clinical": "Glabellar tap (Myerson's sign) — persistent blink = Parkinsonism",
},
{
"no": "11",
"name": "Median Nerve",
"category": "Upper Limb – Forearm/Wrist",
"landmark": "Medial side of brachial artery in arm → between PLT and FCR at wrist",
"marking": "Line from medial cubital fossa → midpoint of wrist crease (medial to PLT)",
"relations": "Crosses brachial artery at mid-arm; between FDS & FDP in forearm; through carpal tunnel",
"clinical": "Carpal tunnel: ape hand, LOAF weakness; pronator teres syndrome",
},
{
"no": "12",
"name": "Frankfurt Plane",
"category": "Head",
"landmark": "Lower orbital margin (infraorbital) → upper margin of external acoustic meatus",
"marking": "Horizontal plane passing through infraorbital rim and upper EAM on both sides",
"relations": "= orbitomeatal plane; represents natural horizontal head posture",
"clinical": "Standard skull X-ray positioning; craniometric / forensic reference",
},
{
"no": "13",
"name": "Apex Beat",
"category": "Thorax",
"landmark": "5th left intercostal space, medial to midclavicular line (~9 cm from midsternal line)",
"marking": "Outermost & lowermost definite cardiac pulsation; count ribs from sternal angle",
"relations": "4th ICS in children; overlies left ventricle",
"clinical": "Displaced L+down = LV enlargement; not felt = obesity, effusion, emphysema",
},
{
"no": "14",
"name": "Angle of Mandible",
"category": "Head",
"landmark": "Gonion — posteroinferior corner where ramus meets body of mandible",
"marking": "Palpable bony angle just below and anterior to the ear lobule",
"relations": "Masseter insertion; parotid gland overlies; facial artery winds around lower border of mandible",
"clinical": "Parotid swelling; masseter hypertrophy; airway assessment (Mallampati)",
},
{
"no": "15",
"name": "Sternal Angle (Angle of Louis)",
"category": "Thorax",
"landmark": "Manubriosternal junction — felt as transverse bony ridge on anterior chest",
"marking": "Palpate midline sternum — a step/ridge between manubrium and body",
"relations": "Level T4/T5; 2nd rib articulation; tracheal bifurcation; arch of aorta; azygos → SVC",
"clinical": "Start counting ribs; JVP reference (5 cm above right atrium)",
},
{
"no": "16",
"name": "Deep Palmar Arch",
"category": "Upper Limb – Hand",
"landmark": "Bases of metacarpals (MC1–MC5), ~1 cm proximal to superficial arch",
"marking": "Curved line at level of proximal ends of metacarpal bones, deep to flexor tendons",
"relations": "Formed mainly by radial artery + deep branch of ulnar artery",
"clinical": "Injured in lacerations through thenar muscles; anastomotic safety net for hand",
},
{
"no": "17",
"name": "Superficial Palmar Arch",
"category": "Upper Limb – Hand",
"landmark": "Level of distal border of fully abducted thumb = proximal transverse palmar crease",
"marking": "Convex curved line across palm at level of Kaplan's cardinal line",
"relations": "Formed mainly by ulnar artery + superficial branch of radial artery; beneath palmar aponeurosis",
"clinical": "Laceration of palm may divide arch; Allen's test assesses patency",
},
{
"no": "18",
"name": "Zygomatic Arch",
"category": "Head",
"landmark": "From zygomatic bone (below lateral canthus) to temporal bone (in front of tragus)",
"marking": "Palpate horizontal bony bar on lateral face between eye and ear",
"relations": "Roof of infratemporal fossa; masseter arises from lower border; temporalis passes deep to it",
"clinical": "Tripod (malar) fracture; temporal fossa surgery landmark; arch blocks masseter nerve",
},
{
"no": "19",
"name": "Ulnar Artery",
"category": "Upper Limb – Forearm/Wrist",
"landmark": "2.5 cm below medial epicondyle → lateral side of pisiform bone at wrist",
"marking": "Line from 2.5 cm below medial epicondyle to lateral pisiform; superficial in distal forearm (between FCU and FDS)",
"relations": "Enters palm superficial to flexor retinaculum (Guyon's canal); forms superficial palmar arch",
"clinical": "Guyon's canal syndrome (ulnar nerve + artery); Allen's test; hypothenar hammer syndrome",
},
]
# ── category colour map ──────────────────────────────────────────────────────
CAT_COLOR = {
"Head": colors.HexColor("#6C3483"),
"Thorax": colors.HexColor("#145374"),
"Spine": colors.HexColor("#1E8449"),
"Upper Limb – Arm": colors.HexColor("#C0392B"),
"Upper Limb – Forearm/Wrist": colors.HexColor("#A04000"),
"Upper Limb – Wrist": colors.HexColor("#BA4A00"),
"Upper Limb – Hand": colors.HexColor("#784212"),
}
def draw_header(c, page_w, page_h):
"""Full-width gradient-style header."""
# Background bar
c.setFillColor(NAVY)
c.rect(0, page_h - 3.8*cm, page_w, 3.8*cm, fill=1, stroke=0)
# Gold accent stripe
c.setFillColor(GOLD)
c.rect(0, page_h - 3.8*cm, page_w, 0.22*cm, fill=1, stroke=0)
# Title
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 28)
c.drawCentredString(page_w/2, page_h - 1.6*cm, "SURFACE MARKINGS — ANATOMY PRACTICAL")
# Subtitle
c.setFont("Helvetica", 14)
c.setFillColor(GOLD)
c.drawCentredString(page_w/2, page_h - 2.4*cm, "MBBS Reference Poster | 19 Key Structures")
# Divider line
c.setStrokeColor(GOLD)
c.setLineWidth(1.2)
c.line(MARGIN, page_h - 3.2*cm, page_w - MARGIN, page_h - 3.2*cm)
# Tagline
c.setFont("Helvetica-Oblique", 10)
c.setFillColor(LIGHT_TEAL)
c.drawCentredString(page_w/2, page_h - 3.5*cm,
"Landmark | How to Mark | Key Relations | Clinical Relevance")
def draw_legend(c, page_w, y):
"""Category colour legend."""
c.setFont("Helvetica-Bold", 9)
c.setFillColor(NAVY)
c.drawString(MARGIN, y, "CATEGORY KEY:")
x = MARGIN + 2.8*cm
for cat, col in CAT_COLOR.items():
c.setFillColor(col)
c.roundRect(x, y - 0.15*cm, 0.4*cm, 0.45*cm, 2, fill=1, stroke=0)
c.setFillColor(NAVY)
c.setFont("Helvetica", 7.5)
c.drawString(x + 0.5*cm, y, cat)
x += len(cat)*0.12*cm + 1.6*cm
def draw_card(c, x, y, w, h, item):
"""Draw a single marking card."""
cat = item["category"]
cat_col = CAT_COLOR.get(cat, DARK_TEAL)
# Card background
c.setFillColor(CREAM)
c.roundRect(x, y, w, h, 4, fill=1, stroke=0)
# Left colour accent bar
c.setFillColor(cat_col)
c.roundRect(x, y, 0.22*cm, h, 4, fill=1, stroke=0)
c.rect(x + 0.11*cm, y, 0.11*cm, h, fill=1, stroke=0) # square right half
# Number badge
badge_r = 0.35*cm
c.setFillColor(cat_col)
c.circle(x + 0.6*cm, y + h - 0.55*cm, badge_r, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 9)
c.drawCentredString(x + 0.6*cm, y + h - 0.58*cm, item["no"])
# Structure name
c.setFillColor(cat_col)
c.setFont("Helvetica-Bold", 10.5)
name = item["name"]
# Truncate if too long
max_name_w = w - 1.6*cm
while c.stringWidth(name, "Helvetica-Bold", 10.5) > max_name_w and len(name) > 5:
name = name[:-1]
c.drawString(x + 1.0*cm, y + h - 0.58*cm, name)
# Category pill
pill_text = cat
pill_w = c.stringWidth(pill_text, "Helvetica", 6.5) + 0.3*cm
pill_x = x + w - pill_w - 0.2*cm
pill_y = y + h - 0.72*cm
c.setFillColor(cat_col)
c.roundRect(pill_x, pill_y, pill_w, 0.38*cm, 3, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica", 6.5)
c.drawCentredString(pill_x + pill_w/2, pill_y + 0.1*cm, pill_text)
# Divider under header
c.setStrokeColor(cat_col)
c.setLineWidth(0.5)
c.line(x + 0.35*cm, y + h - 0.82*cm, x + w - 0.2*cm, y + h - 0.82*cm)
# Content rows
LABEL_COL = DARK_TEAL
rows = [
("Landmark", item["landmark"]),
("Marking", item["marking"]),
("Relations",item["relations"]),
("Clinical", item["clinical"]),
]
row_icons = ["📍", "✏", "🔗", "⚕"]
label_icons = ["L", "M", "R", "C"]
label_colors = [DARK_TEAL, TEAL, colors.HexColor("#117A65"), RED_ACCENT]
row_h = (h - 1.0*cm) / len(rows)
for i, (label, text) in enumerate(rows):
ry = y + h - 0.95*cm - (i+1)*row_h
# Label
lc = label_colors[i]
c.setFillColor(lc)
c.setFont("Helvetica-Bold", 7)
c.drawString(x + 0.38*cm, ry + row_h*0.55, label.upper() + ":")
# Text — word-wrap manually
c.setFillColor(NAVY)
c.setFont("Helvetica", 7.5)
max_text_w = w - 2.5*cm
words = text.split()
lines = []
cur = ""
for word in words:
test = (cur + " " + word).strip()
if c.stringWidth(test, "Helvetica", 7.5) <= max_text_w:
cur = test
else:
if cur:
lines.append(cur)
cur = word
if cur:
lines.append(cur)
# Draw up to 2 lines
for li, line in enumerate(lines[:2]):
ly = ry + row_h*0.55 - (li+1)*0.27*cm
if ly > y + 0.1*cm:
c.drawString(x + 1.55*cm, ly, line)
if li == 1 and len(lines) > 2:
# Add ellipsis
c.drawString(x + 1.55*cm + c.stringWidth(line, "Helvetica", 7.5), ly, "…")
# Row separator (except last)
if i < len(rows)-1:
c.setStrokeColor(GRAY_LINE)
c.setLineWidth(0.3)
sep_y = ry + 0.02*cm
c.line(x + 0.35*cm, sep_y, x + w - 0.2*cm, sep_y)
def draw_footer(c, page_w, page_num, total_pages):
c.setFillColor(NAVY)
c.rect(0, 0, page_w, 0.9*cm, fill=1, stroke=0)
c.setFillColor(GOLD)
c.rect(0, 0.9*cm, page_w, 0.06*cm, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica", 8)
c.drawString(MARGIN, 0.3*cm, "MBBS Anatomy Practical | Surface Markings Quick Reference")
c.drawRightString(page_w - MARGIN, 0.3*cm, f"Page {page_num} of {total_pages}")
c.setFillColor(LIGHT_TEAL)
c.drawCentredString(page_w/2, 0.3*cm, "For educational use only")
def make_poster():
c = canvas.Canvas(OUTPUT, pagesize=A3)
c.setTitle("Surface Markings – MBBS Anatomy Practical")
c.setAuthor("Orris Medical Reference")
c.setSubject("Anatomy Surface Markings Quick Reference Poster")
page_w, page_h = A3
HEADER_H = 3.8*cm
FOOTER_H = 1.0*cm
LEGEND_H = 0.7*cm
# ── Layout: 3 columns, dynamic rows per page ─────────────────────────────
COLS = 3
COL_GAP = 0.35*cm
usable_w = page_w - 2*MARGIN
card_w = (usable_w - (COLS-1)*COL_GAP) / COLS
# Start Y
content_top = page_h - HEADER_H - LEGEND_H - 0.3*cm
content_bot = FOOTER_H + 0.2*cm
usable_h = content_top - content_bot
# Cards per page: try to fit as many rows as possible
# Each card height
CARD_H = 3.55*cm
ROW_GAP = 0.3*cm
rows_per_page = int(usable_h / (CARD_H + ROW_GAP))
total_cards = len(markings)
cards_per_page = COLS * rows_per_page
import math
total_pages = math.ceil(total_cards / cards_per_page)
# We'll do 2 pages: page1 has first batch, page2 has rest + summary table
# Actually let's just flow naturally
page_num = 1
draw_header(c, page_w, page_h)
draw_legend(c, page_w, page_h - HEADER_H - 0.55*cm)
col = 0
row = 0
for idx, item in enumerate(markings):
cx = MARGIN + col * (card_w + COL_GAP)
cy = content_top - (row+1)*(CARD_H + ROW_GAP) + ROW_GAP
draw_card(c, cx, cy, card_w, CARD_H, item)
col += 1
if col >= COLS:
col = 0
row += 1
if row >= rows_per_page and idx < total_cards - 1:
draw_footer(c, page_w, page_num, total_pages)
c.showPage()
page_num += 1
draw_header(c, page_w, page_h)
draw_legend(c, page_w, page_h - HEADER_H - 0.55*cm)
row = 0
# ── Summary Table on last area ────────────────────────────────────────────
# After all cards, add a summary table on a new page
draw_footer(c, page_w, page_num, total_pages + 1)
c.showPage()
page_num += 1
# Summary page
c.setFillColor(NAVY)
c.rect(0, page_h - 2.5*cm, page_w, 2.5*cm, fill=1, stroke=0)
c.setFillColor(GOLD)
c.rect(0, page_h - 2.5*cm, page_w, 0.15*cm, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 22)
c.drawCentredString(page_w/2, page_h - 1.3*cm, "QUICK REFERENCE SUMMARY TABLE")
c.setFont("Helvetica", 11)
c.setFillColor(GOLD)
c.drawCentredString(page_w/2, page_h - 2.0*cm, "All 19 Surface Markings at a Glance")
# Table
table_top = page_h - 2.8*cm
col_widths = [0.7*cm, 4.2*cm, 3.0*cm, 5.5*cm, 5.5*cm, 5.5*cm]
headers = ["#", "Structure", "Category", "Landmark / Level", "How to Mark", "Clinical Pearl"]
data = [headers]
for m in markings:
# Truncate long fields for table
def trunc(s, n=55):
return s if len(s) <= n else s[:n-1] + "…"
data.append([
m["no"],
m["name"],
m["category"],
trunc(m["landmark"], 60),
trunc(m["marking"], 65),
trunc(m["clinical"], 65),
])
from reportlab.platypus import Table as RLTable, TableStyle as RLTableStyle, SimpleDocTemplate, Paragraph
from reportlab.lib.styles import ParagraphStyle
ps_header = ParagraphStyle("th", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE, alignment=TA_CENTER)
ps_cell = ParagraphStyle("td", fontName="Helvetica", fontSize=7, textColor=NAVY, alignment=TA_LEFT, leading=9)
ps_num = ParagraphStyle("num", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE, alignment=TA_CENTER)
# Build paragraph data
pdata = []
for ri, row_data in enumerate(data):
prow = []
for ci, cell in enumerate(row_data):
if ri == 0:
prow.append(Paragraph(str(cell), ps_header))
elif ci == 0:
prow.append(Paragraph(str(cell), ps_num))
else:
prow.append(Paragraph(str(cell), ps_cell))
pdata.append(prow)
tbl = RLTable(pdata, colWidths=col_widths, repeatRows=1)
# Alternating row colours
row_styles = [
("BACKGROUND", (0,0), (-1,0), NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 8),
("ALIGN", (0,0), (-1,0), "CENTER"),
("GRID", (0,0), (-1,-1), 0.4, GRAY_LINE),
("ROWBACKGROUNDS", (0,1), (-1,-1), [CREAM, CARD_ALT]),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("LEFTPADDING", (0,0), (-1,-1), 3),
("RIGHTPADDING", (0,0), (-1,-1), 3),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
# Colour column 0
("BACKGROUND", (0,1), (0,-1), DARK_TEAL),
("TEXTCOLOR", (0,1), (0,-1), WHITE),
]
# Category-colour left border for each row
for ri in range(1, len(data)):
cat = markings[ri-1]["category"]
col_c = CAT_COLOR.get(cat, DARK_TEAL)
row_styles.append(("BACKGROUND", (0, ri), (0, ri), col_c))
tbl.setStyle(RLTableStyle(row_styles))
table_h = table_top - FOOTER_H - 0.5*cm
tbl.wrapOn(c, page_w - 2*MARGIN, table_h)
tbl.drawOn(c, MARGIN, table_top - tbl._height)
draw_footer(c, page_w, page_num, page_num)
c.save()
print(f"Saved: {OUTPUT}")
import os
size = os.path.getsize(OUTPUT)
print(f"File size: {size/1024:.1f} KB")
if __name__ == "__main__":
make_poster()
cd /home/daytona/workspace/surface-markings && python generate_poster.py 2>&1
cd /home/daytona/workspace/surface-markings && python -c " from pypdf import PdfReader r = PdfReader('Surface_Markings_MBBS.pdf') print(f'Pages: {len(r.pages)}') for i, p in enumerate(r.pages): txt = p.extract_text() print(f'--- Page {i+1} ({len(txt)} chars) ---') print(txt[:400]) print() "
cd /home/daytona/workspace/surface-markings && python -c " from pypdf import PdfReader r = PdfReader('Surface_Markings_MBBS.pdf') txt = '' for p in r.pages: txt += p.extract_text() # Count card numbers import re nums = re.findall(r'\n(\d+)\n', txt) print('Card numbers found:', nums) # Also check all 19 structure names names = ['Arch of Aorta','C7 Vertebra','Radial Nerve','Frontal Eminence','Snuff Box', 'Brachial Artery','Radial Artery','Flexor Retinaculum','Extensor Retinaculum', 'Glabella','Median Nerve','Frankfurt','Apex Beat','Angle of Mandible', 'Sternal Angle','Deep Palmar','Superficial Palmar','Zygomatic','Ulnar Artery'] for n in names: print(f' {n}: {\"OK\" if n in txt else \"MISSING\"}')" 2>&1
Surface Markings MBBS
PDF Document · PDF
*Surface Marking Anatomy* (*Exact vertebral level in case of organs* ) 1. Anatomical snuff box 2. Suprameatal triangle 3. Portal vein 4. Arch of aorta 5. C7 vertebra 6. Paranasal sinuses 7. Brachial artery 8. Morris parallelogram 9. Sternocleidomastoid 10. Internal juglar vein 11. Kidney 12. Facial nerve 13. Sternal angle 14. Median nerve 15. Anterior fontanelle 16. Flexor retinaculum hand 17. IVC 18. SVC 19. Glabella 20. Superior extensor retinaculum 21. Spleen 22. Parotid 23. Liver 24. Axillary artery 25. Pancreas 26. Iliac crest 27. Patella 28. Superficial palmar arch 29. Deep palmar arch 30. Brachial artery 31. Glabella 32. Quadrants of abdomen 33. Radius 34. Ulnar nerve 35. Pleural reflection 36. Root of mesentry 37. Caecum 38. Greater trochanter 39. Mcburney's point 40. Facial artery 41. Saphenous opening 42. Stomach 43. Angle of mandible 44. Frankfurt plane 45. Duodenum 46. Zygomatic arch 47. Medial malleolus 48. Frontal eminence 49. Tibial tuberosity 50. Jugular notch 51. Pleura 52. Apex of heart 53. Borders of heart 54. Intestine 55. Femoral triangle 56. Mid-ingunal point 57. Flexor retinaculum foot 58. Super ciliary arch 59. Appendicular orifice 60. Cubital fossa 61. Carotid pulse 62. Transpyloric plane 63. Trachea 64. Thyroid 65. Cavernous Sinus 66. External jugular vein 67. Internal jugular vein 68. Submandibular gland 69. Transtubercular plane 70. Jugular venous arch explain all
| Sinus | Surface Projection |
|---|---|
| Frontal sinus | Above medial end of eyebrow, extends 2.5 cm upward and 2.5 cm laterally above medial orbital margin |
| Maxillary sinus | Cheek region - bounded: superiorly by infraorbital margin, inferiorly by upper alveolar process, medially by lateral wall of nose, laterally by zygomatic bone |
| Ethmoid sinus | Between the two medial orbital margins (medial orbital walls), lateral to nasal bone |
| Sphenoid sinus | Deep structure - projects back from nasion approximately 7.5 cm; between pituitary fossa and nasal cavity |
| Line | Level |
|---|---|
| Midclavicular line (MCL) | 8th rib |
| Midaxillary line (MAL) | 10th rib |
| Scapular (paravertebral) line | 12th rib |
| Mnemonic: "8, 10, 12" |
| Border | Formed by | Surface Marking |
|---|---|---|
| Right border | Right atrium | From right 3rd costal cartilage → right 6th costal cartilage, 1-1.5 cm to the right of the sternal border |
| Left border | Mainly left ventricle (upper part: left auricle) | From left 2nd costal cartilage (lateral to sternal border) → apex beat (5th left ICS, MCL) |
| Inferior border | Right ventricle + small LV strip | From 6th right costal cartilage → apex beat |
| Superior border | Right & left atria + great vessels | From right 2nd to left 2nd costal cartilage, across the sternal angle |
| Relation | Vertebral Level |
|---|---|
| Upper pole | T12 (lower border) |
| Hilum | L1 (transpyloric plane) |
| Lower pole | L3 |
| Relation | Vertebral Level |
|---|---|
| Upper pole | T11 (lower border) |
| Hilum | L1 |
| Lower pole | L2-L3 |
| Part | Vertebral Level | Surface Marking |
|---|---|---|
| Head (in C of duodenum) | L1-L2 | To the right of midline, below transpyloric plane |
| Neck (overlies portal vein confluence) | L1 (transpyloric plane) | Crosses the midline at L1 |
| Body | L1 (crosses transpyloric plane) | Slightly to the left, at transpyloric plane (L1) |
| Tail | T12-L1 | Reaches the hilum of the spleen at T10 level |
| Quadrant | Key contents |
|---|---|
| Right upper (RUQ) | Liver (right lobe), gallbladder, right kidney, hepatic flexure, duodenum (2nd-3rd parts), head of pancreas |
| Left upper (LUQ) | Stomach, spleen, left kidney, splenic flexure, tail/body of pancreas, left lobe of liver |
| Right lower (RLQ) | Caecum, appendix, right ureter, right ovary/fallopian tube, right spermatic cord |
| Left lower (LLQ) | Sigmoid colon, left ureter, left ovary/fallopian tube, left spermatic cord |
| Part | Course | Vertebral Level |
|---|---|---|
| 1st (Superior) | From pylorus, runs upward and to the right; first 2.5 cm ("duodenal cap") is intraperitoneal | L1 |
| 2nd (Descending) | Descends vertically on the right side of L1-L3; bile duct and pancreatic duct open here (at ampulla of Vater, halfway down) | L1-L3 |
| 3rd (Horizontal) | Crosses horizontally to the left, across the midline | L3 |
| 4th (Ascending) | Ascends to the left of the aorta to the duodenojejunal flexure (DJ flexure) | L2 (DJ flexure at L2, left side of aorta) |
| Segment | Location / Level |
|---|---|
| Caecum | Right iliac fossa, L5-S1 level |
| Ascending colon | Right lateral region, L5 → L2-L3 level |
| Hepatic flexure | Below liver, right hypochondrium, L1 level |
| Transverse colon | Umbilical region; convex downward at umbilicus level (L3-L4) |
| Splenic flexure | Left hypochondrium; T10-T11 level (highest part of colon) |
| Descending colon | Left lateral region, L2-L3 → L5 |
| Sigmoid colon | Left iliac fossa + pelvis, S1-S3 |
| Rectum | S3 → perineal flexure |
| Structure | Vertebral Level |
|---|---|
| Arch of aorta | T4 (begins + ends) |
| Tracheal bifurcation (carina) | T4-T5 disc |
| Sternal angle | T4-T5 disc |
| Jugular notch | T2 lower border |
| Arch of aorta (convexity) | Mid-manubrium (T2-T3) |
| Cardiac orifice of stomach | T10-T11 |
| Diaphragm caval opening | T8 |
| Diaphragm esophageal opening | T10 |
| Diaphragm aortic opening | T12 |
| IVC formation | L5 |
| Aortic bifurcation | L4 |
| Coeliac trunk origin | T12/L1 |
| Superior mesenteric artery | L1 |
| Inferior mesenteric artery | L3 |
| Renal arteries | L1 (R slightly lower than L) |
| Portal vein formation | L1-L2 |
| Transpyloric plane | L1 |
| Pylorus | L1 |
| Neck of pancreas | L1 |
| Duodenojejunal flexure | L2 |
| Hilum of right kidney | L1 |
| Hilum of left kidney | L1 |
| Upper pole right kidney | T12 |
| Upper pole left kidney | T11 |
| Lower pole right kidney | L3 |
| Lower pole left kidney | L2-L3 |
| Spleen (long axis) | Along 10th rib |
| Spleen (extent) | T9-T11 |
| Root of mesentery | L2 (DJ) → right SI joint |
| Transtubercular plane | L5 |
| Highest point iliac crest (Jacoby's line) | L4 |
| Lumbar puncture (safe level) | L3-L4 / L4-L5 |
| Conus medullaris | L1-L2 |
| Cauda equina begins | L2 |
| C7 vertebra | Vertebra prominens |
| Trachea begins | C6 |
| Thyroid isthmus | 2nd-4th tracheal rings (C5-C6) |
| Carotid bifurcation | C3-C4 disc |
Create a comprehensive PDF poster with all 70 surface markings organized by region
~/surface-markings/generate_70_poster.py
"""
Surface Markings – 70 Items Comprehensive PDF Poster
MBBS Anatomy Practical Reference
Multi-page A3, organised by anatomical region
"""
from reportlab.lib.pagesizes import A3
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.pdfgen import canvas
from reportlab.platypus import (Table, TableStyle, Paragraph,
SimpleDocTemplate, Spacer, KeepTogether)
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT
import math, os
OUTPUT = "/home/daytona/workspace/surface-markings/Surface_Markings_70_MBBS.pdf"
PAGE_W, PAGE_H = A3
MARGIN = 1.3 * cm
# ── Colour palette ─────────────────────────────────────────────────────────
NAVY = colors.HexColor("#0D1B2A")
DARK_TEAL = colors.HexColor("#1B4F72")
TEAL = colors.HexColor("#1A6B8A")
LIGHT_TEAL = colors.HexColor("#D4EEF5")
GOLD = colors.HexColor("#F0A500")
CREAM = colors.HexColor("#FDFAF3")
WHITE = colors.white
GRAY_LIGHT = colors.HexColor("#DDDDDD")
GRAY_MED = colors.HexColor("#888888")
RED = colors.HexColor("#C0392B")
GREEN = colors.HexColor("#1E8449")
PURPLE = colors.HexColor("#6C3483")
ORANGE = colors.HexColor("#CA6F1E")
MAROON = colors.HexColor("#922B21")
DARK_BLUE = colors.HexColor("#1A237E")
OLIVE = colors.HexColor("#4A4A00")
# ── Region colour map ──────────────────────────────────────────────────────
REGION_COLOR = {
"Head & Neck": colors.HexColor("#6C3483"),
"Thorax": colors.HexColor("#145374"),
"Abdomen": colors.HexColor("#1E8449"),
"Upper Limb": colors.HexColor("#C0392B"),
"Lower Limb": colors.HexColor("#CA6F1E"),
"Reference Planes": colors.HexColor("#0D6B8A"),
"Special Structures": colors.HexColor("#4A235A"),
}
# ── All 70 surface markings ─────────────────────────────────────────────────
# Fields: no, name, region, level, landmark, marking, relations, clinical
DATA = [
# HEAD & NECK
{
"no": "4", "name": "Arch of Aorta",
"region": "Thorax",
"level": "T4 (begins & ends)",
"landmark": "Sternal angle (R) to T4 vertebral body (L)",
"marking": "Inverted U: R 2nd CC → midmanubrium → L 2nd CC",
"relations": "Tracheal bifurcation posteriorly; left RLN hooks under it; azygos, left vagus, left phrenic cross it",
"clinical": "Aneurysm → tracheal tug, hoarseness (RLN palsy), dysphagia",
},
{
"no": "5", "name": "C7 Vertebra (Vertebra Prominens)",
"region": "Head & Neck",
"level": "C7",
"landmark": "Most prominent spinous process at nape with neck flexed",
"marking": "Palpate base of neck – largest, non-bifid spinous process",
"relations": "T1 below; first rib; brachial plexus roots",
"clinical": "Reference for counting thoracic levels; cervical rib arises here",
},
{
"no": "6", "name": "Paranasal Sinuses",
"region": "Head & Neck",
"level": "Skull / face",
"landmark": "Frontal: above medial eyebrow; Maxillary: cheek; Ethmoid: between orbits; Sphenoid: ~7.5 cm from nasion",
"marking": "Frontal: 2.5 cm above medial orbital margin. Maxillary: below infraorbital rim to upper alveolus, medial nose to zygoma.",
"relations": "Maxillary floor → roots of upper premolars/molars; sphenoid → pituitary fossa",
"clinical": "Sinusitis vs dental pain; frontal sinus absent in ~5%; transillumination test",
},
{
"no": "9", "name": "Sternocleidomastoid (SCM)",
"region": "Head & Neck",
"level": "C1–T1 (oblique)",
"landmark": "Sternoclavicular joint → mastoid process + superior nuchal line",
"marking": "Prominent oblique strap visible / palpable on turning head to opposite side",
"relations": "Carotid sheath deep to it; EJV crosses superficially; posterior triangle lateral, anterior triangle medial",
"clinical": "Torticollis; neonatal SCM haematoma; landmark for carotid pulse, IJV, brachial plexus blocks",
},
{
"no": "10", "name": "Internal Jugular Vein (IJV)",
"region": "Head & Neck",
"level": "Jugular foramen → sternoclavicular joint",
"landmark": "Tragus of ear → medial end of clavicle (sternoclavicular joint)",
"marking": "Line from lobule/tragus of ear to sternoclavicular joint, deep to SCM",
"relations": "Carotid sheath: CCA medial, vagus posterior; overlapped by SCM",
"clinical": "Central venous access (right preferred); JVP assessment; not pulsatile (unlike carotid)",
},
{
"no": "12", "name": "Facial Nerve (CN VII)",
"region": "Head & Neck",
"level": "Stylomastoid foramen → face",
"landmark": "1 cm below tip of mastoid process (main trunk exit)",
"marking": "5 branches: Temporal (above zygomatic arch), Zygomatic, Buccal (level of ala nasi), Marginal Mandibular, Cervical",
"relations": "Traverses parotid gland; retromandibular vein, ECA within gland",
"clinical": "Bell's palsy; parotid surgery risk; parotid malignancy; mnemonic: Two Zebras Bit My Cheek",
},
{
"no": "19", "name": "Glabella",
"region": "Head & Neck",
"level": "Frontal bone between superciliary arches",
"landmark": "Smooth area between the two superciliary arches, above the nasion",
"marking": "Flat bony point between eyebrows, above bridge of nose; palpable directly",
"relations": "Above nasion; frontal eminences on each side; below is nasal bone",
"clinical": "Glabellar tap (Myerson's sign) – persistent blink = Parkinsonism",
},
{
"no": "22", "name": "Parotid Gland",
"region": "Head & Neck",
"level": "Pre-auricular region",
"landmark": "Anterior: masseter anterior border; Superior: zygomatic arch; Posterior: mastoid; Inferior: 1 cm below angle of mandible",
"marking": "Parotid duct (Stensen's): line from tragus → midpoint between ala of nose and angle of mouth; opens at upper 2nd molar",
"relations": "Facial nerve (CN VII) traverses it; retromandibular vein, ECA within gland",
"clinical": "Parotitis (mumps); pleomorphic adenoma; parotidectomy → facial nerve palsy risk",
},
{
"no": "40", "name": "Facial Artery",
"region": "Head & Neck",
"level": "External carotid → medial canthus",
"landmark": "Winds around lower border of mandible at anterior border of masseter",
"marking": "Line from lower mandible border at anterior masseter → lateral nose → medial canthus of eye",
"relations": "Terminal branch = angular artery; anastomoses with ophthalmic artery (ICA territory)",
"clinical": "Facial pulse at mandible; ligation for facial haemorrhage; angiography landmark",
},
{
"no": "43", "name": "Angle of Mandible",
"region": "Head & Neck",
"level": "Gonion",
"landmark": "Posteroinferior junction of ramus and body of mandible (gonion)",
"marking": "Palpable bony angle just below and anterior to ear lobule",
"relations": "Masseter inserts here; parotid overlies; facial artery curves around lower mandible at anterior masseter",
"clinical": "Parotid swelling fills the angle; masseter hypertrophy; Mallampati airway assessment",
},
{
"no": "44", "name": "Frankfurt Plane",
"region": "Head & Neck",
"level": "Infraorbital margin → upper EAM",
"landmark": "Lower margin of left orbit + upper margin of both external acoustic meatuses",
"marking": "Horizontal plane through infraorbital rim and upper EAM bilaterally",
"relations": "Zygomatic arch lies at this level; standard horizontal head posture",
"clinical": "Standard skull X-ray positioning; craniometry; forensic anthropology reference",
},
{
"no": "46", "name": "Zygomatic Arch",
"region": "Head & Neck",
"level": "Below lateral canthus → in front of tragus",
"landmark": "Horizontal bony bar: zygomatic bone (anteriorly) to temporal bone (posteriorly)",
"marking": "Palpate from below lateral canthus of eye to just anterior to the tragus of ear",
"relations": "Roof of infratemporal fossa; masseter from lower border; temporalis passes deep",
"clinical": "Tripod/malar fracture; temporal fossa surgery; cheekbone prominence",
},
{
"no": "48", "name": "Frontal Eminence (Frontal Tuber)",
"region": "Head & Neck",
"level": "Frontal bone",
"landmark": "~3 cm above midpoint of supraorbital margin",
"marking": "Smooth convex bony bulge on each side of forehead above orbit",
"relations": "Metopic suture in midline; more prominent in children",
"clinical": "Frontal bossing: rickets, thalassaemia, hydrocephalus, Paget's, achondroplasia",
},
{
"no": "50", "name": "Jugular Notch (Suprasternal Notch)",
"region": "Head & Neck",
"level": "T2 lower border / T2–T3 disc",
"landmark": "U-shaped notch at upper border of manubrium between the two clavicles",
"marking": "Midline palpable notch at base of neck; trachea felt just behind it",
"relations": "Trachea just posterior; brachiocephalic artery bifurcation (R); L brachiocephalic vein crosses",
"clinical": "Palpate for tracheal deviation; tracheostomy reference; central line entry point",
},
{
"no": "58", "name": "Superciliary Arch",
"region": "Head & Neck",
"level": "Frontal bone above orbit",
"landmark": "Curved bony ridge above each orbit on the frontal bone, above medial eyebrow",
"marking": "Palpable curved ridge above each orbit; glabella lies between them",
"relations": "Overlies frontal sinus (medially) and frontal lobe (laterally)",
"clinical": "Prominent arching = acromegaly; reference for supraorbital nerve block",
},
{
"no": "61", "name": "Carotid Pulse",
"region": "Head & Neck",
"level": "C3–C4 (bifurcation)",
"landmark": "Common carotid: lateral to trachea at level of thyroid cartilage; bifurcation at C3–C4",
"marking": "Press fingertips gently between trachea and SCM at thyroid cartilage level",
"relations": "Carotid sinus at bifurcation (C3–C4); carotid body; carotid sheath",
"clinical": "Carotid massage for SVT; carotid endarterectomy; carotid sinus hypersensitivity",
},
{
"no": "63", "name": "Trachea",
"region": "Head & Neck",
"level": "C6 → T4–T5 (bifurcation)",
"landmark": "Begins at lower border of cricoid (C6); ends at carina (T4–T5 disc = sternal angle)",
"marking": "Midline firm tubular structure from C6 downward; tracheal rings palpable; ~12 cm long",
"relations": "Oesophagus posterior; thyroid gland (rings 2–4); recurrent laryngeal nerves in tracheoesophageal groove",
"clinical": "Tracheal deviation (effusion/collapse); tracheal tug (aortic aneurysm); tracheostomy at 2nd–3rd ring",
},
{
"no": "64", "name": "Thyroid Gland",
"region": "Head & Neck",
"level": "Isthmus: 2nd–4th tracheal rings (C5–C6)",
"landmark": "Isthmus just below cricoid; lobes from lower thyroid cartilage to 5th–6th tracheal ring",
"marking": "Butterfly/H-shaped; isthmus = 2 finger-breadths below cricoid; lobes palpable lateral to trachea",
"relations": "Recurrent laryngeal nerve in tracheoesophageal groove; inferior thyroid artery; parathyroids on posterior surface",
"clinical": "Goitre; thyroidectomy risk: RLN palsy, hypoparathyroidism; pyramidal lobe extends up toward hyoid",
},
{
"no": "65", "name": "Cavernous Sinus",
"region": "Head & Neck",
"level": "Middle cranial fossa (sphenoid body)",
"landmark": "Deep to temporal fossa; from superior orbital fissure → apex of petrous temporal bone",
"marking": "~1 cm lateral to sella turcica; no direct surface palpation possible (deep structure)",
"relations": "Contents (lateral wall): CN III, IV, V1, V2; inside sinus: CN VI + ICA",
"clinical": "Cavernous sinus thrombosis (danger triangle); carotid-cavernous fistula; pituitary tumour compression → painful ophthalmoplegia",
},
{
"no": "66", "name": "External Jugular Vein (EJV)",
"region": "Head & Neck",
"level": "Below ear → midclavicle",
"landmark": "From angle of mandible / behind earlobe → midpoint of clavicle",
"marking": "Oblique line across SCM, visible on Valsalva; becomes prominent in raised JVP",
"relations": "Superficial to SCM; drains into subclavian vein; formed by posterior auricular + posterior retromandibular veins",
"clinical": "JVP assessment (less reliable than IJV); venous access; visible in SVC obstruction",
},
{
"no": "67", "name": "Internal Jugular Vein (IJV)",
"region": "Head & Neck",
"level": "Jugular foramen → sternoclavicular joint",
"landmark": "Tragus of ear → sternoclavicular joint (same as item 10 – right IJV preferred for CVC)",
"marking": "Deep to SCM; triangle formed by two SCM heads + clavicle = entry site for IJV cannulation",
"relations": "Right IJV more direct to RA; thoracic duct joins left IJV",
"clinical": "Central venous catheterisation; JVP measured as vertical height above sternal angle + 5 cm",
},
{
"no": "68", "name": "Submandibular Gland",
"region": "Head & Neck",
"level": "Submandibular triangle",
"landmark": "Filling the digastric (submandibular) triangle below the body of mandible",
"marking": "Palpable below lower border of mandible; bimanual palpation (intraoral + extraoral)",
"relations": "Wharton's duct opens at sublingual papilla; facial artery/vein cross it; lingual nerve loops under duct",
"clinical": "Commonest site for salivary calculi (Wharton's duct); submandibular swelling; Ludwig's angina",
},
{
"no": "70", "name": "Jugular Venous Arch",
"region": "Head & Neck",
"level": "~2 cm above jugular notch",
"landmark": "Transverse connection between two anterior jugular veins in suprasternal space of Burns",
"marking": "~2 cm above the jugular notch, in the midline suprasternal space",
"relations": "Drains into EJV or subclavian vein; lies in suprasternal space (of Burns)",
"clinical": "At risk in low tracheostomy and midline neck incisions; can cause profuse bleeding if cut",
},
# THORAX
{
"no": "13", "name": "Sternal Angle (Angle of Louis)",
"region": "Thorax",
"level": "T4–T5 intervertebral disc",
"landmark": "Junction of manubrium and body of sternum; felt as transverse bony ridge",
"marking": "Palpate midline sternum – feel a horizontal step/ridge between manubrium and body",
"relations": "2nd rib/CC articulation; tracheal bifurcation; arch of aorta; azygos → SVC; superior/inferior mediastinum boundary",
"clinical": "Count ribs from here; JVP reference (5 cm above RA); cardiac catheterisation landmark",
},
{
"no": "17", "name": "Inferior Vena Cava (IVC)",
"region": "Thorax",
"level": "L5 (formation) → T8 (diaphragm)",
"landmark": "Forms at L5 (union of common iliac veins); passes through diaphragm at T8",
"marking": "Line just to the right of midline from L5 up to T8 (caval opening = right hemidiaphragm)",
"relations": "Right of aorta; receives renal veins (L1), hepatic veins (T8–L1); right ureter crosses anteriorly",
"clinical": "IVC filter for DVT/PE prophylaxis; Budd-Chiari syndrome (hepatic vein obstruction); IVC thrombosis",
},
{
"no": "18", "name": "Superior Vena Cava (SVC)",
"region": "Thorax",
"level": "Right 1st CC lower border → right 3rd CC",
"landmark": "Forms behind lower border of right 1st CC; drains into RA at right 3rd CC level",
"marking": "Line 2–3 cm to the right of the sternal border, from right 1st CC junction down to right 3rd CC",
"relations": "Azygos vein joins it at T4 (sternal angle); phrenic nerve runs lateral to it",
"clinical": "SVC syndrome (mediastinal compression): facial oedema, arm oedema, distended neck veins",
},
{
"no": "35", "name": "Pleural Reflection",
"region": "Thorax",
"level": "Anterior: 4th–6th CC; Inferior: 8–10–12 rule",
"landmark": "Anterior: both sides converge at 2nd CC (sternal angle); Left deviates at 4th CC (cardiac notch)",
"marking": "Inferior border (right): MCL = 8th rib, MAL = 10th rib, Paravertebral = 12th rib",
"relations": "Cardiac notch on left (4th–6th CC) allows pericardiocentesis; costodiaphragmatic recess at 8–10–12",
"clinical": "Pneumothorax; pleural effusion; intercostal drain site (5th ICS, MAL); avoid below 12th rib (kidney)",
},
{
"no": "51", "name": "Pleura (Cervical Dome)",
"region": "Thorax",
"level": "2.5 cm above medial clavicle / 1st rib level",
"landmark": "Dome of pleura: 2.5 cm above medial end of clavicle; 1 cm above junction of medial & middle thirds",
"marking": "Curved line above medial clavicle, convex upward into the root of the neck",
"relations": "Subclavian vessels, brachial plexus, subclavian vein anterior; lung apex within the dome",
"clinical": "Pneumothorax risk in subclavian line insertion, supraclavicular brachial plexus block, neck surgery",
},
{
"no": "52", "name": "Apex of Heart",
"region": "Thorax",
"level": "5th left ICS, medial to MCL",
"landmark": "5th left ICS at or just medial to the midclavicular line (~9 cm from midsternal line)",
"marking": "Outermost and lowermost point of definite cardiac pulsation; count from sternal angle",
"relations": "Left ventricle tip; in children at 4th ICS",
"clinical": "Displaced L+down = LV enlargement; not felt = obesity, effusion, emphysema, dextrocardia",
},
{
"no": "53", "name": "Borders of Heart",
"region": "Thorax",
"level": "2nd–6th costal cartilages",
"landmark": "Right border: RA (right 3rd–6th CC, 1–1.5 cm right of sternal border). Left border: LV+LA appendage (L 2nd CC → apex). Inferior: RV (6th R CC → apex). Superior: great vessels (2nd CC level).",
"marking": "4 points: (1) Right 3rd CC, 1 cm from sternal border; (2) Right 6th CC, 1 cm from sternal border; (3) Left 2nd CC, 1 cm from sternal border; (4) Apex (5th L ICS, MCL)",
"relations": "RA forms right border; RV inferior; LV left; LA appendage upper left",
"clinical": "Cardiac enlargement pattern determines chamber involved; pericardial effusion enlarges all borders",
},
# ABDOMEN
{
"no": "3", "name": "Portal Vein",
"region": "Abdomen",
"level": "L1–L2 (transpyloric plane)",
"landmark": "Formation behind neck of pancreas at L1–L2; hepatoduodenal ligament (free edge of lesser omentum)",
"marking": "~Transpyloric plane, slightly right of midline, behind neck of pancreas",
"relations": "Formed by SMV + splenic vein; also receives left/right gastric, cystic, para-umbilical veins",
"clinical": "Portal hypertension; portosystemic anastomoses (oesophagus, umbilicus, rectum, retroperitoneum); variceal bleeding",
},
{
"no": "8", "name": "Morris Parallelogram (Kidney marking)",
"region": "Abdomen",
"level": "T11–L3 (posterior)",
"landmark": "4 lines: medial vertical 2.5 cm from midline; lateral vertical 9.5 cm from midline; upper horizontal T11; lower horizontal L3",
"marking": "Draw rectangle on posterior back between T11 and L3, 2.5–9.5 cm lateral to midline",
"relations": "Kidney lies within this parallelogram; right kidney slightly lower than left",
"clinical": "Guides renal biopsy positioning; renal angle tenderness (pyelonephritis = punch tenderness at 12th rib–erector spinae angle)",
},
{
"no": "11", "name": "Kidney",
"region": "Abdomen",
"level": "R: T12–L3 / L: T11–L2-3",
"landmark": "Right: upper pole T12, hilum L1, lower pole L3. Left: upper pole T11, hilum L1, lower pole L2–L3",
"marking": "Posterior: 12th rib to L3 spinous process, 2.5–9.5 cm lateral to midline. Anterior: not palpable unless enlarged",
"relations": "Perirenal fat; Gerota's fascia; adrenal gland at upper pole; renal artery at L1",
"clinical": "Pyelonephritis (renal angle tenderness); renal colic; nephrolithiasis; renal biopsy at lower pole",
},
{
"no": "21", "name": "Spleen",
"region": "Abdomen",
"level": "T9–T11 (long axis along 10th rib)",
"landmark": "Between 9th and 11th ribs; long axis along 10th rib; posterior end at T10 (4–5 cm from midline)",
"marking": "Left side: from T10 spinous process along 10th rib; anterior end just reaches midaxillary line normally",
"relations": "Stomach (anteromedial); diaphragm (superior); left kidney (posteromedial); left colic (splenic) flexure (inferior)",
"clinical": "Not normally palpable; palpate from RIF toward LIF; dullness in left 9th ICS MAL (Traube's); notched border in splenomegaly",
},
{
"no": "23", "name": "Liver",
"region": "Abdomen",
"level": "T8–L1",
"landmark": "Upper border R: 5th rib MCL (T8–T9); Left: 5th L ICS just left of midsternal line. Lower border: follows R costal margin; crosses midline at transpyloric plane (L1)",
"marking": "Upper border: percussion dullness below R breast. Lower border: follows costal margin; liver dullness area on R side",
"relations": "Right lobe: anterior to right kidney; inferior surface: gallbladder, hepatic flexure, duodenum, right kidney",
"clinical": "Hepatomegaly measured in cm below R costal margin in MCL; obliterated liver dullness = pneumoperitoneum",
},
{
"no": "25", "name": "Pancreas",
"region": "Abdomen",
"level": "Head L1–L2; Neck L1; Body L1; Tail T12–L1",
"landmark": "Neck at transpyloric plane (L1) crosses midline. Head in C of duodenum at L1–L2. Tail reaches splenic hilum (T10 level).",
"marking": "Transverse structure centred on transpyloric plane; head right of midline, tail toward left hypochondrium",
"relations": "Portal vein forms behind neck; CBD runs in groove on posterior head; SMV/SMA emerge below neck",
"clinical": "Head Ca → obstructive jaundice; pancreatitis (pain radiating to back T12–L1); Courvoisier's law",
},
{
"no": "26", "name": "Iliac Crest",
"region": "Abdomen",
"level": "L4 (highest point = Jacoby's/intercristal line)",
"landmark": "Entirely subcutaneous; from ASIS (anteriorly) to PSIS (posteriorly); highest point = L4",
"marking": "Palpate the whole crest; Jacoby's line (joining highest points of both crests) = L4",
"relations": "Iliacus muscle attaches to inner lip; inguinal ligament from ASIS to pubic tubercle",
"clinical": "Lumbar puncture at L3–L4 or L4–L5 (below conus medullaris at L1–L2); bone marrow biopsy at PSIS; iliac crest graft",
},
{
"no": "32", "name": "Quadrants of Abdomen",
"region": "Abdomen",
"level": "L3–L4 (transumbilical plane) + median plane",
"landmark": "2 planes: median vertical + transumbilical horizontal (through umbilicus at L3–L4)",
"marking": "Cross centred on umbilicus divides abdomen into 4 quadrants (RUQ, LUQ, RLQ, LLQ)",
"relations": "RUQ: liver, GB, R kidney, hepatic flexure, head of pancreas. LUQ: stomach, spleen, L kidney, splenic flexure, tail of pancreas. RLQ: caecum, appendix, R ureter, R ovary. LLQ: sigmoid, L ureter, L ovary.",
"clinical": "Pain localisation: RUQ = biliary/hepatic; LUQ = gastric/splenic; RLQ = appendicitis; LLQ = sigmoid/diverticular",
},
{
"no": "36", "name": "Root of Mesentery",
"region": "Abdomen",
"level": "L2 (DJ flexure) → right sacroiliac joint (L5–S1)",
"landmark": "From left side of L2 (DJ flexure) diagonally to right iliac fossa (ileocaecal junction at right SI joint)",
"marking": "15 cm diagonal line across posterior abdominal wall from L2 (left) to right SI joint",
"relations": "Crosses: 3rd part duodenum (L3), aorta + IVC, right ureter, right psoas, right common iliac vessels",
"clinical": "Axis of volvulus; root of mesentery incision in laparotomy; Treitz ligament at upper end",
},
{
"no": "37", "name": "Caecum",
"region": "Abdomen",
"level": "Right iliac fossa (L5–S1 level)",
"landmark": "Oval structure in right iliac fossa, above the lateral half of the right inguinal ligament",
"marking": "6 cm wide × 7.5 cm long; centred around McBurney's point area in RIF",
"relations": "Ileocaecal valve on posteromedial wall; taeniae coli converge at appendicular base; iliacus + psoas form floor",
"clinical": "Caecal volvulus; carcinoma caecum (most common right colonic tumour); caecostomy",
},
{
"no": "39", "name": "McBurney's Point",
"region": "Abdomen",
"level": "Right iliac fossa",
"landmark": "Junction of lateral 1/3 and medial 2/3 of a line from right ASIS to umbilicus",
"marking": "1/3 from right ASIS toward umbilicus; overlies base of appendix (constant) even though tip position varies",
"relations": "Appendicular orifice (base of appendix); ileocaecal valve; caecum",
"clinical": "Maximum tenderness in acute appendicitis; McBurney's (gridiron) incision; Lanz point (1/3 along ASIS–ASIS line)",
},
{
"no": "42", "name": "Stomach",
"region": "Abdomen",
"level": "Cardiac: T10–T11; Pylorus: L1",
"landmark": "Cardiac orifice: T10–T11, 3–4 cm left of midline (behind 7th L CC). Pylorus: transpyloric plane L1, 1–2 cm right of midline. Fundus: up to 5th L ICS.",
"marking": "J-shaped organ from L hypochondrium to epigastrium; fundus beneath left dome of diaphragm",
"relations": "Anteriorly: anterior abdominal wall, left lobe liver; Posteriorly: lesser sac, pancreas, left kidney, spleen",
"clinical": "Gastric ulcer (lesser curvature); pyloric stenosis; gastric outlet obstruction; NG tube placement at T10",
},
{
"no": "45", "name": "Duodenum",
"region": "Abdomen",
"level": "1st: L1; 2nd: L1–L3; 3rd: L3; 4th (DJ flexure): L2",
"landmark": "1st part (cap): L1, right of pylorus. 2nd (descending): L1–L3 on right, ampulla of Vater midway. 3rd (horizontal): L3. DJ flexure: L2, left of aorta.",
"marking": "C-shaped loop around head of pancreas; transpyloric plane marks 1st part; DJ flexure at left of L2",
"relations": "Head of pancreas in C of duodenum; portal vein + hepatic artery + CBD in hepatoduodenal ligament; SMV/SMA compress 3rd part",
"clinical": "Duodenal ulcer (1st part, D1 or bulb); obstructive jaundice (2nd part – ampullary/CBD); SMA syndrome (3rd part compression)",
},
{
"no": "54", "name": "Intestine (Small & Large)",
"region": "Abdomen",
"level": "Jejunum: L lumbar/umbilical; Ileum: umbilical/RIF; Colon: see table",
"landmark": "Jejunum: upper-left abdomen. Ileum: central & RIF. Transverse colon: umbilical region (L3–L4). Splenic flexure: T10–T11 (highest). Hepatic flexure: L1.",
"marking": "Colon frame: ascending (R lateral, L5→L2-3), hepatic flexure (L1), transverse (umbilical/L3-4), splenic flexure (T10-11), descending (L lumbar), sigmoid (L iliac/pelvis)",
"relations": "Splenic flexure is highest and most fixed; sigmoid most mobile (volvulus risk)",
"clinical": "Hirschsprung's disease; volvulus (sigmoid > caecal); colonoscopy landmarking; Meckel's diverticulum 2 feet from ileocaecal valve",
},
{
"no": "59", "name": "Appendicular Orifice",
"region": "Abdomen",
"level": "Right iliac fossa (same as McBurney's point)",
"landmark": "Base of appendix at McBurney's point – 1/3 from right ASIS to umbilicus",
"marking": "Same as McBurney's point; three taeniae coli converge at the base of appendix (surgical guide)",
"relations": "Opens on posteromedial wall of caecum, 2–3 cm below ileocaecal junction",
"clinical": "Appendicitis; appendicectomy (gridiron / Lanz / laparoscopic); retrocaecal appendix most common position (75%)",
},
{
"no": "62", "name": "Transpyloric Plane (of Addison)",
"region": "Reference Planes",
"level": "L1",
"landmark": "Midway between jugular notch and pubic symphysis = L1 vertebra",
"marking": "Feel the line as a skin crease when patient lifts head (tensing rectus); halfway between xiphisternum and umbilicus",
"relations": "Pylorus, fundus of gallbladder (9th CC tip), neck of pancreas, portal vein, SMA origin, hilum of kidneys, DJ flexure, coeliac trunk (just above at T12/L1), conus medullaris (L1–L2)",
"clinical": "Key reference plane for abdominal anatomy; conus medullaris ends at L1 (safe LP at L3–L4 or L4–L5)",
},
{
"no": "69", "name": "Transtubercular Plane",
"region": "Reference Planes",
"level": "L5",
"landmark": "Horizontal plane through both iliac tubercles (~5 cm posterior to ASIS)",
"marking": "Line joining the two iliac tubercles posteriorly on the pelvis",
"relations": "IVC formation at L5; aortic bifurcation just above at L4; beginning of common iliac arteries",
"clinical": "Reference plane for pelvic structures; landmarks abdominal aortic bifurcation (L4, just above) vs IVC formation (L5, just below)",
},
# UPPER LIMB
{
"no": "1", "name": "Anatomical Snuff Box",
"region": "Upper Limb",
"level": "Dorsolateral wrist",
"landmark": "Between EPL (medial) and APL + EPB (lateral) tendons at dorsolateral wrist",
"marking": "Triangular hollow on dorsolateral wrist when thumb is extended; floor: styloid of radius → scaphoid → trapezium",
"relations": "Cephalic vein + superficial radial nerve in roof; radial artery deep to floor",
"clinical": "Tenderness = scaphoid fracture (even if X-ray normal); radial artery palpable here",
},
{
"no": "7", "name": "Brachial Artery",
"region": "Upper Limb",
"level": "Apex of axilla → neck of radius",
"landmark": "Medial bicipital groove, apex of axilla to midpoint of cubital fossa (just medial to biceps tendon)",
"marking": "Line along medial aspect of arm; bifurcates 2.5 cm below medial epicondyle (neck of radius)",
"relations": "Median nerve: lateral proximally, crosses to medial at mid-arm; cubital fossa: medial to biceps tendon",
"clinical": "BP measurement site; supracondylar fracture → Volkmann's ischaemic contracture; median nerve injury",
},
{
"no": "14", "name": "Median Nerve",
"region": "Upper Limb",
"level": "Medial cubital fossa → midpoint of wrist",
"landmark": "Medial to brachial artery in cubital fossa; emerges between PLT and FCR at wrist",
"marking": "Line from medial cubital fossa to midpoint of wrist crease (between palmaris longus and FCR tendons)",
"relations": "Crosses brachial artery at mid-arm; between FDS & FDP in forearm; carpal tunnel (superficial-radial position)",
"clinical": "Carpal tunnel syndrome (ape hand, LOAF weakness); Phalen's test; Tinel's sign; pronator teres syndrome",
},
{
"no": "16", "name": "Flexor Retinaculum (Hand)",
"region": "Upper Limb",
"level": "Anterior wrist: distal wrist crease + 2.5 cm",
"landmark": "Proximal border = distal wrist crease; distal border = 2.5 cm distal; forms roof of carpal tunnel",
"marking": "2.5 cm transverse fibrous band on anterior wrist; medial: pisiform + hook of hamate; lateral: scaphoid tubercle + trapezium ridge",
"relations": "Carpal tunnel: FDS×4, FDP×4, FPL, median nerve. Ulnar nerve + artery pass superficial to it (Guyon's canal)",
"clinical": "Carpal tunnel syndrome; Phalen's test; Tinel's sign at wrist; surgical release (carpal tunnel release)",
},
{
"no": "24", "name": "Axillary Artery",
"region": "Upper Limb",
"level": "Outer border of 1st rib → lower border of teres major",
"landmark": "Midpoint of clavicle to the anterior axillary fold (lower border of pectoralis major)",
"marking": "Line from midpoint of clavicle along the axilla toward the medial aspect of the arm",
"relations": "3 parts (relative to pec minor): Part 1 = 1 branch; Part 2 = 2 branches; Part 3 = 3 branches (1-2-3 rule)",
"clinical": "Axillary nerve injury (shoulder dislocation → deltoid wasting); brachial plexus blocks; axillary artery aneurysm",
},
{
"no": "28", "name": "Superficial Palmar Arch",
"region": "Upper Limb",
"level": "Proximal transverse palmar crease",
"landmark": "Level of distal border of fully extended/abducted thumb; proximal transverse palmar crease",
"marking": "Convex curved line across palm at Kaplan's cardinal line level; beneath palmar aponeurosis",
"relations": "Mainly ulnar artery + superficial branch of radial; 3 common palmar digital arteries + 1 proper to little finger",
"clinical": "Allen's test assesses patency; palm laceration may divide arch; anatomic variation in ulnar dominance",
},
{
"no": "29", "name": "Deep Palmar Arch",
"region": "Upper Limb",
"level": "Bases of metacarpal bones",
"landmark": "Across bases (proximal ends) of metacarpals; ~1 cm proximal to superficial arch",
"marking": "Curved line at MC bases, deep to long flexor tendons; under thenar muscles",
"relations": "Mainly radial artery + deep branch of ulnar; deep branch of ulnar nerve accompanies it",
"clinical": "Injured in deep thenar lacerations; Mnemonic: SUlnar/Uradial (Superficial=Ulnar, Deep=Radial dominant)",
},
{
"no": "30", "name": "Brachial Artery (repeat)",
"region": "Upper Limb",
"level": "(same as #7 – Brachial Artery)",
"landmark": "See #7 – identical structure. Medial bicipital groove, apex of axilla → cubital fossa.",
"marking": "Medial bicipital groove → cubital fossa; felt medial to biceps tendon; bifurcates at neck of radius",
"relations": "Median nerve lateral → crosses to medial at mid-arm",
"clinical": "See #7 – BP measurement, supracondylar fracture, Volkmann's ischaemia",
},
{
"no": "33", "name": "Radius",
"region": "Upper Limb",
"level": "Lateral epicondyle → radial styloid (distal forearm)",
"landmark": "Head: palpable in hollow distal to lateral epicondyle; Styloid: lateral wrist prominence",
"marking": "Head palpable on supination/pronation; styloid process extends 1 cm more distally than ulnar styloid",
"relations": "Radial nerve winds in spiral groove of humerus; pronator teres inserts at lateral shaft; biceps inserts at radial tuberosity",
"clinical": "Colles' fracture (distal radius, dinner fork deformity); Smith's fracture; most common fractured bone in body (distal radius)",
},
{
"no": "34", "name": "Ulnar Nerve",
"region": "Upper Limb",
"level": "Medial epicondyle → lateral pisiform",
"landmark": "Passes behind medial epicondyle (cubital tunnel); then along medial forearm to lateral pisiform",
"marking": "Line from behind medial epicondyle to lateral side of pisiform bone at wrist",
"relations": "Palpable behind medial epicondyle; enters Guyon's canal at wrist (superficial to flexor retinaculum)",
"clinical": "Cubital tunnel syndrome; claw hand (ring + little fingers); Guyon's canal syndrome; ulnar paradox; hypothenar hammer syndrome",
},
{
"no": "60", "name": "Cubital Fossa",
"region": "Upper Limb",
"level": "Anterior elbow",
"landmark": "Triangular hollow anterior to elbow; base = line between medial and lateral epicondyles",
"marking": "Medial border: pronator teres. Lateral border: brachioradialis. Floor: brachialis (medial) + supinator (lateral)",
"relations": "Contents (lateral→medial): biceps tendon, brachial artery, median nerve. Radial nerve in groove between brachioradialis and brachialis (not strictly in fossa).",
"clinical": "BP measurement; venipuncture (median cubital vein); brachial artery catheterisation; biceps tendon rupture",
},
{
"no": "20", "name": "Superior Extensor Retinaculum (Foot)",
"region": "Lower Limb",
"level": "Lower anterior leg, above ankle joint",
"landmark": "Transverse band ~2 cm wide, across lower anterior leg, from lower fibula to lower tibia",
"marking": "Firm transverse band palpable just above the ankle joint on the anterior leg",
"relations": "Deep to it (anterior to posterior): tibialis anterior, EHL, anterior tibial vessels, deep peroneal nerve, EDL/EDB",
"clinical": "Anterior compartment syndrome; extensor tendon injuries; ankle arthroplasty approach",
},
# LOWER LIMB
{
"no": "27", "name": "Patella",
"region": "Lower Limb",
"level": "Anterior knee",
"landmark": "Largest sesamoid bone; base at lower end of femoral shaft; apex connects via patellar ligament to tibial tuberosity",
"marking": "Palpate ovoid flat bone on anterior knee; freely mobile in all directions when knee extended",
"relations": "Quadriceps tendon inserts into base; patellar ligament from apex to tibial tuberosity; patellofemoral joint posteriorly",
"clinical": "Patellar fracture; patellar tap sign (effusion); bipartite patella; patellofemoral syndrome (chondromalacia); jumper's knee",
},
{
"no": "38", "name": "Greater Trochanter",
"region": "Lower Limb",
"level": "Pubic symphysis level",
"landmark": "Large bony prominence on lateral proximal femur; a hand-breadth below iliac crest; same horizontal level as pubic symphysis",
"marking": "Palpate on lateral thigh ~8–10 cm below iliac crest; most lateral palpable part of hip",
"relations": "Gluteus medius + minimus insert; piriformis at medial surface; sciatic nerve just posterior; hip joint deep",
"clinical": "Trochanteric bursitis; Trendelenburg gait (gluteus medius weakness); trochanteric fracture; lateral hip approach (Hardinge)",
},
{
"no": "41", "name": "Saphenous Opening (Fossa Ovalis)",
"region": "Lower Limb",
"level": "~3.5–4 cm below and lateral to pubic tubercle",
"landmark": "Oval aperture in fascia lata; great saphenous vein passes through to drain into femoral vein",
"marking": "~4 cm below and 3–4 cm lateral to the pubic tubercle; covered by cribriform fascia",
"relations": "Great saphenous vein; superficial epigastric, superficial circumflex iliac, superficial external pudendal vessels",
"clinical": "Femoral hernia presents as lump here; sapheno-femoral junction ligation; femoral vein thrombosis",
},
{
"no": "47", "name": "Medial Malleolus",
"region": "Lower Limb",
"level": "Medial ankle (distal tibia)",
"landmark": "Bony prominence on medial ankle; lower tip ~1.5 cm above the sole; 2.5 cm higher than lateral malleolus",
"marking": "Palpable directly on medial ankle; tarsal tunnel runs posterior to it (medial malleolus → calcaneus)",
"relations": "Tarsal tunnel contents (posterior to medial malleolus): Tibialis posterior, FDL, posterior tibial artery + veins, tibial nerve, FHL (Tom Dick ANd Very Nervous Harry)",
"clinical": "Medial malleolus fracture (bimalleolar/trimalleolar); tarsal tunnel syndrome; deltoid ligament sprain",
},
{
"no": "49", "name": "Tibial Tuberosity",
"region": "Lower Limb",
"level": "~5 cm below apex of patella (anterior tibia)",
"landmark": "Smooth bony prominence on anterior upper tibia, midline, 5 cm below patella apex",
"marking": "Palpate the roughened oval elevation on anterior shin just below and medial to the patella",
"relations": "Patellar ligament (ligamentum patellae) inserts here; growth plate (apophysis) in children",
"clinical": "Osgood-Schlatter disease (adolescent apophysitis); patellar ligament avulsion; tibial IM nail insertion site",
},
{
"no": "55", "name": "Femoral Triangle",
"region": "Lower Limb",
"level": "Upper anterior thigh",
"landmark": "Base: inguinal ligament. Medial border: adductor longus. Lateral border: sartorius. Apex: ~10 cm below inguinal ligament.",
"marking": "Inverted triangle on upper anterior thigh; contents (lateral→medial = NAVY): Nerve (femoral), Artery (femoral), Vein (femoral), whY (lymphatics/femoral canal)",
"relations": "Floor: iliopsoas (lateral), pectineus + adductor longus (medial). Roof: fascia lata + skin.",
"clinical": "Femoral hernia (through femoral canal); femoral artery puncture for angiography; femoral nerve block; femoral lymphadenopathy",
},
{
"no": "56", "name": "Mid-Inguinal Point",
"region": "Lower Limb",
"level": "Midpoint of inguinal ligament (ASIS to pubic symphysis)",
"landmark": "Midpoint between ASIS and pubic symphysis; overlies femoral artery as it passes under inguinal ligament",
"marking": "Bisect the inguinal ligament; feel the femoral pulse deep at this point",
"relations": "Deep inguinal ring lies 1–1.5 cm above and lateral to pubic tubercle (same general area)",
"clinical": "Femoral pulse palpation; femoral artery cannulation; differentiate femoral hernia (below+lateral to pubic tubercle) from inguinal hernia (above+medial)",
},
{
"no": "57", "name": "Flexor Retinaculum (Foot) / Laciniate Ligament",
"region": "Lower Limb",
"level": "Medial ankle: medial malleolus → calcaneus",
"landmark": "From medial malleolus to medial surface of the calcaneus, bridging the tarsal tunnel",
"marking": "Firm band palpable on medial ankle from below medial malleolus to heel (calcaneus)",
"relations": "Tarsal tunnel contents (anterior→posterior: Tom Dick ANd Very Nervous Harry): Tibialis posterior / FDL / posterior tibial artery + veins / tibial Nerve / FHL",
"clinical": "Tarsal tunnel syndrome (tibial nerve compression): burning pain + paraesthesia over sole; medial ankle release surgery",
},
{
"no": "2", "name": "Suprameatal Triangle (Macewen's Triangle)",
"region": "Head & Neck",
"level": "Posterosuperior to EAM",
"landmark": "Posterior + superior to the external acoustic meatus; overlies the mastoid antrum 1.5 cm deep",
"marking": "Bounded by: supramastoid crest (superior), posterior wall of EAM (anterior), vertical tangent to posterior EAM wall (posterior)",
"relations": "Mastoid antrum lies ~1.5 cm deep to triangle; facial nerve canal just medial and deep",
"clinical": "Macewen's triangle = entry zone for cortical mastoidectomy; eroded/displaced in cholesteatoma; pus may point here in mastoiditis",
},
{
"no": "15", "name": "Anterior Fontanelle",
"region": "Head & Neck",
"level": "Bregma (junction of coronal + sagittal + metopic sutures)",
"landmark": "Diamond-shaped soft spot at top of infant skull; ~4 cm × 2.5 cm at birth; closes at 9–18 months",
"marking": "Palpate at junction of midline and a coronal line through the ears; felt as soft pulsatile area in infants",
"relations": "Sutures: coronal, sagittal, metopic converge here = bregma; overlies superior sagittal sinus",
"clinical": "Bulging = raised ICP (meningitis, hydrocephalus); Depressed = dehydration; Delayed closure = hypothyroidism, rickets, Down syndrome; acoustic window for cranial US",
},
]
# Sort data by region order, then by number
REGION_ORDER = ["Head & Neck", "Thorax", "Abdomen", "Upper Limb", "Lower Limb", "Reference Planes", "Special Structures"]
def region_sort_key(item):
try:
r = REGION_ORDER.index(item["region"])
except ValueError:
r = 99
try:
n = int(item["no"])
except ValueError:
n = 999
return (r, n)
DATA.sort(key=region_sort_key)
# ── Para styles ─────────────────────────────────────────────────────────────
PS_TITLE = ParagraphStyle("title", fontName="Helvetica-Bold", fontSize=10.5, textColor=WHITE, leading=13)
PS_LEVEL = ParagraphStyle("level", fontName="Helvetica-Bold", fontSize=7.5, textColor=GOLD, leading=10)
PS_LABEL = ParagraphStyle("label", fontName="Helvetica-Bold", fontSize=7, textColor=DARK_TEAL, leading=9)
PS_BODY = ParagraphStyle("body", fontName="Helvetica", fontSize=7.5, textColor=NAVY, leading=10)
PS_CLINICAL = ParagraphStyle("clinical", fontName="Helvetica-Oblique",fontSize=7.5, textColor=RED, leading=10)
PS_REG_HDR = ParagraphStyle("reghdr", fontName="Helvetica-Bold", fontSize=14, textColor=WHITE, leading=18, alignment=TA_CENTER)
PS_TBLHDR = ParagraphStyle("tblhdr", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE, leading=10, alignment=TA_CENTER)
PS_TBLCELL = ParagraphStyle("tblcell", fontName="Helvetica", fontSize=7.2, textColor=NAVY, leading=9.5)
PS_TBLNUM = ParagraphStyle("tblnum", fontName="Helvetica-Bold", fontSize=9, textColor=WHITE, leading=12, alignment=TA_CENTER)
HEADER_H = 3.9 * cm
FOOTER_H = 1.0 * cm
def draw_page_header(c):
c.setFillColor(NAVY)
c.rect(0, PAGE_H - HEADER_H, PAGE_W, HEADER_H, fill=1, stroke=0)
c.setFillColor(GOLD)
c.rect(0, PAGE_H - HEADER_H, PAGE_W, 0.22 * cm, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 26)
c.drawCentredString(PAGE_W / 2, PAGE_H - 1.5 * cm, "SURFACE MARKINGS — COMPREHENSIVE ANATOMY REFERENCE")
c.setFillColor(GOLD)
c.setFont("Helvetica-Bold", 14)
c.drawCentredString(PAGE_W / 2, PAGE_H - 2.3 * cm, "MBBS Anatomy Practical · 70 Key Structures · Exact Vertebral Levels")
c.setStrokeColor(GOLD)
c.setLineWidth(1)
c.line(MARGIN, PAGE_H - 3.1 * cm, PAGE_W - MARGIN, PAGE_H - 3.1 * cm)
c.setFillColor(LIGHT_TEAL)
c.setFont("Helvetica-Oblique", 10)
c.drawCentredString(PAGE_W / 2, PAGE_H - 3.55 * cm,
"Structure · Vertebral Level · Landmark · How to Mark · Relations · Clinical Pearl")
def draw_page_footer(c, page_num, total_pages):
c.setFillColor(NAVY)
c.rect(0, 0, PAGE_W, FOOTER_H, fill=1, stroke=0)
c.setFillColor(GOLD)
c.rect(0, FOOTER_H, PAGE_W, 0.07 * cm, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica", 8.5)
c.drawString(MARGIN, 0.3 * cm, "MBBS Anatomy Practical | Surface Markings Comprehensive Reference")
c.drawRightString(PAGE_W - MARGIN, 0.3 * cm, f"Page {page_num} of {total_pages}")
c.setFillColor(LIGHT_TEAL)
c.drawCentredString(PAGE_W / 2, 0.3 * cm, "For educational use only | Based on BD Chaurasia, Gray's & Snell's Anatomy")
def draw_region_banner(c, y, region):
col = REGION_COLOR.get(region, DARK_TEAL)
bw = PAGE_W - 2 * MARGIN
bh = 0.75 * cm
c.setFillColor(col)
c.roundRect(MARGIN, y, bw, bh, 4, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 13)
c.drawCentredString(PAGE_W / 2, y + 0.22 * cm, f"▶ {region.upper()}")
return y - 0.15 * cm # return bottom of banner (y is bottom-left of rect)
def build_card_table(item, card_w):
"""Build a platypus Table representing one card."""
rc = REGION_COLOR.get(item["region"], DARK_TEAL)
# Header row: coloured background with name + level + number badge
hdr_name = Paragraph(f"<b>{item['name']}</b>", PS_TITLE)
hdr_level = Paragraph(item["level"], PS_LEVEL)
hdr_num = Paragraph(f"<b>{item['no']}</b>", PS_TBLNUM)
body_rows = [
[Paragraph("<b>LANDMARK:</b>", PS_LABEL), Paragraph(item["landmark"], PS_BODY)],
[Paragraph("<b>MARKING:</b>", PS_LABEL), Paragraph(item["marking"], PS_BODY)],
[Paragraph("<b>RELATIONS:</b>",PS_LABEL), Paragraph(item["relations"],PS_BODY)],
[Paragraph("<b>CLINICAL:</b>", PS_LABEL), Paragraph(item["clinical"], PS_CLINICAL)],
]
lw = 1.6 * cm
rw = card_w - lw - 0.1 * cm
tbl = Table(
[[hdr_num, hdr_name],
["", hdr_level]] + [[r[0], r[1]] for r in body_rows],
colWidths=[lw, rw],
)
style = TableStyle([
# Header rows
("BACKGROUND", (0, 0), (-1, 1), rc),
("TEXTCOLOR", (0, 0), (-1, 1), WHITE),
("SPAN", (0, 0), (0, 1)), # number badge spans 2 header rows
("VALIGN", (0, 0), (-1, -1), "TOP"),
("ALIGN", (0, 0), (0, 1), "CENTER"),
("VALIGN", (0, 0), (0, 1), "MIDDLE"),
# Body rows
("BACKGROUND", (0, 2), (-1, -1), CREAM),
("ROWBACKGROUNDS",(0, 2), (-1, -1), [CREAM, colors.HexColor("#EBF5FB")]),
("LINEBELOW", (0, 1), (-1, -2), 0.4, GRAY_LIGHT),
# Box
("BOX", (0, 0), (-1, -1), 0.5, rc),
# Padding
("LEFTPADDING", (0, 0), (-1, -1), 4),
("RIGHTPADDING", (0, 0), (-1, -1), 4),
("TOPPADDING", (0, 0), (-1, -1), 2),
("BOTTOMPADDING", (0, 0), (-1, -1), 2),
])
tbl.setStyle(style)
return tbl
def build_summary_table(data):
"""One-page summary table of all 70 items."""
headers = ["#", "Structure", "Region", "Vertebral Level", "Key Landmark", "Clinical Pearl"]
col_widths = [0.65*cm, 4.5*cm, 2.7*cm, 4.2*cm, 6.2*cm, 6.2*cm]
rows = [headers]
for item in data:
def t(s, n=70):
return s if len(s) <= n else s[:n-1] + "…"
rows.append([
item["no"],
item["name"],
item["region"],
t(item["level"], 50),
t(item["landmark"], 75),
t(item["clinical"], 80),
])
# Build paragraph versions
ps_h = ParagraphStyle("sh", fontName="Helvetica-Bold", fontSize=7.5, textColor=WHITE, alignment=TA_CENTER, leading=10)
ps_n = ParagraphStyle("sn", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE, alignment=TA_CENTER, leading=10)
ps_c = ParagraphStyle("sc", fontName="Helvetica", fontSize=6.8, textColor=NAVY, leading=8.5)
ps_cl= ParagraphStyle("sl", fontName="Helvetica-Oblique", fontSize=6.8, textColor=RED, leading=8.5)
ps_r = ParagraphStyle("sr", fontName="Helvetica-Bold", fontSize=6.8, textColor=DARK_TEAL, leading=8.5)
prows = []
for ri, row in enumerate(rows):
if ri == 0:
prows.append([Paragraph(str(c), ps_h) for c in row])
else:
item_obj = data[ri - 1]
rc = REGION_COLOR.get(item_obj["region"], DARK_TEAL)
ps_num = ParagraphStyle(f"snum{ri}", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE, alignment=TA_CENTER, leading=10)
prows.append([
Paragraph(row[0], ps_num),
Paragraph(row[1], ps_c),
Paragraph(row[2], ps_r),
Paragraph(row[3], ps_c),
Paragraph(row[4], ps_c),
Paragraph(row[5], ps_cl),
])
tbl = Table(prows, colWidths=col_widths, repeatRows=1)
row_styles = [
("BACKGROUND", (0, 0), (-1, 0), NAVY),
("TEXTCOLOR", (0, 0), (-1, 0), WHITE),
("GRID", (0, 0), (-1, -1), 0.35, GRAY_LIGHT),
("VALIGN", (0, 0), (-1, -1), "TOP"),
("LEFTPADDING", (0, 0), (-1, -1), 3),
("RIGHTPADDING", (0, 0), (-1, -1), 3),
("TOPPADDING", (0, 0), (-1, -1), 2),
("BOTTOMPADDING", (0, 0), (-1, -1), 2),
("ROWBACKGROUNDS",(0, 1), (-1, -1), [CREAM, colors.HexColor("#EBF5FB")]),
]
# Colour number column per region
for ri in range(1, len(rows)):
item_obj = data[ri - 1]
rc = REGION_COLOR.get(item_obj["region"], DARK_TEAL)
row_styles.append(("BACKGROUND", (0, ri), (0, ri), rc))
tbl.setStyle(TableStyle(row_styles))
return tbl, col_widths
def build_vert_levels_table():
"""Key vertebral levels quick-reference."""
rows = [
["Structure / Landmark", "Vertebral Level", "Notes"],
["Jugular notch (suprasternal notch)", "T2–T3 disc", "Upper border of manubrium"],
["Sternal angle (Angle of Louis)", "T4–T5 disc", "2nd CC, carina, arch of aorta, azygos→SVC"],
["Arch of aorta (begins & ends)", "T4", "Inverted U; left of T4 vertebral body"],
["Tracheal bifurcation (carina)", "T4–T5 disc", "Sternal angle level"],
["IVC through diaphragm (caval opening)", "T8", "\"8 letters in caval opening\""],
["Oesophagus through diaphragm", "T10", "\"10 letters in oesophagus\""],
["Aorta through diaphragm", "T12", "\"12 letters in aortic opening\""],
["Cardiac orifice of stomach", "T10–T11", "3–4 cm left of midline"],
["Spleen (long axis along 10th rib)", "T9–T11", "Does not cross MAL normally"],
["Upper pole LEFT kidney", "T11", "Left kidney higher than right"],
["Upper pole RIGHT kidney", "T12", "Right kidney lower (liver)"],
["Thyroid isthmus", "C5–C6 (rings 2–4)","Just below cricoid cartilage"],
["Trachea begins (cricoid)", "C6", ""],
["Carotid bifurcation", "C3–C4", "Upper border of thyroid cartilage"],
["Transpyloric plane (Addison's)", "L1", "Pylorus, neck pancreas, hilum kidneys, SMA origin, portal vein"],
["Hilum of kidneys", "L1", "Left slightly higher; right at L1"],
["Lower pole LEFT kidney", "L2–L3", ""],
["Portal vein formation", "L1–L2", "Behind neck of pancreas"],
["Duodenojejunal (DJ) flexure", "L2", "Left of aorta; ligament of Treitz"],
["Lower pole RIGHT kidney", "L3", ""],
["3rd part duodenum", "L3", "SMA may compress (SMA syndrome)"],
["Aortic bifurcation", "L4", "Jacoby's (intercristal) line = L4"],
["Transtubercular plane", "L5", "Through iliac tubercles"],
["IVC formation", "L5", "Confluence of common iliac veins"],
["Conus medullaris", "L1–L2", "Safe LP at L3–L4 or L4–L5"],
["Inferior mesenteric artery", "L3", "Aortic origin"],
]
col_w = [(PAGE_W - 2*MARGIN) * x for x in [0.38, 0.22, 0.40]]
ps_hdr = ParagraphStyle("vh", fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE, alignment=TA_CENTER, leading=11)
ps_str = ParagraphStyle("vs", fontName="Helvetica-Bold", fontSize=7.5, textColor=NAVY, leading=10)
ps_lv = ParagraphStyle("vl", fontName="Helvetica-Bold", fontSize=7.5, textColor=RED, leading=10, alignment=TA_CENTER)
ps_nt = ParagraphStyle("vn", fontName="Helvetica", fontSize=7.2, textColor=GRAY_MED, leading=9.5)
prows = []
for ri, row in enumerate(rows):
if ri == 0:
prows.append([Paragraph(c, ps_hdr) for c in row])
else:
prows.append([Paragraph(row[0], ps_str), Paragraph(row[1], ps_lv), Paragraph(row[2], ps_nt)])
tbl = Table(prows, colWidths=col_w, repeatRows=1)
tbl.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, 0), NAVY),
("GRID", (0, 0), (-1, -1), 0.4, GRAY_LIGHT),
("ROWBACKGROUNDS",(0, 1), (-1, -1), [CREAM, colors.HexColor("#EBF5FB")]),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("LEFTPADDING", (0, 0), (-1, -1), 4),
("RIGHTPADDING", (0, 0), (-1, -1), 4),
("TOPPADDING", (0, 0), (-1, -1), 3),
("BOTTOMPADDING", (0, 0), (-1, -1), 3),
]))
return tbl
def main():
# ── Pass 1: measure card heights ──────────────────────────────────────────
COLS = 2
usable_w = PAGE_W - 2 * MARGIN
COL_GAP = 0.4 * cm
card_w = (usable_w - COL_GAP) / COLS
content_top = PAGE_H - HEADER_H - 0.35 * cm
content_bot = FOOTER_H + 0.3 * cm
usable_h = content_top - content_bot
# Build a temp canvas for measuring
import io
tmp_buf = io.BytesIO()
tmp_c = canvas.Canvas(tmp_buf, pagesize=A3)
card_heights = []
for item in DATA:
tbl = build_card_table(item, card_w)
w, h = tbl.wrapOn(tmp_c, card_w, 99999)
card_heights.append(h + 0.25 * cm) # +gap
# ── Page layout planning ───────────────────────────────────────────────────
# Each page: 2-column layout; items flow top-to-bottom in each column
# Group by region – keep region banner + its items together when possible
regions_in_order = []
seen = set()
for item in DATA:
r = item["region"]
if r not in seen:
regions_in_order.append(r)
seen.add(r)
# Build page layout instructions
pages = [] # list of list of (type, data, height) where type='banner' or 'card'
cur_page = []
col_heights = [0.0, 0.0]
cur_col = 0
BANNER_H = 0.9 * cm
cur_region = None
for idx, item in enumerate(DATA):
ch = card_heights[idx]
r = item["region"]
# If new region, add banner
if r != cur_region:
bh = BANNER_H + 0.15 * cm
# Try to fit banner + at least first card in this col
first_card_h = ch
needed = bh + first_card_h
if col_heights[cur_col] + needed > usable_h:
cur_col += 1
if cur_col >= COLS:
pages.append(cur_page)
cur_page = []
col_heights = [0.0, 0.0]
cur_col = 0
cur_page.append(("banner", r, bh, cur_col))
col_heights[cur_col] += bh
cur_region = r
# Fit card
if col_heights[cur_col] + ch > usable_h:
cur_col += 1
if cur_col >= COLS:
pages.append(cur_page)
cur_page = []
col_heights = [0.0, 0.0]
cur_col = 0
cur_region = None # reset – will redraw banner on new page
cur_page.append(("card", item, ch, cur_col))
col_heights[cur_col] += ch
if cur_page:
pages.append(cur_page)
# Summary page + vertebral levels page = 2 more
total_pages = len(pages) + 2
# ── Render ─────────────────────────────────────────────────────────────────
c = canvas.Canvas(OUTPUT, pagesize=A3)
c.setTitle("Surface Markings – 70 Items Comprehensive MBBS Reference")
c.setAuthor("Orris Medical Reference")
c.setSubject("Anatomy Surface Markings – 70 Key Structures")
for pg_idx, page_items in enumerate(pages):
draw_page_header(c)
draw_page_footer(c, pg_idx + 1, total_pages)
# Track y positions per column
col_y = [content_top, content_top]
for (itype, data_item, item_h, col_idx) in page_items:
cx = MARGIN + col_idx * (card_w + COL_GAP)
if itype == "banner":
region = data_item
rc = REGION_COLOR.get(region, DARK_TEAL)
by = col_y[col_idx] - (item_h - 0.15 * cm)
c.setFillColor(rc)
c.roundRect(cx, by, card_w, item_h - 0.15 * cm, 5, fill=1, stroke=0)
c.setFillColor(WHITE)
c.setFont("Helvetica-Bold", 12)
c.drawCentredString(cx + card_w / 2, by + (item_h - 0.15 * cm) * 0.28, f"▶ {region.upper()}")
col_y[col_idx] -= item_h
elif itype == "card":
tbl = build_card_table(data_item, card_w)
w, h = tbl.wrapOn(c, card_w, 99999)
cy_pos = col_y[col_idx] - h
tbl.drawOn(c, cx, cy_pos)
col_y[col_idx] -= (h + 0.25 * cm)
c.showPage()
# ── Summary table page ──────────────────────────────────────────────────────
draw_page_header(c)
draw_page_footer(c, len(pages) + 1, total_pages)
# Page sub-header
y = content_top
c.setFillColor(NAVY)
c.setFont("Helvetica-Bold", 15)
c.drawCentredString(PAGE_W / 2, y - 0.05*cm, "QUICK REFERENCE SUMMARY — ALL 70 SURFACE MARKINGS")
y -= 0.65 * cm
sum_tbl, _ = build_summary_table(DATA)
w, h = sum_tbl.wrapOn(c, PAGE_W - 2 * MARGIN, y - content_bot)
sum_tbl.drawOn(c, MARGIN, y - h)
c.showPage()
# ── Vertebral levels page ───────────────────────────────────────────────────
draw_page_header(c)
draw_page_footer(c, len(pages) + 2, total_pages)
y = content_top
c.setFillColor(NAVY)
c.setFont("Helvetica-Bold", 15)
c.drawCentredString(PAGE_W / 2, y - 0.05*cm, "VERTEBRAL LEVELS QUICK REFERENCE — KEY ANATOMICAL STRUCTURES")
y -= 0.7 * cm
# Colour legend for regions
c.setFont("Helvetica-Bold", 9)
c.setFillColor(NAVY)
c.drawString(MARGIN, y, "REGION COLOUR KEY:")
lx = MARGIN + 3.5 * cm
for reg, col in REGION_COLOR.items():
c.setFillColor(col)
c.roundRect(lx, y - 0.1*cm, 0.4*cm, 0.42*cm, 2, fill=1, stroke=0)
c.setFillColor(NAVY)
c.setFont("Helvetica", 8)
c.drawString(lx + 0.5*cm, y, reg)
lx += len(reg) * 0.115 * cm + 1.3 * cm
y -= 0.65 * cm
vl_tbl = build_vert_levels_table()
w, h = vl_tbl.wrapOn(c, PAGE_W - 2 * MARGIN, y - content_bot - 0.5*cm)
vl_tbl.drawOn(c, MARGIN, y - h)
# Mnemonic boxes below if space
my = y - h - 0.5 * cm
if my > content_bot + 1.5 * cm:
mnemonics = [
("Diaphragm Openings", "I 8 (ate) 10 (ten) eggs AT 12 (twelve):\n T8 = IVC (8 letters) T10 = Oesophagus (10 letters) T12 = Aorta (12 letters)"),
("Transpyloric Plane (L1)", "Pylorus · Neck of pancreas · Portal vein · SMA origin · Hilum of kidneys · Fundus of gallbladder · DJ flexure (just below/left) · Conus medullaris"),
("Femoral Triangle Contents (NAVY)", "N = Femoral Nerve (lateral, outside sheath)\nA = Femoral Artery (in sheath)\nV = Femoral Vein (in sheath, medial to A)\nY = whY = Lymphatics + femoral canal (most medial)"),
("Pleural Inferior Reflection (8–10–12)", "MCL → 8th rib | MAL → 10th rib | Paravertebral → 12th rib"),
]
bw = (PAGE_W - 2 * MARGIN - 0.4 * cm) / 2
bx = [MARGIN, MARGIN + bw + 0.4 * cm]
by_pos = my
for i, (title, body) in enumerate(mnemonics):
col_i = i % 2
row_i = i // 2
box_y = by_pos - row_i * 1.55 * cm
bh2 = 1.4 * cm
if box_y - bh2 < content_bot:
break
c.setFillColor(LIGHT_TEAL)
c.roundRect(bx[col_i], box_y - bh2, bw, bh2, 4, fill=1, stroke=0)
c.setFillColor(DARK_TEAL)
c.setFont("Helvetica-Bold", 8.5)
c.drawString(bx[col_i] + 0.3 * cm, box_y - 0.35 * cm, title)
c.setFillColor(NAVY)
c.setFont("Helvetica", 7.5)
lines = body.split("\n")
for li, line in enumerate(lines[:3]):
c.drawString(bx[col_i] + 0.3 * cm, box_y - 0.65 * cm - li * 0.27 * cm, line)
c.save()
size = os.path.getsize(OUTPUT)
print(f"✓ Saved: {OUTPUT}")
print(f"✓ File size: {size / 1024:.1f} KB")
print(f"✓ Total pages: {total_pages}")
print(f"✓ Total items: {len(DATA)}")
if __name__ == "__main__":
main()
cd /home/daytona/workspace/surface-markings && python generate_70_poster.py 2>&1
cd /home/daytona/workspace/surface-markings && python -c " from generate_70_poster import DATA nums = set(item['no'] for item in DATA) all_nums = set(str(i) for i in range(1, 71)) missing = all_nums - nums print('Missing nos:', sorted(missing, key=int)) print('Total in DATA:', len(DATA)) # Check for duplicates from collections import Counter c = Counter(item['no'] for item in DATA) dups = {k:v for k,v in c.items() if v > 1} print('Duplicates:', dups) " 2>&1
~/surface-markings/generate_70_poster.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/surface-markings/generate_70_poster.py'
cd /home/daytona/workspace/surface-markings && python generate_70_poster.py 2>&1
cd /home/daytona/workspace/surface-markings && python -c " from pypdf import PdfReader r = PdfReader('Surface_Markings_70_MBBS.pdf') print(f'Pages: {len(r.pages)}') all_text = '' for i, p in enumerate(r.pages): t = p.extract_text() all_text += t print(f' Page {i+1}: {len(t)} chars') # Verify key structures present checks = ['Arch of Aorta','Suprameatal','Portal Vein','Paranasal','Morris','Kidney', 'Spleen','Parotid','Liver','Pancreas','Iliac Crest','Stomach','Duodenum', 'McBurney','Appendicular','Transpyloric','Transtubercular','Femoral Triangle', 'Patella','Greater Trochanter','Saphenous','Medial Malleolus','Cavernous', 'Frankfurt','Zygomatic','Glabella','Trachea','Thyroid','Carotid', 'Axillary','Cubital Fossa','Flexor Retinaculum','Deep Palmar','Superficial Palmar', 'Ulnar Nerve','Median Nerve','IVC','SVC','Brachial'] print() missing = [c for c in checks if c not in all_text] if missing: print('MISSING:', missing) else: print('ALL KEY STRUCTURES VERIFIED ✓') print(f'Total text: {len(all_text)} chars') " 2>&1
Surface Markings 70 MBBS
PDF Document · PDF
| Page | Content |
|---|---|
| Pages 1-4 | All 70 cards in 2-column layout, grouped by region with coloured banners |
| Page 5 | Incomplete items that overflow (region continuation) |
| Page 6 | Full summary table - all 70 structures at a glance |
| Page 7 | Vertebral levels quick-reference + mnemonics |
Arranging series order according to topics