Refractive surgeries for myopia,hypermetropia at level of ophthalmology residents including all the theory parts in detailed version make ppt presentation
mkdir -p /tmp/workspace/refractive-surgery-ppt && ls /tmp/workspace/refractive-surgery-ppt/
~/refractive-surgery-ppt/build_ppt.py
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.oxml.ns import qn
from lxml import etree
from io import BytesIO
# ── Colour Palette ──────────────────────────────────────────────────────────
NAVY = RGBColor(0x0D, 0x2B, 0x55) # deep navy – titles
TEAL = RGBColor(0x00, 0x7E, 0x8A) # teal – section bars
LIGHT_BLUE = RGBColor(0xD9, 0xEF, 0xF6) # pale blue – background panel
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
ORANGE = RGBColor(0xE8, 0x76, 0x22) # accent
DARK_GREY = RGBColor(0x22, 0x22, 0x22)
MID_GREY = RGBColor(0x55, 0x55, 0x55)
PALE_BG = RGBColor(0xF4, 0xF8, 0xFB) # slide background
# ── Helpers ──────────────────────────────────────────────────────────────────
def set_slide_bg(slide, color):
"""Fill slide background with a solid colour."""
background = slide.background
fill = background.fill
fill.solid()
fill.fore_color.rgb = color
def add_rect(slide, x, y, w, h, color, alpha=None):
shape = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h))
shape.fill.solid()
shape.fill.fore_color.rgb = color
shape.line.fill.background()
return shape
def add_textbox(slide, x, y, w, h, text, font_size=18, bold=False,
color=DARK_GREY, align=PP_ALIGN.LEFT, italic=False,
word_wrap=True, v_anchor=MSO_ANCHOR.TOP):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = word_wrap
tf.vertical_anchor = v_anchor
tf.margin_left = Pt(2)
tf.margin_right = Pt(2)
tf.margin_top = Pt(2)
tf.margin_bottom = Pt(2)
p = tf.paragraphs[0]
p.alignment = align
r = p.add_run()
r.text = text
r.font.name = "Calibri"
r.font.size = Pt(font_size)
r.font.bold = bold
r.font.color.rgb = color
r.font.italic = italic
return tb
def add_bullet_textbox(slide, x, y, w, h, items, font_size=15, title=None,
title_size=17, bullet_color=TEAL, text_color=DARK_GREY):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Pt(4)
tf.margin_right = Pt(4)
tf.margin_top = Pt(2)
tf.margin_bottom = Pt(2)
first = True
if title:
p = tf.paragraphs[0]
p.alignment = PP_ALIGN.LEFT
r = p.add_run()
r.text = title
r.font.name = "Calibri"
r.font.size = Pt(title_size)
r.font.bold = True
r.font.color.rgb = NAVY
first = False
for item in items:
p = tf.add_paragraph() if not first else tf.paragraphs[0]
first = False
p.alignment = PP_ALIGN.LEFT
p.level = item.get("level", 0)
# bullet dot
dot_run = p.add_run()
if item.get("level", 0) == 0:
dot_run.text = "■ "
dot_run.font.color.rgb = bullet_color
else:
dot_run.text = " ◆ "
dot_run.font.color.rgb = ORANGE
dot_run.font.size = Pt(font_size - 1)
dot_run.font.name = "Calibri"
text_run = p.add_run()
text_run.text = item["text"]
text_run.font.name = "Calibri"
text_run.font.size = Pt(font_size)
text_run.font.color.rgb = text_color
text_run.font.bold = item.get("bold", False)
return tb
def add_header_bar(slide, title, subtitle=None):
"""Navy top bar with title and optional subtitle."""
add_rect(slide, 0, 0, 13.333, 1.15, NAVY)
add_textbox(slide, 0.3, 0.08, 12.5, 0.75, title,
font_size=28, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
if subtitle:
add_rect(slide, 0, 1.15, 13.333, 0.32, TEAL)
add_textbox(slide, 0.3, 1.15, 12.5, 0.32, subtitle,
font_size=14, bold=False, color=WHITE, italic=True,
v_anchor=MSO_ANCHOR.MIDDLE)
def add_section_label(slide, text, x, y, w=3.5, h=0.4):
add_rect(slide, x, y, w, h, TEAL)
add_textbox(slide, x+0.05, y, w-0.1, h, text,
font_size=13, bold=True, color=WHITE,
v_anchor=MSO_ANCHOR.MIDDLE)
def add_table_slide(prs, title, subtitle, headers, rows, col_widths):
blank = prs.slide_layouts[6]
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, title, subtitle)
tbl_top = Inches(1.55)
tbl_left = Inches(0.3)
total_w = sum(Inches(c) for c in col_widths)
tbl_height = Inches(0.4 * (len(rows) + 1))
table = slide.shapes.add_table(len(rows)+1, len(headers),
tbl_left, tbl_top,
total_w, tbl_height).table
# col widths
for ci, cw in enumerate(col_widths):
table.columns[ci].width = Inches(cw)
# header row
for ci, h in enumerate(headers):
cell = table.cell(0, ci)
cell.fill.solid()
cell.fill.fore_color.rgb = NAVY
p = cell.text_frame.paragraphs[0]
p.alignment = PP_ALIGN.CENTER
r = p.add_run()
r.text = h
r.font.name = "Calibri"
r.font.size = Pt(13)
r.font.bold = True
r.font.color.rgb = WHITE
# data rows
for ri, row in enumerate(rows):
bg = LIGHT_BLUE if ri % 2 == 0 else WHITE
for ci, val in enumerate(row):
cell = table.cell(ri+1, ci)
cell.fill.solid()
cell.fill.fore_color.rgb = bg
p = cell.text_frame.paragraphs[0]
p.alignment = PP_ALIGN.CENTER
r = p.add_run()
r.text = str(val)
r.font.name = "Calibri"
r.font.size = Pt(12)
r.font.color.rgb = DARK_GREY
return slide
# ═══════════════════════════════════════════════════════════════════════════
# BUILD PRESENTATION
# ═══════════════════════════════════════════════════════════════════════════
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
# ─────────────────────────────────────────────────────────────────
# SLIDE 1 – TITLE SLIDE
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, NAVY)
add_rect(slide, 0, 3.2, 13.333, 0.06, ORANGE) # divider line
add_textbox(slide, 1, 0.7, 11.333, 1.2,
"Refractive Surgery",
font_size=46, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_textbox(slide, 1, 1.9, 11.333, 0.8,
"Myopia • Hypermetropia • Astigmatism",
font_size=28, bold=False, color=LIGHT_BLUE, align=PP_ALIGN.CENTER)
add_rect(slide, 3.5, 3.4, 6.333, 0.6, TEAL)
add_textbox(slide, 3.5, 3.35, 6.333, 0.7,
"For Ophthalmology Residents",
font_size=20, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
add_textbox(slide, 1, 4.3, 11.333, 0.5,
"Based on: Kanski's Clinical Ophthalmology 10th Edition & Wills Eye Manual",
font_size=14, italic=True, color=LIGHT_BLUE, align=PP_ALIGN.CENTER)
add_textbox(slide, 1, 5.0, 11.333, 0.4,
"Department of Ophthalmology | Residency Teaching Series",
font_size=13, color=RGBColor(0xAA, 0xCC, 0xDD), align=PP_ALIGN.CENTER)
# ─────────────────────────────────────────────────────────────────
# SLIDE 2 – TABLE OF CONTENTS
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Contents", "What We Will Cover Today")
topics = [
"1. Overview & Introduction to Refractive Surgery",
"2. Optics Recap – Myopia, Hypermetropia, Astigmatism",
"3. Patient Selection & Contraindications",
"4. Preoperative Assessment",
"5. Corneal Laser Procedures – PRK / LASEK / TransPRK",
"6. LASIK – Laser-Assisted In Situ Keratomileusis",
"7. SMILE – Small Incision Lenticule Extraction",
"8. Intraocular Procedures – Phakic IOL / CLE",
"9. Correction of Hypermetropia (Special Considerations)",
"10. Complications & Management",
"11. Comparison Table & Procedure Selection",
"12. Post-Operative Care & Follow-Up",
]
for i, t in enumerate(topics):
col = 0 if i < 6 else 6.8
row = 1.6 + (i % 6) * 0.83
add_rect(slide, col + 0.3, row, 6.0, 0.65, WHITE)
add_textbox(slide, col + 0.35, row + 0.04, 5.8, 0.57, t,
font_size=14, color=NAVY, v_anchor=MSO_ANCHOR.MIDDLE)
# ─────────────────────────────────────────────────────────────────
# SLIDE 3 – OVERVIEW / INTRODUCTION
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Introduction to Refractive Surgery", "Changing the Optics of the Eye")
bullets = [
{"text": "Encompasses a range of procedures aimed at changing the refraction of the eye by altering the cornea or lens – the principal refracting components", "level": 0},
{"text": "Myopia, hypermetropia (hyperopia) and astigmatism can all be addressed", "level": 0},
{"text": "Correction of presbyopia remains inconsistently satisfactory", "level": 1},
{"text": "Targets: stable refractive error patients desiring improvement in visual acuity or function after surgical correction", "level": 0},
{"text": "NOT for everyone – thorough preoperative assessment is MANDATORY", "level": 0},
{"text": "Two broad categories of refractive surgery:", "level": 0},
{"text": "Corneal procedures – alter corneal curvature (PRK, LASIK, SMILE, RK, CK)", "level": 1},
{"text": "Intraocular procedures – alter lens power (Phakic IOL, Clear Lens Exchange)", "level": 1},
{"text": "Patient satisfaction depends critically on patient expectations and surgical outcome", "level": 0},
]
add_bullet_textbox(slide, 0.4, 1.55, 12.5, 5.7, bullets, font_size=15)
# ─────────────────────────────────────────────────────────────────
# SLIDE 4 – OPTICS RECAP
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Optics Recap – Refractive Errors", "Understanding What We Are Correcting")
# Myopia box
add_rect(slide, 0.3, 1.55, 4.0, 5.7, WHITE)
add_section_label(slide, "MYOPIA (Short-sight)", 0.3, 1.55, w=4.0)
myopia = [
{"text": "Parallel rays focus ANTERIOR to retina", "level": 0},
{"text": "Eye too long (axial) or cornea too curved", "level": 0},
{"text": "Corrected with CONCAVE (minus) lens", "level": 0},
{"text": "Prevalence – global epidemic; ~30% worldwide", "level": 0},
{"text": "Classification by magnitude:", "level": 0},
{"text": "Low: < 3 D", "level": 1},
{"text": "Moderate: 3–6 D", "level": 1},
{"text": "High: > 6 D", "level": 1},
{"text": "Surgical goal: flatten the central cornea", "level": 0},
]
add_bullet_textbox(slide, 0.3, 2.0, 4.0, 5.2, myopia, font_size=13)
# Hypermetropia box
add_rect(slide, 4.65, 1.55, 4.0, 5.7, WHITE)
add_section_label(slide, "HYPERMETROPIA (Long-sight)", 4.65, 1.55, w=4.0)
hyper = [
{"text": "Parallel rays focus POSTERIOR to retina", "level": 0},
{"text": "Eye too short or cornea too flat", "level": 0},
{"text": "Corrected with CONVEX (plus) lens", "level": 0},
{"text": "Young patients compensate by accommodation", "level": 0},
{"text": "Classification:", "level": 0},
{"text": "Low: < 2 D", "level": 1},
{"text": "Moderate: 2–5 D", "level": 1},
{"text": "High: > 5 D", "level": 1},
{"text": "Surgical goal: steepen the central cornea", "level": 0},
]
add_bullet_textbox(slide, 4.65, 2.0, 4.0, 5.2, hyper, font_size=13)
# Astigmatism box
add_rect(slide, 9.0, 1.55, 4.0, 5.7, WHITE)
add_section_label(slide, "ASTIGMATISM", 9.0, 1.55, w=4.0)
astig = [
{"text": "Non-spherical (toric) cornea – different powers in different meridia", "level": 0},
{"text": "Two types:", "level": 0},
{"text": "Regular – correctable with cylinder", "level": 1},
{"text": "Irregular – NOT correctable with cylinder", "level": 1},
{"text": "Usually coexists with myopia or hypermetropia", "level": 0},
{"text": "Surgical correction: toric ablation or arcuate incisions", "level": 0},
{"text": "Wavefront-guided ablation improves HOA correction", "level": 0},
]
add_bullet_textbox(slide, 9.0, 2.0, 4.0, 5.2, astig, font_size=13)
# ─────────────────────────────────────────────────────────────────
# SLIDE 5 – PATIENT SELECTION
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Patient Selection", "Who Is a Suitable Candidate?")
add_rect(slide, 0.3, 1.55, 6.0, 5.7, WHITE)
add_section_label(slide, "INCLUSION CRITERIA", 0.3, 1.55, w=6.0)
inc = [
{"text": "Stable refraction for ≥ 1–2 years (change < 0.5 D/year)", "level": 0},
{"text": "Age ≥ 18–21 years (cornea still changing before this)", "level": 0},
{"text": "Adequate corneal thickness – ideally > 500 µm (LASIK requires residual stromal bed ≥ 250 µm)", "level": 0},
{"text": "Motivation and realistic expectations", "level": 0},
{"text": "Spectacle/contact-lens intolerance or occupational need", "level": 0},
{"text": "No active ocular surface disease", "level": 0},
{"text": "Pupil size considerations (especially for night vision)", "level": 0},
]
add_bullet_textbox(slide, 0.3, 2.0, 6.0, 5.2, inc, font_size=14)
add_rect(slide, 6.7, 1.55, 6.3, 5.7, RGBColor(0xFF, 0xEE, 0xEE))
add_section_label(slide, "CONTRAINDICATIONS", 6.7, 1.55, w=6.3,
h=0.4)
# override color of this label
contra = [
{"text": "ABSOLUTE:", "bold": True, "level": 0},
{"text": "Keratoconus / ectatic corneal disease", "level": 1},
{"text": "Active ocular infection or inflammation", "level": 1},
{"text": "Uncontrolled glaucoma", "level": 1},
{"text": "Severe dry eye syndrome", "level": 1},
{"text": "Progressive myopia / unstable refraction", "level": 1},
{"text": "RELATIVE:", "bold": True, "level": 0},
{"text": "SLE, rheumatoid arthritis, immunocompromise", "level": 1},
{"text": "Previous herpes simplex keratitis", "level": 1},
{"text": "Macular degeneration", "level": 1},
{"text": "Chronic blepharitis", "level": 1},
{"text": "Unrealistic expectations", "level": 1},
]
add_bullet_textbox(slide, 6.7, 2.0, 6.3, 5.2, contra, font_size=13,
bullet_color=ORANGE, text_color=DARK_GREY)
# ─────────────────────────────────────────────────────────────────
# SLIDE 6 – PREOPERATIVE ASSESSMENT
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Preoperative Assessment", "Mandatory Workup Before Any Refractive Surgery")
left = [
{"text": "Full refraction (manifest + cycloplegic)", "level": 0},
{"text": "Corneal topography / tomography (Pentacam / Orbscan)", "level": 0},
{"text": "Corneal thickness (pachymetry) – central and peripheral", "level": 0},
{"text": "Pupil diameter – mesopic conditions", "level": 0},
{"text": "Anterior segment OCT – anterior chamber depth, angle", "level": 0},
{"text": "Tear film assessment – BUT, Schirmer test, OSDI score", "level": 0},
{"text": "IOP measurement (non-contact tonometry before dilation)", "level": 0},
{"text": "Dilated fundus exam – vitreoretinal status esp. in high myopia", "level": 0},
]
right = [
{"text": "Keratometry / simulated K values", "level": 0},
{"text": "Wavefront aberrometry (higher-order aberrations)", "level": 0},
{"text": "Specular microscopy (if phakic IOL planned)", "level": 0},
{"text": "Slit lamp – cornea, lens, anterior chamber depth", "level": 0},
{"text": "Medical / systemic history", "level": 0},
{"text": "Discontinue contact lenses:", "level": 0},
{"text": "Soft lenses – 2 weeks before topography", "level": 1},
{"text": "Hard/RGP lenses – 3–4 weeks before", "level": 1},
{"text": "INFORMED CONSENT – risks, alternatives, realistic outcome", "bold": True, "level": 0},
]
add_bullet_textbox(slide, 0.3, 1.55, 6.3, 5.7, left, font_size=14)
add_bullet_textbox(slide, 6.9, 1.55, 6.1, 5.7, right, font_size=14)
# ─────────────────────────────────────────────────────────────────
# SLIDE 7 – SURFACE ABLATION (PRK / LASEK / TransPRK)
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Surface Ablation Procedures", "PRK · LASEK · Epi-LASIK · TransPRK")
# Mechanism
add_section_label(slide, "MECHANISM", 0.3, 1.55, w=3.5)
mech = [
{"text": "Excimer laser (193 nm ArF) photoablates corneal stroma after epithelium removal", "level": 0},
{"text": "Each pulse removes 0.25 µm of tissue; total ablation depth depends on refractive error", "level": 0},
{"text": "Cornea flattened centrally → reduces plus power → corrects myopia", "level": 0},
{"text": "Peripheral ablation → steepen cornea → corrects hypermetropia", "level": 0},
]
add_bullet_textbox(slide, 0.3, 2.0, 6.3, 2.6, mech, font_size=13)
# Techniques
add_section_label(slide, "TECHNIQUES", 0.3, 4.7, w=3.5)
tech = [
{"text": "PRK – mechanical / alcohol epithelium removal then direct ablation", "level": 0},
{"text": "LASEK – epithelial flap preserved with 20% alcohol; replaced after ablation", "level": 0},
{"text": "Epi-LASIK – epithelial flap created with epikeratome", "level": 0},
{"text": "TransPRK (TPRK) – no-touch; laser removes epithelium + ablates stroma simultaneously", "level": 0},
]
add_bullet_textbox(slide, 0.3, 5.15, 6.3, 2.1, tech, font_size=13)
# PRK Specifics
add_rect(slide, 6.9, 1.55, 6.1, 5.7, WHITE)
add_section_label(slide, "PRK – CLINICAL DETAILS", 6.9, 1.55, w=6.1)
prk = [
{"text": "Indications – myopia up to 6 D; astigmatism up to ~3 D; low-moderate hypermetropia", "level": 0},
{"text": "Preferred when cornea is thin (inadequate for LASIK flap) or occupation at risk of flap trauma", "level": 0},
{"text": "Procedure:", "level": 0},
{"text": "Topical anaesthesia, epithelium removed over 8–9 mm zone", "level": 1},
{"text": "Excimer laser applied to Bowman + stroma", "level": 1},
{"text": "Mitomycin C 0.02% for 20–40 sec (if > 50 µm ablation) to prevent haze", "level": 1},
{"text": "BCL inserted; topical antibiotics + NSAIDs + steroids", "level": 1},
{"text": "Advantages vs LASIK – no flap complications, lower ectasia risk, suitable for thinner corneas", "level": 0},
{"text": "Disadvantages – slower recovery (3–7 days pain; vision stabilises 1–3 months), subepithelial haze, regression", "level": 0},
{"text": "Post-op haze grading: 0–4 scale; mitomycin C prophylaxis reduces incidence", "level": 0},
]
add_bullet_textbox(slide, 6.9, 2.0, 6.1, 5.2, prk, font_size=12.5)
# ─────────────────────────────────────────────────────────────────
# SLIDE 8 – LASIK PROCEDURE
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "LASIK – Laser-Assisted In Situ Keratomileusis", "Gold Standard Corneal Refractive Procedure")
add_rect(slide, 0.3, 1.55, 12.7, 5.7, WHITE)
# Steps column
add_section_label(slide, "SURGICAL STEPS", 0.3, 1.55, w=5.5)
steps = [
{"text": "STEP 1 – Create corneal flap:", "bold": True, "level": 0},
{"text": "Microkeratome (mechanical) OR femtosecond laser (IntraLASIK) – preferred", "level": 1},
{"text": "Flap thickness: 100–160 µm; hinge superiorly or nasally", "level": 1},
{"text": "STEP 2 – Lift flap; expose stroma", "bold": True, "level": 0},
{"text": "STEP 3 – Excimer laser ablation of stromal bed:", "bold": True, "level": 0},
{"text": "Central ablation → myopia correction (flatten)", "level": 1},
{"text": "Peripheral/mid-peripheral ablation → hyperopia correction (steepen)", "level": 1},
{"text": "Toric ablation for astigmatism", "level": 1},
{"text": "Wavefront-guided / topography-guided ablation available", "level": 1},
{"text": "STEP 4 – Reposition and smooth flap; self-seals within minutes", "bold": True, "level": 0},
{"text": "No sutures required; flap adheres via epithelium", "level": 1},
]
add_bullet_textbox(slide, 0.3, 2.0, 6.0, 5.2, steps, font_size=13)
# Parameters column
add_section_label(slide, "PARAMETERS & LIMITS", 6.5, 1.55, w=6.5)
params = [
{"text": "Myopia correction range: up to –10 to –12 D (depending on corneal thickness)", "level": 0},
{"text": "Hypermetropia: up to +4 D (higher corrections more regression-prone)", "level": 0},
{"text": "Astigmatism: up to 5–6 D (with toric ablation)", "level": 0},
{"text": "Residual stromal bed (RSB): MUST remain ≥ 250 µm (ectasia risk if thinner)", "level": 0},
{"text": "RSB = Preop thickness − flap thickness − ablation depth", "bold": True, "level": 1},
{"text": "Ablation zone: 6–9 mm optical zone", "level": 0},
{"text": "Advantages:", "bold": True, "level": 0},
{"text": "Rapid visual recovery (1–2 days)", "level": 1},
{"text": "Minimal post-op pain", "level": 1},
{"text": "Predictable outcomes", "level": 1},
{"text": "Disadvantages / Risks:", "bold": True, "level": 0},
{"text": "Flap complications (striae, epithelial ingrowth, free flap)", "level": 1},
{"text": "Dry eye (severed corneal nerves)", "level": 1},
{"text": "Ectasia (if RSB < 250 µm or subclinical keratoconus missed)", "level": 1},
{"text": "DLK (Diffuse Lamellar Keratitis) – 'Sands of Sahara'", "level": 1},
{"text": "Under/over-correction; regression", "level": 1},
]
add_bullet_textbox(slide, 6.5, 2.0, 6.5, 5.2, params, font_size=12.5)
# ─────────────────────────────────────────────────────────────────
# SLIDE 9 – FEMTOSECOND LASIK vs CONVENTIONAL
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Femtosecond LASIK vs Conventional LASIK", "Flap Creation Technology")
left = [
{"text": "Mechanical microkeratome (Moria M2, Hansatome):", "bold": True, "level": 0},
{"text": "Oscillating metal blade creates flap by translation across cornea under suction ring", "level": 1},
{"text": "Fast, well-established, cost-effective", "level": 1},
{"text": "Risk: irregular flap, buttonhole, free cap, epithelial defect", "level": 1},
{"text": "Flap thickness variability: ±15–20 µm", "level": 1},
]
right = [
{"text": "Femtosecond laser (IntraLase, VisuMax, WaveLight):", "bold": True, "level": 0},
{"text": "Infrared (1053 nm) laser creates photodisruption plasma at precise depth → gas-filled cleavage plane", "level": 1},
{"text": "All-laser LASIK (iLASIK) – USFDA approved for military aviators", "level": 1},
{"text": "Advantages: thinner, more precise, reproducible flap; lower risk of buttonhole/free cap", "level": 1},
{"text": "Disadvantage: slower, costlier; transient light sensitivity syndrome (TLSS)", "level": 1},
{"text": "Flap thickness variability: ±5–10 µm", "level": 1},
]
add_rect(slide, 0.3, 1.55, 6.3, 5.7, WHITE)
add_bullet_textbox(slide, 0.3, 1.55, 6.3, 5.7, left, font_size=14)
add_rect(slide, 6.9, 1.55, 6.1, 5.7, WHITE)
add_bullet_textbox(slide, 6.9, 1.55, 6.1, 5.7, right, font_size=14)
add_textbox(slide, 0.3, 7.1, 12.7, 0.35,
"KEY PRINCIPLE: Regardless of flap method – residual stromal bed ≥ 250 µm is non-negotiable to prevent ectasia.",
font_size=12, bold=True, color=ORANGE)
# ─────────────────────────────────────────────────────────────────
# SLIDE 10 – SMILE
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "SMILE – Small Incision Lenticule Extraction", "Flapless Femtosecond Refractive Surgery")
left_col = [
{"text": "Developed as an alternative to LASIK – entirely flapless", "level": 0},
{"text": "Uses VisuMax femtosecond laser ONLY (no excimer laser required)", "level": 0},
{"text": "MECHANISM:", "bold": True, "level": 0},
{"text": "Femtosecond laser creates a disc-shaped lenticule within stroma at two pre-defined depths", "level": 1},
{"text": "Second cut creates a small peripheral arc incision (2–4 mm)", "level": 1},
{"text": "Surgeon dissects and extracts lenticule through small incision", "level": 1},
{"text": "Removal of lenticule flattens cornea → corrects myopia", "level": 1},
{"text": "INDICATIONS:", "bold": True, "level": 0},
{"text": "Myopia: –1 D to –10 D", "level": 1},
{"text": "Myopic astigmatism up to –5 D", "level": 1},
{"text": "Hyperopia corrections – under investigation", "level": 1},
]
right_col = [
{"text": "ADVANTAGES over LASIK:", "bold": True, "level": 0},
{"text": "No flap – eliminates flap complications (striae, dislocation, trauma risk)", "level": 1},
{"text": "Preserves more anterior corneal stroma (biomechanically stronger)", "level": 1},
{"text": "Less dry eye – fewer corneal nerve fibres severed", "level": 1},
{"text": "Suitable for patients with thin corneas or contact sports", "level": 1},
{"text": "Better candidate for active duty military/athletes", "level": 1},
{"text": "DISADVANTAGES:", "bold": True, "level": 0},
{"text": "Limited range of correction (vs LASIK)", "level": 1},
{"text": "No wavefront-guided/topography-guided option yet in wide use", "level": 1},
{"text": "Technically demanding; lenticule extraction requires skill", "level": 1},
{"text": "Enhancement more difficult – requires surface PRK or conversion to LASIK", "level": 1},
{"text": "Longer learning curve for surgeon", "level": 1},
]
add_rect(slide, 0.3, 1.55, 6.3, 5.7, WHITE)
add_bullet_textbox(slide, 0.3, 1.55, 6.3, 5.7, left_col, font_size=13)
add_rect(slide, 6.9, 1.55, 6.1, 5.7, WHITE)
add_bullet_textbox(slide, 6.9, 1.55, 6.1, 5.7, right_col, font_size=13)
# ─────────────────────────────────────────────────────────────────
# SLIDE 11 – PHAKIC IOL
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Phakic Intraocular Lens (pIOL)", "For High Myopia – Preserving the Natural Lens")
top_note = ("Phakic IOLs correct high refractive errors that are beyond the safe limit "
"for corneal laser surgery, while PRESERVING the natural crystalline lens "
"(and hence accommodation in young patients).")
add_rect(slide, 0.3, 1.55, 12.7, 0.65, LIGHT_BLUE)
add_textbox(slide, 0.35, 1.55, 12.5, 0.65, top_note,
font_size=13, color=NAVY, v_anchor=MSO_ANCHOR.MIDDLE)
# AC Phakic IOL
add_rect(slide, 0.3, 2.3, 6.2, 4.9, WHITE)
add_section_label(slide, "ANTERIOR CHAMBER pIOL", 0.3, 2.3, w=6.2)
ac = [
{"text": "Iris-claw (Artisan/Verisyse) – clipped onto mid-iris at 3 and 9 o'clock", "level": 0},
{"text": "AC angle-supported (Baikoff type) – rests on angle structures", "level": 0},
{"text": "Power: –5 D to –25 D", "level": 0},
{"text": "Requires adequate ACD > 3.0–3.2 mm", "level": 0},
{"text": "Complications:", "level": 0},
{"text": "Endothelial cell loss (ongoing – annual monitoring)", "level": 1},
{"text": "Pupillary block glaucoma → peripheral iridotomy pre-op", "level": 1},
{"text": "Cataract formation", "level": 1},
{"text": "Oval pupil (iris claw), subluxation", "level": 1},
{"text": "Uveitis-Glaucoma-Hyphema (UGH) syndrome (angle-supported)", "level": 1},
]
add_bullet_textbox(slide, 0.3, 2.75, 6.2, 4.4, ac, font_size=13)
# PC Phakic IOL
add_rect(slide, 6.8, 2.3, 6.2, 4.9, WHITE)
add_section_label(slide, "POSTERIOR CHAMBER pIOL (ICL)", 6.8, 2.3, w=6.2)
pc = [
{"text": "ICL (Implantable Collamer Lens) – EVO/STAAR platform", "level": 0},
{"text": "Made of Collamer (porcine collagen + HEMA copolymer)", "level": 0},
{"text": "Placed BEHIND iris, ANTERIOR to crystalline lens", "level": 0},
{"text": "Supported in ciliary sulcus", "level": 0},
{"text": "Power range: –3 D to –20.5 D", "level": 0},
{"text": "ADVANTAGES – excellent visual quality, reversible, large range", "level": 0},
{"text": "Complications:", "level": 0},
{"text": "Anterior subcapsular cataract (if vault too low)", "level": 1},
{"text": "Pupillary block → pre-op laser peripheral iridotomy (or ICL with central port)", "level": 1},
{"text": "Raised IOP, endothelial cell loss, uveitis", "level": 1},
{"text": "Retinal detachment (more likely in high myopes)", "level": 1},
{"text": "EVO ICL has central aqueous port – reduces need for iridotomy", "level": 0},
]
add_bullet_textbox(slide, 6.8, 2.75, 6.2, 4.4, pc, font_size=12.5)
# ─────────────────────────────────────────────────────────────────
# SLIDE 12 – CLEAR LENS EXCHANGE / CLE
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Clear Lens Exchange (CLE) / Refractive Lens Exchange", "Replacing the Natural Lens to Correct Refraction")
left = [
{"text": "AKA Refractive Lens Exchange (RLE) – technique is identical to cataract surgery", "level": 0},
{"text": "INDICATIONS:", "bold": True, "level": 0},
{"text": "High hypermetropia (> 4–5 D) not correctable by LASIK", "level": 1},
{"text": "High myopia (> –10 D) with inadequate corneal thickness for laser", "level": 1},
{"text": "Presbyopia (with multifocal/EDOF IOL)", "level": 1},
{"text": "Age > 40 years (less loss from sacrificing accommodation)", "level": 1},
{"text": "PROCEDURE:", "bold": True, "level": 0},
{"text": "Phacoemulsification of clear crystalline lens", "level": 1},
{"text": "IOL implanted in capsular bag – monofocal, multifocal, toric or EDOF", "level": 1},
{"text": "Biometry mandatory – IOL power calculation (SRK-T, Haigis, Barrett Universal II)", "level": 1},
]
right = [
{"text": "ADVANTAGES:", "bold": True, "level": 0},
{"text": "Very accurate for high errors", "level": 1},
{"text": "Good visual results", "level": 1},
{"text": "Eliminates future cataract surgery need", "level": 1},
{"text": "DISADVANTAGES:", "bold": True, "level": 0},
{"text": "LOSS OF ACCOMMODATION (especially < 40 years) – major concern", "level": 1},
{"text": "Retinal detachment risk – significantly increased in high myopes", "level": 1},
{"text": "Posterior capsule opacification (PCO)", "level": 1},
{"text": "Cystoid macular oedema (CMO)", "level": 1},
{"text": "Endophthalmitis risk (as with any intraocular surgery)", "level": 1},
{"text": "COUNSELLING IMPORTANT – loss of accommodation must be discussed pre-op", "bold": True, "level": 0},
]
add_rect(slide, 0.3, 1.55, 6.3, 5.7, WHITE)
add_bullet_textbox(slide, 0.3, 1.55, 6.3, 5.7, left, font_size=14)
add_rect(slide, 6.9, 1.55, 6.1, 5.7, WHITE)
add_bullet_textbox(slide, 6.9, 1.55, 6.1, 5.7, right, font_size=14)
# ─────────────────────────────────────────────────────────────────
# SLIDE 13 – CORRECTION OF HYPERMETROPIA
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Correction of Hypermetropia", "Special Considerations – Steepening the Cornea")
left = [
{"text": "Surface Ablation (PRK/LASEK) – corrects low hypermetropia < 2–3 D with reasonable results", "level": 0},
{"text": "LASIK – corrects up to +4 D; higher corrections have more regression", "level": 0},
{"text": "Conductive Keratoplasty (CK):", "bold": True, "level": 0},
{"text": "Radiofrequency energy applied via thin probe into corneal periphery", "level": 1},
{"text": "Thermally shrinks stromal collagen → increases central corneal curvature", "level": 1},
{"text": "Burns placed in 1–2 concentric rings in periphery (not centre)", "level": 1},
{"text": "Corrects low-moderate hypermetropia and hyperopic astigmatism", "level": 1},
{"text": "Also used for monovision/presbyopia correction", "level": 1},
{"text": "Complications: early overcorrection, significant regression, induced astigmatism", "level": 1},
{"text": "Laser Thermal Keratoplasty (LTK) with holmium laser – now OBSOLETE", "level": 0},
]
right = [
{"text": "Why hypermetropia correction is harder than myopia:", "bold": True, "level": 0},
{"text": "Requires steepening – peripheral ablation; technically challenging to achieve uniform steepening", "level": 1},
{"text": "More regression (corneal healing flattens steepened zone)", "level": 1},
{"text": "Smaller effective optical zone; more night glare / halos", "level": 1},
{"text": "High hypermetropia (> 4–5 D) – intraocular approaches preferred:", "bold": True, "level": 0},
{"text": "Phakic IOL (anterior or posterior chamber)", "level": 1},
{"text": "Clear lens exchange with appropriate IOL", "level": 1},
{"text": "IMPORTANT: Hypermetropia corrections must account for latent hypermetropia (cycloplegic refraction essential)", "bold": True, "level": 0},
{"text": "Under-correction common if only manifest refraction used", "level": 1},
]
add_rect(slide, 0.3, 1.55, 6.3, 5.7, WHITE)
add_bullet_textbox(slide, 0.3, 1.55, 6.3, 5.7, left, font_size=13)
add_rect(slide, 6.9, 1.55, 6.1, 5.7, WHITE)
add_bullet_textbox(slide, 6.9, 1.55, 6.1, 5.7, right, font_size=13)
# ─────────────────────────────────────────────────────────────────
# SLIDE 14 – COMPARISON TABLE (via function)
# ─────────────────────────────────────────────────────────────────
headers = ["Procedure", "Myopia Range", "Hyperopia Range", "Flap", "Recovery", "Key Risk"]
rows = [
["PRK/LASEK", "Up to –6 D", "Low < 2–3 D", "No", "3–7 days pain;\n1–3 months vision", "Subepithelial haze"],
["TransPRK", "Up to –8 D", "Limited", "No (no-touch)", "Similar to PRK", "Haze if no MMC"],
["LASIK\n(Microkeratome)", "Up to –12 D", "Up to +4 D", "Yes (~110 µm)", "1–2 days", "Flap complications\nDry eye, Ectasia"],
["Femto-LASIK", "Up to –12 D", "Up to +4 D", "Yes (~90–110 µm)", "1–2 days", "TLSS; DLK"],
["SMILE", "–1 to –10 D", "Under study", "No (flapless)", "2–3 days", "Lenticule tear;\nenhancement difficult"],
["Iris-Claw pIOL", "–5 to –25 D", "Available", "No", "Days–weeks", "Endothelial loss\nPupillary block"],
["ICL (pIOL)", "–3 to –20.5 D", "Available", "No", "Days", "Cataract, RD"],
["CLE / RLE", "Any (IOL)", "Any (IOL)", "No", "Weeks", "RD in myopes\nLoss of accommodation"],
["Conductive\nKeratoplasty", "None", "Low-moderate", "No", "Days", "Regression;\nAstigmatism"],
]
slide14 = add_table_slide(prs,
"Comparison of Refractive Procedures",
"Quick Reference Guide for Procedure Selection",
headers, rows,
col_widths=[2.2, 1.6, 1.7, 1.3, 2.0, 2.1])
# ─────────────────────────────────────────────────────────────────
# SLIDE 15 – COMPLICATIONS (CORNEAL LASER)
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Complications of Corneal Laser Surgery", "Recognition & Management")
comp_data = [
("Intraoperative", [
"Flap complications – buttonhole, free cap, incomplete flap (LASIK)",
"Suction loss during flap creation → abort procedure",
"Epithelial defect – especially with CXL or RGP wearers",
"Decentred ablation",
]),
("Early Post-op (Days–Weeks)", [
"Pain / discomfort – most severe in PRK (surface ablation)",
"Diffuse Lamellar Keratitis (DLK) – 'Sands of Sahara'; grade I–IV; Rx: intensive steroids ± flap lift",
"Epithelial ingrowth under LASIK flap – islands under flap edge",
"Flap striae/folds – smoothed with hydration ± sutures if severe",
"Transient Light Sensitivity Syndrome (TLSS) – specific to femto-LASIK",
"IOP elevation from steroid use",
]),
("Late Post-op (Months–Years)", [
"Under-correction / Over-correction – may require enhancement",
"Regression – especially hyperopia corrections; natural re-steepening over time",
"Subepithelial haze (PRK) – prevented with MMC; Rx: topical steroid, PTK",
"Post-LASIK ectasia – corneal thinning + steepening; Rx: cross-linking ± scleral lens; very serious complication",
"Dry eye syndrome – severed corneal nerves; may persist > 6 months; Rx: lubricants, cyclosporin",
"Glare, halos, starbursts – related to pupil size > optical zone",
]),
]
y = 1.6
for title, items in comp_data:
add_rect(slide, 0.3, y, 12.7, 0.38, TEAL)
add_textbox(slide, 0.35, y, 12.5, 0.38, title,
font_size=14, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
y += 0.42
tb = slide.shapes.add_textbox(Inches(0.3), Inches(y), Inches(12.7), Inches(1.5))
tf = tb.text_frame
tf.word_wrap = True
first = True
for item in items:
p = tf.add_paragraph() if not first else tf.paragraphs[0]
first = False
r1 = p.add_run(); r1.text = "▸ "; r1.font.color.rgb = ORANGE; r1.font.size = Pt(12); r1.font.name = "Calibri"
r2 = p.add_run(); r2.text = item; r2.font.size = Pt(12); r2.font.color.rgb = DARK_GREY; r2.font.name = "Calibri"
y += 1.35 if title == "Early Post-op (Days–Weeks)" else (1.0 if title == "Intraoperative" else 1.3)
# ─────────────────────────────────────────────────────────────────
# SLIDE 16 – POST-LASIK ECTASIA (Special Focus)
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Post-Refractive Surgery Ectasia", "A Sight-Threatening Complication")
left = [
{"text": "Progressive corneal thinning and steepening following LASIK/PRK", "level": 0},
{"text": "Aetiology:", "bold": True, "level": 0},
{"text": "Biomechanical weakening when RSB < 250 µm", "level": 1},
{"text": "Pre-existing subclinical keratoconus (missed on topography)", "level": 1},
{"text": "Excessive ablation depth", "level": 1},
{"text": "Risk Factors:", "bold": True, "level": 0},
{"text": "Thin pre-op cornea (< 500 µm)", "level": 1},
{"text": "High myopia treated (large ablation)", "level": 1},
{"text": "Suspicious topography (inferior steepening, high I-S value)", "level": 1},
{"text": "Young age, family history of keratoconus", "level": 1},
{"text": "Thin RSB (< 250 µm)", "level": 1},
]
right = [
{"text": "Clinical Features:", "bold": True, "level": 0},
{"text": "Increasing myopia and irregular astigmatism months-years post-op", "level": 1},
{"text": "Topography shows progressive inferior steepening", "level": 1},
{"text": "Reduced BCVA, corneal thinning", "level": 1},
{"text": "Management:", "bold": True, "level": 0},
{"text": "Corneal Cross-Linking (CXL) – HALT progression; riboflavin + UVA", "level": 1},
{"text": "Intracorneal ring segments (ICRS) – Ferrara/Intacs – flattening effect", "level": 1},
{"text": "Scleral contact lenses – for visual rehabilitation", "level": 1},
{"text": "Keratoplasty (DALK or PK) if severe", "level": 1},
{"text": "PREVENTION is key:", "bold": True, "level": 0},
{"text": "Never operate on suspicious topographies", "level": 1},
{"text": "Always ensure RSB ≥ 250 µm", "level": 1},
{"text": "Use Ectasia risk score (Randleman score) pre-operatively", "level": 1},
]
add_rect(slide, 0.3, 1.55, 6.3, 5.7, WHITE)
add_bullet_textbox(slide, 0.3, 1.55, 6.3, 5.7, left, font_size=13.5)
add_rect(slide, 6.9, 1.55, 6.1, 5.7, WHITE)
add_bullet_textbox(slide, 6.9, 1.55, 6.1, 5.7, right, font_size=13.5)
# ─────────────────────────────────────────────────────────────────
# SLIDE 17 – PROCEDURE SELECTION ALGORITHM
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Procedure Selection Guide", "Which Surgery for Which Patient?")
add_rect(slide, 0.3, 1.55, 12.7, 0.6, LIGHT_BLUE)
add_textbox(slide, 0.35, 1.55, 12.5, 0.6,
"Decision framework – always individualise based on corneal thickness, error magnitude, lifestyle, and patient preference",
font_size=13, italic=True, color=NAVY, v_anchor=MSO_ANCHOR.MIDDLE)
rows2 = [
("Myopia –1 to –6 D; normal cornea > 500 µm", "→ LASIK (fem or mK) OR SMILE OR PRK",
"PRK if thin cornea or contact sport"),
("Myopia –6 to –10 D; adequate cornea", "→ Femto-LASIK OR SMILE",
"SMILE preferred if contact sport; check RSB"),
("Myopia > –10 D OR thin cornea", "→ Phakic IOL (ICL preferred) OR CLE if > 40 yrs",
"CLE loses accommodation in young patients"),
("Hypermetropia +1 to +4 D", "→ Hyperopic LASIK OR PRK (low amounts)",
"More regression; careful counselling"),
("Hypermetropia > +4 D", "→ CLE with +IOL OR AC phakic IOL",
"Cycloplegic refraction essential"),
("Astigmatism ≤ 5 D (with myopia/hyperopia)", "→ Toric ablation (LASIK/PRK) OR toric ICL",
"Topography-guided ablation preferred"),
("High myopia + dry eye", "→ SMILE or pIOL (avoid LASIK – severs more nerves)",
"LASIK worsens dry eye"),
("Thin cornea < 480 µm, any error", "→ PRK (if mild error) OR pIOL",
"AVOID LASIK/SMILE – ectasia risk"),
]
y = 2.25
for situation, proc, note in rows2:
add_rect(slide, 0.3, y, 4.5, 0.55, NAVY)
add_textbox(slide, 0.35, y, 4.4, 0.55, situation, font_size=11.5, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 4.85, y, 4.5, 0.55, TEAL)
add_textbox(slide, 4.9, y, 4.4, 0.55, proc, font_size=12, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, 9.4, y, 3.6, 0.55, WHITE)
add_textbox(slide, 9.45, y, 3.5, 0.55, note, font_size=11, color=MID_GREY, v_anchor=MSO_ANCHOR.MIDDLE, italic=True)
y += 0.62
# ─────────────────────────────────────────────────────────────────
# SLIDE 18 – POST-OPERATIVE CARE
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Post-Operative Care & Follow-Up", "Managing the Patient After Refractive Surgery")
left = [
{"text": "LASIK Post-op Protocol:", "bold": True, "level": 0},
{"text": "Day 1 – Slit lamp exam; check flap position, epithelium, IOP", "level": 1},
{"text": "Topical antibiotics – 1 week (e.g. moxifloxacin QID)", "level": 1},
{"text": "Topical steroids – 1–4 weeks (tapered)", "level": 1},
{"text": "Lubricating drops – 3–6 months minimum (nerve recovery)", "level": 1},
{"text": "Avoid rubbing eyes – risk of flap displacement", "level": 1},
{"text": "Avoid swimming / water exposure – 1–2 weeks", "level": 1},
{"text": "Shield at night – 1 week (LASIK)", "level": 1},
{"text": "PRK Post-op Protocol:", "bold": True, "level": 0},
{"text": "BCL (bandage contact lens) for 4–5 days until epithelium heals", "level": 1},
{"text": "Topical NSAID – pain control (first 3–4 days)", "level": 1},
{"text": "Steroid drops – tapered over 2–4 months (haze prevention)", "level": 1},
{"text": "Frequent lubricants essential", "level": 1},
]
right = [
{"text": "Follow-up Schedule:", "bold": True, "level": 0},
{"text": "Day 1, Day 3–5 (BCL removal PRK), Week 1, Month 1, Month 3, Month 6, Year 1", "level": 1},
{"text": "At each visit: VA (uncorrected + best corrected), refraction, IOP, slit lamp", "level": 1},
{"text": "Topography at 1, 3, 6 months – monitor for ectasia", "level": 1},
{"text": "Enhancement (retreatment):", "bold": True, "level": 0},
{"text": "Consider if residual error > 0.5–1 D after refraction stable (> 3 months)", "level": 1},
{"text": "LASIK enhancement – flap relifted (up to 5 years) or surface ablation over flap", "level": 1},
{"text": "SMILE enhancement – PRK over SMILE or LASIK conversion ('CIRCLE')", "level": 1},
{"text": "Patient Education:", "bold": True, "level": 0},
{"text": "Vision fluctuates for weeks-months – reassure", "level": 1},
{"text": "Presbyopia will develop with age regardless of surgery", "level": 1},
{"text": "Warn about night glare/halos in early period", "level": 1},
{"text": "Always carry spectacles/contact lens prescription", "level": 1},
]
add_rect(slide, 0.3, 1.55, 6.3, 5.7, WHITE)
add_bullet_textbox(slide, 0.3, 1.55, 6.3, 5.7, left, font_size=13)
add_rect(slide, 6.9, 1.55, 6.1, 5.7, WHITE)
add_bullet_textbox(slide, 6.9, 1.55, 6.1, 5.7, right, font_size=13)
# ─────────────────────────────────────────────────────────────────
# SLIDE 19 – KEY EXAM POINTS / SUMMARY
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, PALE_BG)
add_header_bar(slide, "Key Points for Residents", "High-Yield Facts & Common Exam Questions")
keypoints = [
"RSB ≥ 250 µm is the most critical safety parameter in LASIK to prevent ectasia",
"PRK preferred over LASIK: thin cornea, contact sport, previous LASIK, high ablation depth",
"SMILE: flapless, less dry eye, no excimer laser – uses VisuMax femtosecond laser only; limited to myopia currently",
"ICL power range: –3 D to –20.5 D; Collamer material; placed in ciliary sulcus; preserves accommodation",
"Conductive Keratoplasty (CK) corrects hypermetropia via peripheral RF-induced stromal shrinkage",
"Contraindications to ALL refractive surgery: keratoconus, unstable refraction, severe dry eye, uncontrolled glaucoma",
"DLK ('Sands of Sahara') – early post-LASIK complication; diffuse interface inflammation; treat with intensive topical steroids",
"MMC 0.02% for 20–40 sec applied after PRK ablation > 50 µm – prevents subepithelial haze",
"Post-refractive surgery IOL calculation: Modified refractor methods (Haigis-L, Barrett True-K, Masket formula)",
"Cycloplegic refraction essential for hypermetropia – prevents under-correction from latent hypermetropia",
"Ectasia risk: Randleman risk scoring system; suspicious topography = absolute contraindication",
"LASIK flap types: microkeratome (±15–20 µm variability) vs femtosecond laser (±5–10 µm; more precise)",
]
y = 1.6
for i, kp in enumerate(keypoints):
col = 0 if i < 6 else 6.6
row_y = 1.6 + (i % 6) * 0.93
bg = LIGHT_BLUE if i % 2 == 0 else WHITE
add_rect(slide, col + 0.3, row_y, 6.0, 0.82, bg)
num_tb = slide.shapes.add_textbox(Inches(col+0.35), Inches(row_y+0.05), Inches(0.45), Inches(0.72))
tf = num_tb.text_frame
tf.word_wrap = False
p = tf.paragraphs[0]
r = p.add_run(); r.text = f"{i+1}."; r.font.size = Pt(14); r.font.bold = True; r.font.color.rgb = TEAL; r.font.name = "Calibri"
add_textbox(slide, col+0.82, row_y+0.04, 5.4, 0.74, kp, font_size=12, color=DARK_GREY, v_anchor=MSO_ANCHOR.TOP)
# ─────────────────────────────────────────────────────────────────
# SLIDE 20 – REFERENCES
# ─────────────────────────────────────────────────────────────────
slide = prs.slides.add_slide(blank)
set_slide_bg(slide, NAVY)
add_rect(slide, 0, 0, 13.333, 1.15, NAVY)
add_textbox(slide, 0.5, 0.15, 12.333, 0.9,
"References & Further Reading",
font_size=30, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(slide, 0, 1.15, 13.333, 0.06, ORANGE)
refs = [
"1. Kanski JJ, Bowling B. Kanski's Clinical Ophthalmology: A Systematic Approach, 10th Edition. Elsevier, 2022. Chapter 8 – Corneal and Refractive Surgery.",
"2. Rapuano CJ et al. The Wills Eye Manual – Office and Emergency Room Diagnosis and Treatment of Eye Disease, 8th Edition. Wolters Kluwer, 2022.",
"3. American Academy of Ophthalmology. Basic and Clinical Science Course (BCSC), Section 13: Refractive Surgery. AAO, 2023.",
"4. Azar DT (ed). Refractive Surgery, 3rd Edition. Elsevier, 2020.",
"5. ESCRS Clinical Guidelines on Refractive Surgery. European Society of Cataract & Refractive Surgeons.",
"6. Randleman JB et al. Risk Assessment for Ectasia after Corneal Refractive Surgery. Ophthalmology 2008; 115(1): 37–50.",
"7. Reinstein DZ et al. SMILE: History, Fundamentals of a New Refractive Surgery Technique and Clinical Outcomes. Eye Vis (Lond) 2014; 1:3.",
"8. EVO Visian ICL Instructions for Use. STAAR Surgical, 2020.",
]
for i, ref in enumerate(refs):
y = 1.4 + i * 0.7
add_textbox(slide, 0.5, y, 12.333, 0.65, ref,
font_size=12, color=LIGHT_BLUE if i % 2 == 0 else WHITE, italic=(i % 2 == 0))
# ─────────────────────────────────────────────────────────────────
# SAVE
# ─────────────────────────────────────────────────────────────────
out_path = "/tmp/workspace/refractive-surgery-ppt/Refractive_Surgery_Ophthalmology_Residents.pptx"
buf = BytesIO()
prs.save(buf)
with open(out_path, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {out_path}")
print(f"Total slides: {len(prs.slides)}")