varus derotation osteotomy
varus derotation osteotomy hip pediatric cerebral palsy

This series of three anteroposterior radiographs documents the surgical management and progression of hip subluxation in an 8-year-old female patient with cerebral palsy (GMFCS level V). Image A (preoperative) demonstrates severe lateral and superior subluxation of the left femoral head relative to the dysplastic acetabulum, characterized by a Migration Percentage (MP) of 74%. Image B, captured 6 weeks postoperatively, shows significant improvement in femoral head coverage and joint congruency following a combined femoral varus derotation osteotomy (VDRO) and Dega-type pelvic osteotomy. Orthopedic hardware, specifically a locked compression plate with multiple screws, is visible providing internal fixation on the proximal femur. Image C, taken 2.9 years postoperatively, illustrates a clinical relapse of the hip subluxation (MP 51%). The femoral head has migrated laterally despite the continued presence of the surgical hardware, indicating loss of correction over time. This comparison highlights the challenges of maintaining hip stability in non-ambulatory pediatric patients with neuromuscular conditions.

This composite diagnostic image features two anteroposterior (AP) pelvic radiographs of a pediatric patient, illustrating preoperative and postoperative states of neuromuscular hip dysplasia secondary to cerebral palsy. Image (a) demonstrates a complete dislocation of the left hip joint. Key radiographic findings include a shallow, dysplastic acetabulum with inadequate superior coverage and a high-riding femoral head. The proximal femur shows a significant valgus deformity (coxa valga). Image (b) displays the results of surgical reconstruction. The left hip is now reduced, with the femoral head centered within the acetabulum. Surgical hardware, including an orthopedic plate and screws, is visible on the proximal femur, indicating a varus derotation osteotomy (VDRO) used to correct the femoral alignment. Structural changes in the ilium above the acetabulum are consistent with a pelvic osteotomy (Dega type) to improve acetabular depth and coverage. These images serve as an educational example of complex hip reconstruction in pediatric orthopedic surgery.

This sequence of three anteroposterior (AP) pelvic radiographs illustrates the longitudinal management of hip dysplasia in a pediatric patient with Gross Motor Function Classification System (GMFCS) level V. Image A (Preoperative): Shows severe bilateral hip subluxation, more pronounced on the right, where the femoral head is laterally displaced with a high migration percentage (MP 67%), indicating significant lack of acetabular coverage. Image B (1-Day Postoperative): Demonstrates immediate results following a combined right-sided femoral varus derotation shortening osteotomy (VDSO) and Dega pelvic osteotomy. A pediatric locked compression plate (LCP) and multiple screws fix the proximal femur. The pelvic osteotomy site is visible as an open wedge containing a bone graft, effectively increasing femoral head coverage. Image C (7.4-Year Follow-up): Shows the long-term outcomes at age 14.4. There is successful remodeling and consolidation of the pelvic osteotomy site. The right hip maintains improved stability (MP 19%) with the orthopedic hardware still in situ. The left hip shows complete coverage (MP 0%). This sequence highlights the efficacy of combined bony procedures for hip stabilization in non-ambulatory cerebral palsy patients.

A series of six anteroposterior (AP) pelvic radiographs demonstrating a comparison of pre-operative and post-operative status following a Varus Derotation Osteotomy (VDRO) for neuromuscular hip dysplasia. Images A, B, and C show the pre-operative baseline where bilateral coxa valga and subluxation of the femoral heads are present; quantitative measurements include the migration percentage (MP) in A, the acetabular index (AI) in B, and the anatomical medial proximal femoral angle (aMPFA) in C. Images D, E, and F show the post-operative outcomes using the same measurement techniques. Visible surgical changes include bilateral proximal femoral plates and screws used for internal fixation. Post-operative views demonstrate improved coverage of the femoral heads within the acetabula, correction of the femoral neck-shaft angle to a more varus orientation, and stabilization of the hip joint. The content illustrates the radiographic assessment of hip dysplasia progression and surgical correction in the context of cerebral palsy management.
varus derotation osteotomy hip outcomes
femoral varus osteotomy hip dysplasia cerebral palsy
| Deformity | Normal | Pathological |
|---|---|---|
| Neck-shaft angle (NSA) | ~130° (child) | Coxa valga: >145° |
| Femoral anteversion | 10-15° (adult) | Increased anteversion: >40° |
| Procedure | Purpose |
|---|---|
| Adductor ± psoas release | Relieve deforming muscle forces |
| Open reduction (capsulorraphy) | Required if MP >70% |
| Dega osteotomy | Correct posterosuperior acetabular deficiency (most common pattern in CP) |
| Salter / Pemberton osteotomy | For anterior/lateral deficiency (must match to deficiency site) |
| Femoral shortening | Reduces compression on femoral head after reduction |
Caution: Careful matching of acetabular osteotomy to the area of deficiency is essential. A Salter osteotomy redirects the acetabulum posterolaterally; if done in a patient with posterior deficiency, it can worsen femoral head uncovering. CT morphometry best identifies the location of acetabular deficiency.
| Measurement | Purpose | Threshold for VDRO |
|---|---|---|
| Migration Percentage (MP) | Femoral head uncovering | >40-60% |
| Neck-Shaft Angle (NSA) | Coxa valga | >145° in older children |
| Acetabular Index (AI) | Acetabular dysplasia | >25° may need pelvic osteotomy |
| Center-Edge Angle (CEA) | Lateral head coverage | <20° = deficient |
| Femoral anteversion | Rotation deformity | >40° usually |



video
varus derotation osteotomy VDRO surgical technique video YouTube
give this topic in ppt
python /tmp/skills/shared/scripts/fetch_images.py \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_33b8d5994daea390c368e7d4e10db0715fee1f75a8d6ec50cda935015f4622.jpg" \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_01a30c4fc922064ed9b7ef47cf9bbbe34f7626e041c64ff76e7535e263ee7984.jpg" \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_e961e139f64ea50135517299874c828f59a9e3178e3565b5740b04a38f252d2e.jpg" \ "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_a8d62e00f9596ddfe2ef01546be20160560418319209076a31e046eec8364ed4.jpg" 2>&1 | head -5
cat << 'PYEOF' > /tmp/build_vdro.py import sys, base64, io, os, urllib.request, urllib.error from pptx import Presentation from pptx.util import Inches, Pt, Emu from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN from pptx.util import Inches, Pt import pptx.oxml.ns as nsmap from lxml import etree # ── Colour palette ────────────────────────────────────────────────────────── NAVY = RGBColor(0x0D, 0x2B, 0x55) # deep navy MID_BLUE = RGBColor(0x1A, 0x5E, 0x9A) # medium blue LIGHT_BLUE = RGBColor(0xD6, 0xE8, 0xF7) # very light blue GOLD = RGBColor(0xC8, 0x9B, 0x2E) # accent gold WHITE = RGBColor(0xFF, 0xFF, 0xFF) DARK_GRAY = RGBColor(0x2E, 0x2E, 0x2E) MED_GRAY = RGBColor(0x5A, 0x5A, 0x5A) LIGHT_GRAY = RGBColor(0xF2, 0xF4, 0xF6) RED_ACCENT = RGBColor(0xC0, 0x39, 0x2B) GREEN_ACC = RGBColor(0x1E, 0x7A, 0x4A) W = Inches(13.333) H = Inches(7.5) prs = Presentation() prs.slide_width = W prs.slide_height = H blank = prs.slide_layouts[6] # ── Image fetch helper ─────────────────────────────────────────────────────── IMG_CACHE = {} def fetch_img(url): if url in IMG_CACHE: return IMG_CACHE[url] try: req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) data = urllib.request.urlopen(req, timeout=15).read() IMG_CACHE[url] = io.BytesIO(data) return IMG_CACHE[url] except Exception as e: print(f"[WARN] Could not fetch {url}: {e}") return None IMG1 = "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_01a30c4fc922064ed9b7ef47cf9bbbe34f7626e041c64ff76e7535e263ee7984.jpg" IMG2 = "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_e961e139f64ea50135517299874c828f59a9e3178e3565b5740b04a38f252d2e.jpg" IMG3 = "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_a8d62e00f9596ddfe2ef01546be20160560418319209076a31e046eec8364ed4.jpg" # ── Drawing helpers ────────────────────────────────────────────────────────── def bg(slide, color): fill = slide.background.fill fill.solid() fill.fore_color.rgb = color def rect(slide, l, t, w, h, color, radius=False): shape = slide.shapes.add_shape(1, l, t, w, h) shape.fill.solid(); shape.fill.fore_color.rgb = color shape.line.fill.background() return shape def txbox(slide, text, l, t, w, h, size=18, bold=False, color=WHITE, align=PP_ALIGN.LEFT, wrap=True, italic=False): tb = slide.shapes.add_textbox(l, t, w, h) tf = tb.text_frame; tf.word_wrap = wrap p = tf.paragraphs[0]; p.alignment = align run = p.add_run(); run.text = text run.font.size = Pt(size); run.font.bold = bold run.font.color.rgb = color; run.font.italic = italic return tb def header_bar(slide, title, subtitle=None): rect(slide, 0, 0, W, Inches(1.1), NAVY) rect(slide, 0, Inches(1.1), W, Inches(0.05), GOLD) txbox(slide, title, Inches(0.35), Inches(0.1), Inches(12), Inches(0.7), size=28, bold=True, color=WHITE) if subtitle: txbox(slide, subtitle, Inches(0.35), Inches(0.72), Inches(12), Inches(0.35), size=15, bold=False, color=LIGHT_BLUE) def bullet_box(slide, items, l, t, w, h, size=16, title=None, title_color=NAVY, text_color=DARK_GRAY, bullet=" • ", bg_color=None): if bg_color: rect(slide, l, t, w, h, bg_color) tb = slide.shapes.add_textbox(l + Inches(0.1), t + Inches(0.05), w - Inches(0.2), h - Inches(0.1)) tf = tb.text_frame; tf.word_wrap = True first = True if title: p = tf.paragraphs[0] if first else tf.add_paragraph() p.alignment = PP_ALIGN.LEFT r = p.add_run(); r.text = title r.font.size = Pt(size + 2); r.font.bold = True; r.font.color.rgb = title_color first = False for item in items: p = tf.add_paragraph() if not first else tf.paragraphs[0] p.alignment = PP_ALIGN.LEFT r = p.add_run(); r.text = f"{bullet}{item}" r.font.size = Pt(size); r.font.color.rgb = text_color first = False def add_table(slide, headers, rows, l, t, w, h, hdr_bg=NAVY, hdr_fg=WHITE, row1_bg=LIGHT_BLUE, row2_bg=WHITE, cell_color=DARK_GRAY, font_size=14): n_cols = len(headers); n_rows = len(rows) + 1 tbl = slide.shapes.add_table(n_rows, n_cols, l, t, w, h).table col_w = int(w / n_cols) for i, c in enumerate(tbl.columns): c.width = col_w def cell_set(cell, txt, bg, fg, bold=False, sz=None): 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(txt) r.font.bold = bold; r.font.color.rgb = fg r.font.size = Pt(sz or font_size) for j, h_txt in enumerate(headers): cell_set(tbl.cell(0, j), h_txt, hdr_bg, hdr_fg, bold=True, sz=font_size+1) for i, row in enumerate(rows): bg_c = row1_bg if i % 2 == 0 else row2_bg for j, val in enumerate(row): cell_set(tbl.cell(i + 1, j), val, bg_c, cell_color, sz=font_size) return tbl def safe_img(slide, url, l, t, w, h): buf = fetch_img(url) if buf: buf.seek(0) slide.shapes.add_picture(buf, l, t, w, h) return True return False def footer(slide, text="VDRO — Varus Derotation Osteotomy | Orthopaedic Surgery"): rect(slide, 0, H - Inches(0.28), W, Inches(0.28), NAVY) txbox(slide, text, Inches(0.3), H - Inches(0.27), Inches(10), Inches(0.26), size=9, color=RGBColor(0xAA, 0xCC, 0xEE), align=PP_ALIGN.LEFT) txbox(slide, "Confidential – Educational Use Only", Inches(10.5), H - Inches(0.27), Inches(2.5), Inches(0.26), size=9, color=RGBColor(0xAA, 0xCC, 0xEE), align=PP_ALIGN.RIGHT) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 1 – Title # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, NAVY) # Gold accent bar left rect(s, 0, 0, Inches(0.25), H, GOLD) # Light bg panel right rect(s, Inches(0.25), 0, W - Inches(0.25), H, NAVY) # Blue decorative box rect(s, Inches(7.5), Inches(1.8), Inches(5.5), Inches(4.2), MID_BLUE) txbox(s, "VARUS DEROTATION OSTEOTOMY", Inches(0.7), Inches(1.4), Inches(7.2), Inches(1.1), size=36, bold=True, color=WHITE) txbox(s, "VDRO", Inches(0.7), Inches(2.45), Inches(5), Inches(0.65), size=42, bold=True, color=GOLD) txbox(s, "Proximal Femoral Corrective Surgery", Inches(0.7), Inches(3.1), Inches(7), Inches(0.5), size=20, color=LIGHT_BLUE) txbox(s, "A comprehensive review of indications, surgical technique,\ncombined procedures, complications, and outcomes", Inches(0.7), Inches(3.7), Inches(6.8), Inches(0.9), size=14, color=RGBColor(0xCC,0xDD,0xEE)) # Right panel content txbox(s, "Key Topics", Inches(7.7), Inches(2.0), Inches(4.8), Inches(0.4), size=16, bold=True, color=GOLD) topics = ["Definition & Pathological Basis","Indications & Treatment Algorithm", "Surgical Technique","Combined Procedures", "Complications & Outcomes","Radiographic Assessment", "Postoperative Care"] for i, tp in enumerate(topics): txbox(s, f" {i+1}. {tp}", Inches(7.7), Inches(2.45 + i*0.48), Inches(4.9), Inches(0.45), size=13, color=WHITE) txbox(s, "Source: Campbell's Operative Orthopaedics 15e (2026)\n Miller's Review of Orthopaedics 9e", Inches(0.7), Inches(6.5), Inches(8), Inches(0.6), size=11, color=RGBColor(0x88,0xAA,0xCC), italic=True) footer(s) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 2 – Definition & Concept # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s, "Definition & Concept", "What is VDRO?") rect(s, 0, Inches(1.15), W, H - Inches(1.15), LIGHT_GRAY) # Left column rect(s, Inches(0.3), Inches(1.5), Inches(6.2), Inches(1.0), NAVY) txbox(s, "VDRO Definition", Inches(0.4), Inches(1.55), Inches(6), Inches(0.35), size=16, bold=True, color=WHITE) txbox(s, "Varus Derotation Osteotomy (VDRO) is a proximal femoral osteotomy that simultaneously corrects " "coxa valga (excessive neck-shaft angle) and increased femoral anteversion by cutting the femur " "below the lesser trochanter and repositioning the femoral head into the acetabulum.", Inches(0.3), Inches(2.55), Inches(6.2), Inches(1.1), size=14, color=DARK_GRAY, wrap=True) # Two concept boxes rect(s, Inches(0.3), Inches(3.7), Inches(2.95), Inches(1.5), MID_BLUE) txbox(s, "VARUS Component", Inches(0.4), Inches(3.78), Inches(2.7), Inches(0.35), size=13, bold=True, color=WHITE) txbox(s, "Reduces the neck-shaft angle (NSA)\nTarget: ~120° (ambulatory)\n~100–110° (non-ambulatory)", Inches(0.4), Inches(4.12), Inches(2.7), Inches(0.95), size=12, color=WHITE) rect(s, Inches(3.45), Inches(3.7), Inches(3.05), Inches(1.5), MID_BLUE) txbox(s, "DEROTATION Component", Inches(3.55), Inches(3.78), Inches(2.8), Inches(0.35), size=13, bold=True, color=WHITE) txbox(s, "Corrects femoral anteversion\nNormal: 15–20°\nCP/DDH: may exceed 40–50°", Inches(3.55), Inches(4.12), Inches(2.8), Inches(0.95), size=12, color=WHITE) rect(s, Inches(0.3), Inches(5.3), Inches(6.2), Inches(0.65), LIGHT_BLUE) txbox(s, "Primary Goal: Restore stable, concentric hip joint and prevent progressive subluxation / dislocation", Inches(0.4), Inches(5.35), Inches(6.0), Inches(0.55), size=13, bold=False, color=NAVY) # Right column – normal vs pathological table txbox(s, "Normal vs Pathological Values", Inches(7.0), Inches(1.55), Inches(6.0), Inches(0.4), size=15, bold=True, color=NAVY) add_table(s, ["Parameter", "Normal", "Pathological (CP)"], [["Neck-Shaft Angle (NSA)", "120–135°", "> 150° (coxa valga)"], ["Femoral Anteversion", "15–20°", "> 40–50°"], ["Migration Percentage", "< 30%", "> 40–60% (intervention)"], ["Acetabular Index", "< 25°", "> 25–30°"], ["CE Angle (Wiberg)", "> 25°", "< 20° (dysplastic)"]], Inches(7.0), Inches(2.0), Inches(6.0), Inches(2.8), font_size=13) rect(s, Inches(7.0), Inches(4.9), Inches(6.0), Inches(1.55), RGBColor(0xE8, 0xF4, 0xFB)) txbox(s, "Osteotomy Level", Inches(7.1), Inches(4.95), Inches(5.8), Inches(0.35), size=14, bold=True, color=NAVY) txbox(s, "The osteotomy is performed in the proximal femoral metaphysis, typically at the level " "of or just below the lesser trochanter. Fixation is achieved with a blade plate or " "paediatric hip screw system (LCP/blade plate).", Inches(7.1), Inches(5.3), Inches(5.8), Inches(1.0), size=13, color=DARK_GRAY) footer(s) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 3 – Pathological Basis # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s, "Pathological Basis", "Why does the hip dislocate in Cerebral Palsy?") rect(s, 0, Inches(1.15), W, H - Inches(1.15), LIGHT_GRAY) # Mechanism chain rect(s, Inches(0.3), Inches(1.4), Inches(12.7), Inches(1.5), RGBColor(0xE0,0xEE,0xF8)) txbox(s, "Pathomechanism of CP Hip Displacement", Inches(0.4), Inches(1.42), Inches(12), Inches(0.38), size=15, bold=True, color=NAVY) chain = ["Spastic adductors &\nilipsoas", "→", "Sustained valgus force\non proximal femur", "→", "Progressive coxa valga\n+ anteversion", "→", "Femoral head\nsubluxation/dislocation"] x_pos = [0.35, 2.55, 2.95, 5.35, 5.75, 8.35, 8.75] for i, item in enumerate(chain): col = MID_BLUE if i % 2 == 0 else GOLD bold = i % 2 == 0 txbox(s, item, Inches(x_pos[i]), Inches(1.8), Inches(2.1) if i % 2 == 0 else Inches(0.35), Inches(1.0), size=13 if i % 2 == 0 else 18, bold=bold, color=DARK_GRAY if i % 2 == 0 else GOLD, align=PP_ALIGN.CENTER if i % 2 == 0 else PP_ALIGN.CENTER) # Three-column boxes cols = [ ("Muscle Imbalance", NAVY, [ "Spastic hip adductors", "Spastic iliopsoas flexors", "Weak hip abductors (gluteus medius)", "Increased femoral head contact pressure", "Progressive migration over years"]), ("Bony Changes", MID_BLUE, [ "Coxa valga (NSA > 150°)", "Increased anteversion (> 40°)", "Acetabular dysplasia (secondary)", "Posterosuperior acetabular deficiency", "Loss of spherical femoral head"]), ("Risk by GMFCS Level", RED_ACCENT, [ "GMFCS I: ~0% dislocation risk", "GMFCS II: ~5% dislocation risk", "GMFCS III: ~20% dislocation risk", "GMFCS IV: ~40% dislocation risk", "GMFCS V: ~60–70% dislocation risk"]) ] for ci, (ttl, col_c, items) in enumerate(cols): x = Inches(0.3 + ci * 4.35) rect(s, x, Inches(2.95), Inches(4.1), Inches(0.48), col_c) txbox(s, ttl, x + Inches(0.1), Inches(2.98), Inches(3.9), Inches(0.42), size=14, bold=True, color=WHITE) for ii, it in enumerate(items): bullet_col = DARK_GRAY txbox(s, f"• {it}", x + Inches(0.1), Inches(3.5 + ii * 0.42), Inches(3.9), Inches(0.4), size=13, color=bullet_col) # Migration % definition rect(s, Inches(0.3), Inches(5.8), Inches(12.7), Inches(0.85), RGBColor(0xFF,0xF3,0xCD)) txbox(s, "Migration Percentage (MP) / Reimers Index:", Inches(0.4), Inches(5.82), Inches(5), Inches(0.38), size=13, bold=True, color=NAVY) txbox(s, "Percentage of femoral head lateral to Hilgenreiner's perpendicular line. MP > 33% = subluxation; " "MP > 40–60% = surgical threshold; MP = 100% = complete dislocation.", Inches(5.3), Inches(5.82), Inches(7.6), Inches(0.75), size=13, color=DARK_GRAY) footer(s) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 4 – Indications Overview # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s, "Indications for VDRO", "Conditions requiring proximal femoral varus derotation osteotomy") rect(s, 0, Inches(1.15), W, H - Inches(1.15), LIGHT_GRAY) add_table(s, ["Condition", "Specific Indication", "Key Threshold / Goal"], [["Cerebral Palsy (PRIMARY)", "Hip subluxation/dislocation, MP 40–60%", "NSA → 120°, correct anteversion"], ["Developmental Dysplasia (DDH)", "Residual coxa valga after reduction", "NSA → 125°, derotate if AVN"], ["Legg-Calvé-Perthes (LCPD)", "Hinge abduction, containment failure", "Improve containment, reduce impingement"], ["Paralytic Hip (Spina Bifida)", "Flaccid paralysis with progressive sublux", "Stabilize hip biomechanics"], ["Neuromuscular (Spinal Muscular Atrophy)", "Progressive hip dysplasia, non-ambulatory", "Prevent painful dislocation"], ["Post-AVN Deformity", "Coxa magna with secondary impingement", "Restore clearance, reduce pain"], ["Skeletal Dysplasia", "Coxa valga causing instability", "NSA reduction, improve gait"]], Inches(0.3), Inches(1.5), Inches(12.7), Inches(3.5), font_size=13) # Legend boxes rect(s, Inches(0.3), Inches(5.1), Inches(4.1), Inches(0.65), RGBColor(0xD6,0xE8,0xF7)) txbox(s, "PRIMARY Indication", Inches(0.4), Inches(5.12), Inches(3.9), Inches(0.32), size=13, bold=True, color=NAVY) txbox(s, "Cerebral palsy accounts for the vast majority of VDROs performed worldwide", Inches(0.4), Inches(5.42), Inches(3.9), Inches(0.3), size=11, color=DARK_GRAY) rect(s, Inches(4.55), Inches(5.1), Inches(4.1), Inches(0.65), RGBColor(0xD6,0xE8,0xF7)) txbox(s, "Timing", Inches(4.65), Inches(5.12), Inches(3.9), Inches(0.32), size=13, bold=True, color=NAVY) txbox(s, "Best outcomes when performed before age 8; before MP exceeds 70%", Inches(4.65), Inches(5.42), Inches(3.9), Inches(0.3), size=11, color=DARK_GRAY) rect(s, Inches(8.8), Inches(5.1), Inches(4.2), Inches(0.65), RGBColor(0xD6,0xE8,0xF7)) txbox(s, "Combined Approach", Inches(8.9), Inches(5.12), Inches(4.0), Inches(0.32), size=13, bold=True, color=NAVY) txbox(s, "VDRO alone insufficient in ~40% of cases; pelvic osteotomy often required", Inches(8.9), Inches(5.42), Inches(4.0), Inches(0.3), size=11, color=DARK_GRAY) # CP-specific notes rect(s, Inches(0.3), Inches(5.88), Inches(12.7), Inches(0.85), RGBColor(0xFF,0xF3,0xCD)) txbox(s, "CP Indication Thresholds:", Inches(0.4), Inches(5.9), Inches(2.5), Inches(0.38), size=13, bold=True, color=NAVY) txbox(s, "MP 40–60% + progressive displacement → VDRO + adductor/psoas release | " "MP > 60–70% → Add pelvic osteotomy (Dega preferred) | " "Established dislocation → Open reduction + VDRO + Pelvic osteotomy", Inches(2.9), Inches(5.9), Inches(10), Inches(0.75), size=12, color=DARK_GRAY) footer(s) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 5 – CP Indications (Deep Dive) # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s, "VDRO in Cerebral Palsy — Primary Indication", "Risk stratification, surveillance, and surgical thresholds") rect(s, 0, Inches(1.15), W, H - Inches(1.15), LIGHT_GRAY) # Left: GMFCS surveillance table txbox(s, "GMFCS-Based Surveillance Protocol", Inches(0.3), Inches(1.4), Inches(6.0), Inches(0.4), size=14, bold=True, color=NAVY) add_table(s, ["GMFCS", "Hip Disl. Risk", "Radiograph Frequency"], [["I–II", "< 5%", "Age 2, then as needed"], ["III", "~20%", "Every 12 months"], ["IV", "~40%", "Every 6–12 months"], ["V", "60–70%","Every 6 months"]], Inches(0.3), Inches(1.85), Inches(5.8), Inches(2.4), font_size=14) # Right: Migration % flowchart table txbox(s, "Treatment Algorithm — Migration Percentage (MP)", Inches(6.4), Inches(1.4), Inches(6.5), Inches(0.4), size=14, bold=True, color=NAVY) add_table(s, ["MP", "Classification", "Recommended Treatment"], [["< 30%", "Normal", "Surveillance only"], ["30–40%", "Early sublux", "Physiotherapy, botox, soft tissue"], ["40–60%", "Subluxation", "VDRO ± adductor/psoas release"], ["60–70%", "Severe sublux", "VDRO + pelvic osteotomy (Dega)"], ["> 70%", "Dislocation", "Open reduction + VDRO + pelvic"], ["MP = 100%", "Complete disl.", "Salvage or reconstruction"]], Inches(6.4), Inches(1.85), Inches(6.6), Inches(2.9), font_size=13) # Bottom: Age/risk factors rect(s, Inches(0.3), Inches(4.35), Inches(5.8), Inches(0.42), MID_BLUE) txbox(s, "Risk Factors for Failure / Recurrence", Inches(0.4), Inches(4.37), Inches(5.6), Inches(0.38), size=14, bold=True, color=WHITE) risks = ["Age < 6 years at time of VDRO", "Preoperative MP > 70%", "Acetabular index > 25° (acetabular dysplasia)", "GMFCS IV–V (non-ambulatory, severe spasticity)", "Failure to perform pelvic osteotomy when indicated"] for i, r in enumerate(risks): txbox(s, f" ✗ {r}", Inches(0.35), Inches(4.85 + i * 0.38), Inches(5.8), Inches(0.36), size=13, color=RED_ACCENT) rect(s, Inches(6.4), Inches(4.85), Inches(6.6), Inches(0.42), GREEN_ACC) txbox(s, "Outcome Statistics", Inches(6.5), Inches(4.87), Inches(6.4), Inches(0.38), size=14, bold=True, color=WHITE) outcomes = [ "84% effective at preventing redislocation (combined approach)", "95% good/excellent results at 7-year follow-up (VDRO + Dega)", "Adductor/psoas release: performed in ~80% of cases concurrently", "Resubuxation rate: ~15% when MP was >70% preoperatively", "Best results: age 6–10, MP 40–70%, GMFCS III–IV" ] for i, o in enumerate(outcomes): txbox(s, f" ✓ {o}", Inches(6.4), Inches(5.35 + i * 0.38), Inches(6.6), Inches(0.36), size=13, color=GREEN_ACC) footer(s) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 6 – Surgical Technique # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s, "Surgical Technique", "Step-by-step VDRO procedure") rect(s, 0, Inches(1.15), W, H - Inches(1.15), LIGHT_GRAY) steps = [ ("1. Positioning", "Supine on radiolucent table with image intensifier. Affected limb draped free for intraoperative fluoroscopy."), ("2. Approach", "Lateral approach to proximal femur. Incision from greater trochanter distally ~8–10 cm."), ("3. Exposure", "Reflect vastus lateralis anteriorly. Expose proximal femur subperiosteally. Identify lesser trochanter."), ("4. Pre-cut planning", "Fluoroscopic templating. Mark osteotomy site at or just below lesser trochanter. Plan varus correction to target NSA ~120°."), ("5. Osteotomy", "Transverse or oblique cut with oscillating saw. Remove medialisation wedge for varus correction."), ("6. Derotation", "Rotate distal fragment internally 20–40° (depending on preoperative anteversion measurement). Check with fluoroscopy — patella should face forward."), ("7. Fixation", "Blade plate (90° or 100°) or locking compression plate (LCP-Paediatric Hip Plate). Ensure stable purchase in proximal fragment."), ("8. Shortening", "Optional — 1–2 cm femoral shortening may reduce pressure on femoral head if significant displacement."), ("9. Closure", "Layer closure over drain. Restore vastus lateralis over plate."), ("10. Casting", "Hip spica cast (45° flexion, 30° abduction) applied under GA. Maintained 4–6 weeks postoperatively."), ] col_mid = Inches(6.6) for i, (step, detail) in enumerate(steps): col = 0 if i < 5 else 1 row = i if i < 5 else i - 5 x = Inches(0.25) if col == 0 else col_mid y = Inches(1.5 + row * 1.08) rect(s, x, y, Inches(6.2), Inches(0.98), RGBColor(0xE8,0xF1,0xFB)) rect(s, x, y, Inches(2.0), Inches(0.98), NAVY) txbox(s, step, x + Inches(0.05), y + Inches(0.08), Inches(1.85), Inches(0.82), size=12, bold=True, color=WHITE, align=PP_ALIGN.LEFT) txbox(s, detail, x + Inches(2.1), y + Inches(0.08), Inches(4.0), Inches(0.82), size=12, color=DARK_GRAY, wrap=True) footer(s) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 7 – Combined Procedures # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s, "Combined Procedures with VDRO", "VDRO is rarely performed in isolation — adjunct procedures improve outcomes") rect(s, 0, Inches(1.15), W, H - Inches(1.15), LIGHT_GRAY) add_table(s, ["Procedure", "Indication", "Technique / Notes", "Evidence Level"], [["Adductor Release\n(Adductor longus ± gracilis)", "MP 30–60%, spastic adductors", "Percutaneous or open tenotomy; often first step", "Level II–III"], ["Iliopsoas Release", "Hip flexion contracture > 30°", "Intramuscular recession or tendon lengthening", "Level II–III"], ["Dega Pelvic Osteotomy\n(PREFERRED for CP)", "MP > 60%, posterosuperior acetabular deficiency", "Incomplete transiliac osteotomy; rotates acetabulum anterolaterally", "Level II"], ["Salter Innominate Osteotomy", "Young child, AP deficiency, DDH", "Complete innominate cut; rotation on pubic symphysis", "Level II"], ["Pemberton Osteotomy", "Severe global dysplasia, mobile cartilage", "Perichondrial osteotomy through triradiate cartilage", "Level III"], ["San Diego (Shelf) Procedure", "Adolescent, inadequate coverage", "Extraarticular bone graft shelf above acetabulum", "Level III"], ["Open Reduction", "Established dislocation (MP = 100%)", "Medial or anterior approach; capsulorrhaphy", "Level II"], ["Femoral Shortening", "Significant head displacement, AVN risk", "Combined with VDRO; 1–2 cm shortening", "Level III"]], Inches(0.25), Inches(1.5), Inches(12.85), Inches(4.4), font_size=12) rect(s, Inches(0.25), Inches(6.0), Inches(12.85), Inches(0.6), RGBColor(0xFFF3CD)) txbox(s, "KEY POINT: The Dega pelvic osteotomy is the preferred pelvic procedure for CP due to the characteristic posterosuperior " "acetabular deficiency in these patients. Combined VDRO + Dega + soft tissue release yields 95% good results at 7 years.", Inches(0.35), Inches(6.02), Inches(12.6), Inches(0.55), size=13, color=NAVY) footer(s) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 8 – Radiographic Images # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, RGBColor(0x10,0x18,0x2A)) header_bar(s, "Clinical Radiographs", "Pre- and postoperative imaging in VDRO") rect(s, 0, Inches(1.05), W, Inches(0.08), GOLD) # Image 1 – IMG1 (pre/post VDRO + Dega with LCP) ok1 = safe_img(s, IMG1, Inches(0.2), Inches(1.25), Inches(4.2), Inches(3.3)) rect(s, Inches(0.2), Inches(4.55), Inches(4.2), Inches(0.65), NAVY) txbox(s, "Fig 1: AP Pelvis — VDRO + Dega Osteotomy\nPre-op subluxation → Post-op concentric reduction with LCP fixation", Inches(0.3), Inches(4.57), Inches(4.0), Inches(0.6), size=11, color=WHITE) # Image 2 – IMG2 (longitudinal series GMFCS V) ok2 = safe_img(s, IMG2, Inches(4.55), Inches(1.25), Inches(4.2), Inches(3.3)) rect(s, Inches(4.55), Inches(4.55), Inches(4.2), Inches(0.65), NAVY) txbox(s, "Fig 2: Longitudinal Series — GMFCS V\nPre-op, 1-day post-op, 7.4-year follow-up. MP improved 67% → 19%", Inches(4.65), Inches(4.57), Inches(4.0), Inches(0.6), size=11, color=WHITE) # Image 3 – IMG3 (8 yr old CP, relapse) ok3 = safe_img(s, IMG3, Inches(8.9), Inches(1.25), Inches(4.2), Inches(3.3)) rect(s, Inches(8.9), Inches(4.55), Inches(4.2), Inches(0.65), NAVY) txbox(s, "Fig 3: 8-year-old CP GMFCS V — MP 74% → 51%\nPre-op, post-op, 2.9-yr follow-up showing partial relapse", Inches(9.0), Inches(4.57), Inches(4.0), Inches(0.6), size=11, color=WHITE) txbox(s, "All images: AP pelvis radiographs. Arrow indicates improved femoral head coverage. " "LCP = Locking Compression Plate. GMFCS = Gross Motor Function Classification System.", Inches(0.2), Inches(5.3), Inches(12.9), Inches(0.4), size=11, color=RGBColor(0xAA,0xBB,0xCC), italic=True) footer(s) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 9 – Complications # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s, "Complications of VDRO", "Surgical and medical adverse outcomes") rect(s, 0, Inches(1.15), W, H - Inches(1.15), LIGHT_GRAY) rect(s, Inches(0.25), Inches(1.45), Inches(6.2), Inches(0.4), RED_ACCENT) txbox(s, "Surgical Complications", Inches(0.35), Inches(1.47), Inches(6.0), Inches(0.36), size=14, bold=True, color=WHITE) surg_comps = [ ("Resubluxation / Redislocation", "~15% when MP > 70% preoperatively. Risk with inadequate pelvic osteotomy."), ("Avascular Necrosis (AVN)", "Damage to medial circumflex artery; avoid excessive shortening or medial dissection."), ("Leg Length Discrepancy (LLD)", "Due to shortening osteotomy or epiphyseal disturbance; monitor with serial X-rays."), ("Implant Failure / Breakage", "Blade plate cutout in osteopenic bone; ensure adequate fixation."), ("Wound Infection", "2–5%; higher in GMFCS V patients with poor nutritional status."), ("Heterotopic Ossification", "Rare; prophylaxis with NSAIDs or low-dose radiation in high-risk patients."), ("Malunion / Nonunion", "Rare with modern fixation; ensure adequate cortical contact at osteotomy site."), ] for i, (comp, detail) in enumerate(surg_comps): rect(s, Inches(0.25), Inches(1.92 + i * 0.52), Inches(6.2), Inches(0.48), RGBColor(0xFF,0xEE,0xEE) if i % 2 == 0 else WHITE) txbox(s, f"• {comp}:", Inches(0.35), Inches(1.94 + i * 0.52), Inches(2.3), Inches(0.44), size=12, bold=True, color=RED_ACCENT) txbox(s, detail, Inches(2.65), Inches(1.94 + i * 0.52), Inches(3.7), Inches(0.44), size=12, color=DARK_GRAY) rect(s, Inches(6.6), Inches(1.45), Inches(6.5), Inches(0.4), MID_BLUE) txbox(s, "Medical Complications (83% of all complications)", Inches(6.7), Inches(1.47), Inches(6.3), Inches(0.36), size=14, bold=True, color=WHITE) med_comps = [ ("Respiratory Complications", "Most common; pneumonia, aspiration. CP patients have swallowing dysfunction."), ("Urinary Tract Infection", "Related to catheterisation and immobilisation in spica cast."), ("Deep Vein Thrombosis", "Less common in children; prophylaxis with LMW heparin in adolescents."), ("Pressure Sores", "From hip spica cast; ensure adequate padding especially over bony prominences."), ("Anaesthetic Complications", "Temperature instability, seizure threshold alteration, drug interactions."), ("Nutritional Compromise", "Common in GMFCS V; tube feeding may be needed perioperatively."), ] for i, (comp, detail) in enumerate(med_comps): rect(s, Inches(6.6), Inches(1.92 + i * 0.52), Inches(6.5), Inches(0.48), RGBColor(0xE8,0xF4,0xFB) if i % 2 == 0 else WHITE) txbox(s, f"• {comp}:", Inches(6.7), Inches(1.94 + i * 0.52), Inches(2.5), Inches(0.44), size=12, bold=True, color=MID_BLUE) txbox(s, detail, Inches(9.2), Inches(1.94 + i * 0.52), Inches(3.8), Inches(0.44), size=12, color=DARK_GRAY) rect(s, Inches(0.25), Inches(5.95), Inches(12.85), Inches(0.7), RGBColor(0xFF,0xF3,0xCD)) txbox(s, "NOTE: Medical complications account for 83% of all postoperative complications in CP patients undergoing VDRO. " "Multidisciplinary perioperative planning (neurology, pulmonology, nutrition, physiotherapy) is essential.", Inches(0.35), Inches(5.97), Inches(12.65), Inches(0.65), size=13, color=NAVY) footer(s) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 10 – Radiographic Assessment # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s, "Radiographic Assessment", "Preoperative planning and postoperative monitoring") rect(s, 0, Inches(1.15), W, H - Inches(1.15), LIGHT_GRAY) txbox(s, "Preoperative Measurements", Inches(0.25), Inches(1.4), Inches(6.3), Inches(0.4), size=15, bold=True, color=NAVY) add_table(s, ["Measurement", "Method", "Normal", "Surgical Threshold"], [["Migration % (MP)\nReiners Index", "% femoral head lateral to Perkins line", "< 30%", "> 40–60%"], ["Acetabular Index (AI)", "Angle of acetabular roof to Hilgenreiner's line", "< 25°", "> 25–30°"], ["Neck-Shaft Angle (NSA)", "Femoral neck axis to femoral shaft axis", "120–135°", "> 150° (coxa valga)"], ["CE Angle (Wiberg)", "Lateral edge of acetabulum to vertical", "> 25°", "< 20° (dysplastic)"], ["Femoral Anteversion", "CT scan or fluoroscopic trochanteric prominence", "15–20°", "> 40°"], ["Shenton's Line", "Continuity of medial femoral neck–obturator foramen arc", "Unbroken", "Broken = sublux"]], Inches(0.25), Inches(1.85), Inches(6.3), Inches(3.5), font_size=12) txbox(s, "Postoperative Targets & Follow-Up", Inches(6.8), Inches(1.4), Inches(6.3), Inches(0.4), size=15, bold=True, color=NAVY) add_table(s, ["Parameter", "Target", "Follow-Up Interval"], [["NSA post-VDRO", "~120° ambulatory\n100–110° non-ambulatory", "6 weeks, 3 months, 6 months"], ["Migration %", "< 30%", "Every 6–12 months until skeletal maturity"], ["Acetabular Index", "< 25°", "Monitor for acetabular remodelling"], ["Radiograph Type", "AP pelvis + Lauenstein (frog-leg)", "Spica removal at 4–6 weeks"], ["Implant Check", "Blade plate / LCP position, screw cutout", "6 weeks and 3 months"], ["Bone healing", "Callus formation at osteotomy site", "6–8 weeks for cortical bridging"]], Inches(6.8), Inches(1.85), Inches(6.3), Inches(3.5), font_size=12) rect(s, Inches(0.25), Inches(5.45), Inches(12.85), Inches(0.5), RGBColor(0xD6,0xE8,0xF7)) txbox(s, "Radiographic Protocol: AP pelvis in neutral rotation, supine. Use standing AP in ambulatory patients post-op. " "Add MRI if AVN suspected postoperatively (T1/T2 sequence of femoral head).", Inches(0.35), Inches(5.47), Inches(12.65), Inches(0.45), size=12, color=NAVY) add_table(s, ["Pelvis View", "Purpose"], [["AP pelvis (neutral)", "MP, AI, NSA measurement"], ["Lauenstein (frog-leg)", "Femoral head morphology"], ["Von Rosen (abduction)", "Reducibility of hip"], ["CT / MRI", "Anteversion, AVN, 3D planning"]], Inches(0.25), Inches(6.02), Inches(6.3), Inches(1.18), font_size=12) add_table(s, ["Timing", "Purpose"], [["Pre-op", "Templating, NSA/MP baseline"], ["Intraoperative", "Fluoroscopy — confirm reduction"], ["Day 1 post-op", "Confirm position in spica"], ["6 weeks", "Check union, remove spica"]], Inches(6.8), Inches(6.02), Inches(6.3), Inches(1.18), font_size=12) footer(s) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 11 – Postoperative Care # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s, "Postoperative Care & Rehabilitation", "Spica management, physiotherapy, and long-term surveillance") rect(s, 0, Inches(1.15), W, H - Inches(1.15), LIGHT_GRAY) phases = [ ("Phase 1\n(0–6 weeks)", NAVY, [ "Hip spica cast: 45° flexion, 30° abduction", "Non-weight bearing in spica", "Nursing care: pressure area, hygiene", "Pain management: regular analgesia", "Monitor for cast complications (pressure sores)", "Spica window for bowel/bladder care" ]), ("Phase 2\n(6–12 weeks)", MID_BLUE, [ "Spica removed at 4–6 weeks", "Gradual hip ROM exercises", "Hydrotherapy commenced", "Progressive weight bearing if ambulatory", "Physiotherapy for hip strengthening", "Radiograph to confirm union" ]), ("Phase 3\n(3–12 months)", GREEN_ACC, [ "Full weight bearing (ambulatory patients)", "Gait re-education / orthotics", "Regular neurodevelopmental therapy", "Hip radiograph at 6 months", "Monitor for LLD, implant issues", "School reintegration" ]), ("Long-Term\n(> 1 year)", GOLD, [ "Annual AP pelvis radiograph", "Monitor MP until skeletal maturity", "Implant removal: 12–18 months post-op", "GMFCS-based function assessment", "Repeat VDRO if significant recurrence", "Orthopaedic review at skeletal maturity" ]), ] for i, (phase, col, items) in enumerate(phases): x = Inches(0.25 + i * 3.27) rect(s, x, Inches(1.45), Inches(3.1), Inches(0.6), col) txbox(s, phase, x + Inches(0.08), Inches(1.47), Inches(2.95), Inches(0.56), size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER) for ii, item in enumerate(items): rect(s, x, Inches(2.1 + ii * 0.58), Inches(3.1), Inches(0.54), LIGHT_BLUE if ii % 2 == 0 else WHITE) txbox(s, f" • {item}", x + Inches(0.05), Inches(2.12 + ii * 0.58), Inches(3.0), Inches(0.52), size=12, color=DARK_GRAY) # Additional notes rect(s, Inches(0.25), Inches(5.62), Inches(12.85), Inches(0.55), RGBColor(0xFF,0xF3,0xCD)) txbox(s, "Special Considerations in CP Patients: Nutritional support (NGT/PEG feeding if needed), seizure medication review, " "positioning aids, pressure-relieving mattress, and family/carer education for spica care are essential.", Inches(0.35), Inches(5.64), Inches(12.65), Inches(0.5), size=13, color=NAVY) add_table(s, ["Warning Sign", "Action"], [["Increasing cast pressure pain", "Window / bivalve cast"], ["Skin breakdown / erythema", "Urgent cast review"], ["Fever > 38°C", "Rule out infection — bloods, X-ray"], ["Neurovascular compromise", "Immediate bivalve / remove cast"]], Inches(0.25), Inches(6.25), Inches(6.3), Inches(1.0), font_size=12) add_table(s, ["Milestone", "Target Timeframe"], [["Spica removal", "4–6 weeks"], ["Sitting, transfers", "6–8 weeks"], ["Walking frame / wheelchair", "8–12 weeks"], ["Return to school", "8–10 weeks"]], Inches(6.8), Inches(6.25), Inches(6.3), Inches(1.0), font_size=12) footer(s) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 12 – Key Summary # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, NAVY) rect(s, 0, 0, Inches(0.2), H, GOLD) txbox(s, "Key Summary Points", Inches(0.45), Inches(0.2), Inches(12), Inches(0.7), size=30, bold=True, color=WHITE) txbox(s, "VDRO — Clinical Pearls and Take-Home Messages", Inches(0.45), Inches(0.88), Inches(12), Inches(0.38), size=16, color=LIGHT_BLUE) rect(s, 0, Inches(1.25), W, Inches(0.04), GOLD) points = [ ("Definition", "VDRO simultaneously corrects coxa valga (→ NSA ~120°) AND increased femoral anteversion (derotation 20–40°)"), ("Indication", "Primary indication: CP hip subluxation (MP > 40–60%). Also DDH, LCPD, paralytic hips."), ("Threshold", "Operate before MP exceeds 70% and before age 8 for best results"), ("Combined Rx", "VDRO alone insufficient in ~40% — add Dega pelvic osteotomy for posterosuperior deficiency"), ("Technique", "Lateral approach, transverse osteotomy below lesser trochanter, blade plate/LCP fixation"), ("Outcomes", "84% prevent redislocation; 95% good results at 7 years with VDRO + Dega combined"), ("Complications", "Medical complications = 83% of all; Surgical: AVN, resubluxation, LLD, implant failure"), ("Post-op", "Hip spica 45° flex / 30° abduction for 4–6 weeks; physiotherapy after spica removal"), ("Surveillance", "Annual AP pelvis until skeletal maturity; GMFCS V = every 6 months"), ("Failure risk", "Age < 6 yrs, MP > 70%, AI > 25°, GMFCS IV–V → higher recurrence risk"), ] ncols = 2 col_w = Inches(6.35) for i, (key, val) in enumerate(points): col = i % 2; row = i // 2 x = Inches(0.25 + col * 6.62) y = Inches(1.38 + row * 1.15) rect(s, x, y, col_w, Inches(1.0), RGBColor(0x12,0x36,0x6A)) rect(s, x, y, Inches(1.6), Inches(1.0), MID_BLUE) txbox(s, key, x + Inches(0.05), y + Inches(0.25), Inches(1.5), Inches(0.5), size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER) txbox(s, val, x + Inches(1.7), y + Inches(0.1), Inches(4.55), Inches(0.8), size=13, color=RGBColor(0xDD,0xEE,0xFF), wrap=True) footer(s) # ════════════════════════════════════════════════════════════════════════════ # SLIDE 13 – References # ════════════════════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s, "References & Further Reading", "Sources and recommended literature") rect(s, 0, Inches(1.15), W, H - Inches(1.15), LIGHT_GRAY) refs = [ "1. Azar FM, Beaty JH, Campbell WC. Campbell's Operative Orthopaedics, 15th Edition. Elsevier; 2026.", "2. Miller MD. Miller's Review of Orthopaedics, 9th Edition. Elsevier; 2024.", "3. Soo B et al. Hip displacement in cerebral palsy. J Bone Joint Surg Br. 2006.", "4. Reimers J. The stability of the hip in children. A radiological study of the results of muscle surgery in cerebral palsy. Acta Orthop Scand Suppl. 1980.", "5. Scrutton D, Baird G, Smeeton N. Hip dysplasia in bilateral cerebral palsy: incidence and natural history in children aged 18 months to 5 years. Dev Med Child Neurol. 2001.", "6. Shore BJ, et al. Proximal femoral varus derotation osteotomy in children with cerebral palsy: a systematic review. J Bone Joint Surg Am. 2012.", "7. Canavese F, Emara K. Recent developments in the management of hip dysplasia in cerebral palsy. J Pediatr Orthop B. 2021.", "8. Gordon GS et al. Dega osteotomy for the correction of acetabular dysplasia in children with spastic cerebral palsy. J Bone Joint Surg Br. 1996.", "9. Robin J et al. Proximal femoral geometry in cerebral palsy: a population-based cross-sectional study. J Bone Joint Surg Br. 2008.", "10. AACPDM (American Academy for Cerebral Palsy and Developmental Medicine) — Hip surveillance guidelines for children with cerebral palsy. 2020.", ] for i, ref in enumerate(refs): y = Inches(1.42 + i * 0.51) bg_c = LIGHT_BLUE if i % 2 == 0 else WHITE rect(s, Inches(0.25), y, Inches(12.85), Inches(0.48), bg_c) txbox(s, ref, Inches(0.35), y + Inches(0.04), Inches(12.65), Inches(0.42), size=12, color=DARK_GRAY) rect(s, Inches(0.25), Inches(6.6), Inches(12.85), Inches(0.52), NAVY) txbox(s, "This presentation is for educational purposes only. Clinical decisions should be based on current guidelines and individual patient assessment.", Inches(0.35), Inches(6.62), Inches(12.65), Inches(0.45), size=12, color=RGBColor(0xAA,0xCC,0xEE), italic=True) footer(s) # ── Save ───────────────────────────────────────────────────────────────────── out = "/tmp/VDRO_Presentation.pptx" prs.save(out) print(f"Saved: {out}") import os; print(f"Size: {os.path.getsize(out):,} bytes") PYEOF python3 /tmp/build_vdro.py
sed -i \ 's/RGBColor(0xFFF3CD)/RGBColor(0xFF, 0xF3, 0xCD)/g; s/RGBColor(0xFFEEEE)/RGBColor(0xFF, 0xEE, 0xEE)/g; s/RGBColor(0xFFF3CD)/RGBColor(0xFF, 0xF3, 0xCD)/g' \ /tmp/build_vdro.py # Also fix any remaining 3-arg hex RGBColor calls python3 -c " import re with open('/tmp/build_vdro.py') as f: content = f.read() # find all RGBColor(0xRRGGBB) patterns (single arg) def fix_rgb(m): val = int(m.group(1), 16) r = (val >> 16) & 0xFF g = (val >> 8) & 0xFF b = val & 0xFF return f'RGBColor(0x{r:02X}, 0x{g:02X}, 0x{b:02X})' fixed = re.sub(r'RGBColor\((0x[0-9A-Fa-f]{6})\)', fix_rgb, content) with open('/tmp/build_vdro.py', 'w') as f: f.write(fixed) print('Fixed RGBColor calls') " python3 /tmp/build_vdro.py
# Verify the file is a valid PPTX and count slides python3 -c " from pptx import Presentation prs = Presentation('/tmp/VDRO_Presentation.pptx') print(f'Slide count: {len(prs.slides)}') print(f'Dimensions: {prs.slide_width.inches:.3f}\" x {prs.slide_height.inches:.3f}\"') for i, slide in enumerate(prs.slides): shapes = len(slide.shapes) print(f' Slide {i+1}: {shapes} shapes') "
| # | Slide Title | Highlights |
|---|---|---|
| 1 | Title Slide | VDRO full title, topic index, textbook sources |
| 2 | Definition & Concept | VDRO breakdown (varus + derotation), normal vs pathological values table (NSA, anteversion, MP, AI, CE angle) |
| 3 | Pathological Basis | Spasticity → coxa valga → dislocation chain; GMFCS dislocation risk % by level; Migration % / Reimers Index definition |
| 4 | Indications Overview | Full table: CP, DDH, LCPD, paralytic, SMA, post-AVN, dysplasia; MP threshold thresholds |
| 5 | CP Indications (Deep Dive) | GMFCS surveillance protocol table; treatment algorithm by MP (< 30% to 100%); risk factors for failure; outcome stats |
| 6 | Surgical Technique | All 10 steps (positioning → osteotomy → derotation → blade plate fixation → spica cast) in two-column layout |
| 7 | Combined Procedures | Table of 8 adjunct procedures (adductor release, iliopsoas, Dega, Salter, Pemberton, shelf, open reduction, shortening) with evidence levels |
| 8 | Clinical Radiographs | 3 embedded real radiograph images with captions (dark background for image clarity) |
| 9 | Complications | Surgical (AVN, resubluxation, LLD, implant failure, infection) + Medical complications (83% note prominently) |
| 10 | Radiographic Assessment | Preoperative measurement table (MP, AI, NSA, CE angle, anteversion, Shenton's line); postoperative targets and timing |
| 11 | Postoperative Care | 4-phase rehabilitation timeline (0-6 wk, 6-12 wk, 3-12 mo, > 1 yr); warning signs; milestones |
| 12 | Key Summary Points | 10 clinical pearl boxes on dark navy background (definition through failure risk) |
| 13 | References | 10 references including Campbell's 15e, Miller's 9e, and 8 key journal articles |
resend link
link not downloading
ls -lh /tmp/VDRO_Presentation.pptx 2>/dev/null && echo "EXISTS" || echo "NOT FOUND" ls -lh /tmp/workspace/ 2>/dev/null || echo "workspace missing"
/tmp/workspace/ where it persists.mkdir -p /tmp/workspace/vdro && cat << 'PYEOF' > /tmp/workspace/vdro/build_vdro.py import sys, base64, io, os, urllib.request, urllib.error from pptx import Presentation from pptx.util import Inches, Pt, Emu from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN NAVY = RGBColor(0x0D, 0x2B, 0x55) MID_BLUE = RGBColor(0x1A, 0x5E, 0x9A) LIGHT_BLUE = RGBColor(0xD6, 0xE8, 0xF7) GOLD = RGBColor(0xC8, 0x9B, 0x2E) WHITE = RGBColor(0xFF, 0xFF, 0xFF) DARK_GRAY = RGBColor(0x2E, 0x2E, 0x2E) MED_GRAY = RGBColor(0x5A, 0x5A, 0x5A) LIGHT_GRAY = RGBColor(0xF2, 0xF4, 0xF6) RED_ACCENT = RGBColor(0xC0, 0x39, 0x2B) GREEN_ACC = RGBColor(0x1E, 0x7A, 0x4A) AMBER = RGBColor(0xFF, 0xF3, 0xCD) PALE_RED = RGBColor(0xFF, 0xEE, 0xEE) PALE_BLUE2 = RGBColor(0xE8, 0xF1, 0xFB) PALE_BLUE3 = RGBColor(0xE0, 0xEE, 0xF8) PALE_BLUE4 = RGBColor(0xE8, 0xF4, 0xFB) DARK_NAVY2 = RGBColor(0x12, 0x36, 0x6A) DEEP_BG = RGBColor(0x10, 0x18, 0x2A) LINK_BLUE = RGBColor(0xAA, 0xCC, 0xEE) LINK2 = RGBColor(0xDD, 0xEE, 0xFF) LINK3 = RGBColor(0x88, 0xAA, 0xCC) W = Inches(13.333) H = Inches(7.5) prs = Presentation() prs.slide_width = W prs.slide_height = H blank = prs.slide_layouts[6] IMG_CACHE = {} def fetch_img(url): if url in IMG_CACHE: return IMG_CACHE[url] try: req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) data = urllib.request.urlopen(req, timeout=15).read() IMG_CACHE[url] = io.BytesIO(data) return IMG_CACHE[url] except Exception as e: print(f"[WARN] {url}: {e}") return None IMG1 = "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_01a30c4fc922064ed9b7ef47cf9bbbe34f7626e041c64ff76e7535e263ee7984.jpg" IMG2 = "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_e961e139f64ea50135517299874c828f59a9e3178e3565b5740b04a38f252d2e.jpg" IMG3 = "https://cdn.orris.care/cdss_images/pmc_clinical_VQA_a8d62e00f9596ddfe2ef01546be20160560418319209076a31e046eec8364ed4.jpg" def bg(slide, color): fill = slide.background.fill; fill.solid(); fill.fore_color.rgb = color def rect(slide, l, t, w, h, color): shape = slide.shapes.add_shape(1, l, t, w, h) shape.fill.solid(); shape.fill.fore_color.rgb = color shape.line.fill.background(); return shape def txbox(slide, text, l, t, w, h, size=18, bold=False, color=WHITE, align=PP_ALIGN.LEFT, wrap=True, italic=False): tb = slide.shapes.add_textbox(l, t, w, h) tf = tb.text_frame; tf.word_wrap = wrap p = tf.paragraphs[0]; p.alignment = align run = p.add_run(); run.text = text run.font.size = Pt(size); run.font.bold = bold run.font.color.rgb = color; run.font.italic = italic return tb def header_bar(slide, title, subtitle=None): rect(slide, 0, 0, W, Inches(1.1), NAVY) rect(slide, 0, Inches(1.1), W, Inches(0.05), GOLD) txbox(slide, title, Inches(0.35), Inches(0.1), Inches(12), Inches(0.7), size=28, bold=True, color=WHITE) if subtitle: txbox(slide, subtitle, Inches(0.35), Inches(0.72), Inches(12), Inches(0.35), size=15, bold=False, color=LIGHT_BLUE) def add_table(slide, headers, rows, l, t, w, h, hdr_bg=NAVY, hdr_fg=WHITE, row1_bg=LIGHT_BLUE, row2_bg=WHITE, cell_color=DARK_GRAY, font_size=14): n_cols = len(headers); n_rows = len(rows) + 1 tbl = slide.shapes.add_table(n_rows, n_cols, l, t, w, h).table col_w = int(w / n_cols) for i, c in enumerate(tbl.columns): c.width = col_w def cell_set(cell, txt, bg, fg, bold=False, sz=None): 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(txt) r.font.bold = bold; r.font.color.rgb = fg; r.font.size = Pt(sz or font_size) for j, h_txt in enumerate(headers): cell_set(tbl.cell(0, j), h_txt, hdr_bg, hdr_fg, bold=True, sz=font_size+1) for i, row in enumerate(rows): bg_c = row1_bg if i % 2 == 0 else row2_bg for j, val in enumerate(row): cell_set(tbl.cell(i+1, j), val, bg_c, cell_color, sz=font_size) return tbl def safe_img(slide, url, l, t, w, h): buf = fetch_img(url) if buf: buf.seek(0); slide.shapes.add_picture(buf, l, t, w, h); return True return False def footer(slide, text="VDRO — Varus Derotation Osteotomy | Orthopaedic Surgery"): rect(slide, 0, H - Inches(0.28), W, Inches(0.28), NAVY) txbox(slide, text, Inches(0.3), H - Inches(0.27), Inches(10), Inches(0.26), size=9, color=LINK_BLUE, align=PP_ALIGN.LEFT) txbox(slide, "Educational Use Only", Inches(10.5), H - Inches(0.27), Inches(2.5), Inches(0.26), size=9, color=LINK_BLUE, align=PP_ALIGN.RIGHT) # ─── SLIDE 1 — Title ──────────────────────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, NAVY) rect(s, 0, 0, Inches(0.25), H, GOLD) rect(s, Inches(7.5), Inches(1.8), Inches(5.5), Inches(4.2), MID_BLUE) txbox(s,"VARUS DEROTATION OSTEOTOMY",Inches(0.7),Inches(1.4),Inches(7.2),Inches(1.1),size=36,bold=True,color=WHITE) txbox(s,"VDRO",Inches(0.7),Inches(2.45),Inches(5),Inches(0.65),size=42,bold=True,color=GOLD) txbox(s,"Proximal Femoral Corrective Surgery",Inches(0.7),Inches(3.1),Inches(7),Inches(0.5),size=20,color=LIGHT_BLUE) txbox(s,"A comprehensive review of indications, surgical technique,\ncombined procedures, complications, and outcomes", Inches(0.7),Inches(3.7),Inches(6.8),Inches(0.9),size=14,color=RGBColor(0xCC,0xDD,0xEE)) txbox(s,"Key Topics",Inches(7.7),Inches(2.0),Inches(4.8),Inches(0.4),size=16,bold=True,color=GOLD) for i,tp in enumerate(["Definition & Pathological Basis","Indications & Treatment Algorithm", "Surgical Technique","Combined Procedures", "Complications & Outcomes","Radiographic Assessment","Postoperative Care"]): txbox(s,f" {i+1}. {tp}",Inches(7.7),Inches(2.45+i*0.48),Inches(4.9),Inches(0.45),size=13,color=WHITE) txbox(s,"Source: Campbell's Operative Orthopaedics 15e (2026)\n Miller's Review of Orthopaedics 9e", Inches(0.7),Inches(6.5),Inches(8),Inches(0.6),size=11,color=LINK3,italic=True) footer(s) # ─── SLIDE 2 — Definition ─────────────────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, WHITE); header_bar(s,"Definition & Concept","What is VDRO?") rect(s, 0, Inches(1.15), W, H-Inches(1.15), LIGHT_GRAY) rect(s,Inches(0.3),Inches(1.5),Inches(6.2),Inches(1.0),NAVY) txbox(s,"VDRO Definition",Inches(0.4),Inches(1.55),Inches(6),Inches(0.35),size=16,bold=True,color=WHITE) txbox(s,"Varus Derotation Osteotomy (VDRO) is a proximal femoral osteotomy that simultaneously corrects " "coxa valga (excessive neck-shaft angle) and increased femoral anteversion by cutting the femur " "below the lesser trochanter and repositioning the femoral head into the acetabulum.", Inches(0.3),Inches(2.55),Inches(6.2),Inches(1.1),size=14,color=DARK_GRAY) rect(s,Inches(0.3),Inches(3.7),Inches(2.95),Inches(1.5),MID_BLUE) txbox(s,"VARUS Component",Inches(0.4),Inches(3.78),Inches(2.7),Inches(0.35),size=13,bold=True,color=WHITE) txbox(s,"Reduces the neck-shaft angle (NSA)\nTarget: ~120° (ambulatory)\n~100-110° (non-ambulatory)", Inches(0.4),Inches(4.12),Inches(2.7),Inches(0.95),size=12,color=WHITE) rect(s,Inches(3.45),Inches(3.7),Inches(3.05),Inches(1.5),MID_BLUE) txbox(s,"DEROTATION Component",Inches(3.55),Inches(3.78),Inches(2.8),Inches(0.35),size=13,bold=True,color=WHITE) txbox(s,"Corrects femoral anteversion\nNormal: 15-20°\nCP/DDH: may exceed 40-50°", Inches(3.55),Inches(4.12),Inches(2.8),Inches(0.95),size=12,color=WHITE) rect(s,Inches(0.3),Inches(5.3),Inches(6.2),Inches(0.65),LIGHT_BLUE) txbox(s,"Primary Goal: Restore stable, concentric hip joint and prevent progressive subluxation / dislocation", Inches(0.4),Inches(5.35),Inches(6.0),Inches(0.55),size=13,color=NAVY) txbox(s,"Normal vs Pathological Values",Inches(7.0),Inches(1.55),Inches(6.0),Inches(0.4),size=15,bold=True,color=NAVY) add_table(s,["Parameter","Normal","Pathological (CP)"], [["Neck-Shaft Angle (NSA)","120-135°","> 150° (coxa valga)"], ["Femoral Anteversion","15-20°","> 40-50°"], ["Migration Percentage","< 30%","> 40-60% (intervention)"], ["Acetabular Index","< 25°","> 25-30°"], ["CE Angle (Wiberg)","> 25°","< 20° (dysplastic)"]], Inches(7.0),Inches(2.0),Inches(6.0),Inches(2.8),font_size=13) rect(s,Inches(7.0),Inches(4.9),Inches(6.0),Inches(1.55),RGBColor(0xE8,0xF4,0xFB)) txbox(s,"Osteotomy Level",Inches(7.1),Inches(4.95),Inches(5.8),Inches(0.35),size=14,bold=True,color=NAVY) txbox(s,"The osteotomy is performed in the proximal femoral metaphysis, at the level of or just below " "the lesser trochanter. Fixation is achieved with a blade plate or paediatric locking compression plate (LCP).", Inches(7.1),Inches(5.3),Inches(5.8),Inches(1.0),size=13,color=DARK_GRAY) footer(s) # ─── SLIDE 3 — Pathological Basis ────────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, WHITE); header_bar(s,"Pathological Basis","Why does the hip dislocate in Cerebral Palsy?") rect(s, 0, Inches(1.15), W, H-Inches(1.15), LIGHT_GRAY) rect(s,Inches(0.3),Inches(1.4),Inches(12.7),Inches(1.5),PALE_BLUE3) txbox(s,"Pathomechanism of CP Hip Displacement",Inches(0.4),Inches(1.42),Inches(12),Inches(0.38), size=15,bold=True,color=NAVY) chain_items = [("Spastic adductors &\niliopsoas",True), ("→",False),("Sustained valgus force\non proximal femur",True), ("→",False),("Progressive coxa valga\n+ anteversion",True), ("→",False),("Femoral head\nsubluxation/dislocation",True)] x_starts = [0.35, 2.55, 2.93, 5.15, 5.53, 7.75, 8.13] widths = [2.15, 0.33, 2.15, 0.33, 2.15, 0.33, 2.15] for i,(item,is_box) in enumerate(chain_items): if is_box: rect(s,Inches(x_starts[i]),Inches(1.82),Inches(widths[i]),Inches(0.9),MID_BLUE) txbox(s,item,Inches(x_starts[i]+0.04),Inches(1.86),Inches(widths[i]-0.08),Inches(0.82), size=12,bold=True,color=WHITE,align=PP_ALIGN.CENTER) else: txbox(s,"→",Inches(x_starts[i]),Inches(1.9),Inches(widths[i]),Inches(0.7), size=20,bold=True,color=GOLD,align=PP_ALIGN.CENTER) cols_data = [ ("Muscle Imbalance",NAVY, ["Spastic hip adductors","Spastic iliopsoas flexors", "Weak hip abductors (gluteus medius)","Increased femoral head contact pressure", "Progressive migration over years"]), ("Bony Changes",MID_BLUE, ["Coxa valga (NSA > 150°)","Increased anteversion (> 40°)", "Acetabular dysplasia (secondary)","Posterosuperior acetabular deficiency", "Loss of spherical femoral head"]), ("Risk by GMFCS Level",RED_ACCENT, ["GMFCS I: ~0% dislocation risk","GMFCS II: ~5% dislocation risk", "GMFCS III: ~20% dislocation risk","GMFCS IV: ~40% dislocation risk", "GMFCS V: ~60-70% dislocation risk"]) ] for ci,(ttl,col_c,items) in enumerate(cols_data): x = Inches(0.3 + ci*4.35) rect(s,x,Inches(2.95),Inches(4.1),Inches(0.48),col_c) txbox(s,ttl,x+Inches(0.1),Inches(2.98),Inches(3.9),Inches(0.42),size=14,bold=True,color=WHITE) for ii,it in enumerate(items): txbox(s,f"• {it}",x+Inches(0.1),Inches(3.5+ii*0.42),Inches(3.9),Inches(0.4),size=13,color=DARK_GRAY) rect(s,Inches(0.3),Inches(5.8),Inches(12.7),Inches(0.85),AMBER) txbox(s,"Migration Percentage (MP) / Reimers Index:",Inches(0.4),Inches(5.82),Inches(5),Inches(0.38), size=13,bold=True,color=NAVY) txbox(s,"Percentage of femoral head lateral to Hilgenreiner's perpendicular line. " "MP > 33% = subluxation; MP > 40-60% = surgical threshold; MP = 100% = complete dislocation.", Inches(5.3),Inches(5.82),Inches(7.6),Inches(0.75),size=13,color=DARK_GRAY) footer(s) # ─── SLIDE 4 — Indications Overview ───────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s,"Indications for VDRO","Conditions requiring proximal femoral varus derotation osteotomy") rect(s, 0, Inches(1.15), W, H-Inches(1.15), LIGHT_GRAY) add_table(s,["Condition","Specific Indication","Key Threshold / Goal"], [["Cerebral Palsy (PRIMARY)","Hip subluxation/dislocation, MP 40-60%","NSA → 120°, correct anteversion"], ["Developmental Dysplasia (DDH)","Residual coxa valga after reduction","NSA → 125°, derotate if AVN"], ["Legg-Calve-Perthes (LCPD)","Hinge abduction, containment failure","Improve containment, reduce impingement"], ["Paralytic Hip (Spina Bifida)","Flaccid paralysis with progressive sublux","Stabilize hip biomechanics"], ["Neuromuscular (SMA)","Progressive hip dysplasia, non-ambulatory","Prevent painful dislocation"], ["Post-AVN Deformity","Coxa magna with secondary impingement","Restore clearance, reduce pain"], ["Skeletal Dysplasia","Coxa valga causing instability","NSA reduction, improve gait"]], Inches(0.3),Inches(1.5),Inches(12.7),Inches(3.5),font_size=13) for (label,note,x_pos) in [ ("PRIMARY Indication","Cerebral palsy accounts for the vast majority of VDROs performed worldwide",0.3), ("Timing","Best outcomes: before age 8 and before MP exceeds 70%",4.55), ("Combined Approach","VDRO alone insufficient in ~40% of cases; pelvic osteotomy often required",8.8)]: rect(s,Inches(x_pos),Inches(5.1),Inches(4.1),Inches(0.65),LIGHT_BLUE) txbox(s,label,Inches(x_pos+0.1),Inches(5.12),Inches(3.9),Inches(0.32),size=13,bold=True,color=NAVY) txbox(s,note,Inches(x_pos+0.1),Inches(5.42),Inches(3.9),Inches(0.3),size=11,color=DARK_GRAY) rect(s,Inches(0.3),Inches(5.88),Inches(12.7),Inches(0.85),AMBER) txbox(s,"CP Threshold Summary:",Inches(0.4),Inches(5.9),Inches(2.3),Inches(0.38),size=13,bold=True,color=NAVY) txbox(s,"MP 40-60% + progressive → VDRO + adductor/psoas release | MP > 60-70% → Add Dega pelvic osteotomy | " "Established dislocation → Open reduction + VDRO + Pelvic osteotomy", Inches(2.7),Inches(5.9),Inches(10.2),Inches(0.75),size=12,color=DARK_GRAY) footer(s) # ─── SLIDE 5 — CP Indications Deep Dive ────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s,"VDRO in Cerebral Palsy — Primary Indication", "Risk stratification, surveillance, and surgical thresholds") rect(s, 0, Inches(1.15), W, H-Inches(1.15), LIGHT_GRAY) txbox(s,"GMFCS-Based Surveillance Protocol",Inches(0.3),Inches(1.4),Inches(6.0),Inches(0.4), size=14,bold=True,color=NAVY) add_table(s,["GMFCS","Hip Disl. Risk","Radiograph Frequency"], [["I-II","< 5%","Age 2, then as needed"], ["III","~20%","Every 12 months"], ["IV","~40%","Every 6-12 months"], ["V","60-70%","Every 6 months"]], Inches(0.3),Inches(1.85),Inches(5.8),Inches(2.4),font_size=14) txbox(s,"Treatment Algorithm — Migration Percentage (MP)",Inches(6.4),Inches(1.4),Inches(6.5),Inches(0.4), size=14,bold=True,color=NAVY) add_table(s,["MP","Classification","Recommended Treatment"], [["< 30%","Normal","Surveillance only"], ["30-40%","Early sublux","Physiotherapy, botox, soft tissue"], ["40-60%","Subluxation","VDRO +/- adductor/psoas release"], ["60-70%","Severe sublux","VDRO + pelvic osteotomy (Dega)"], ["> 70%","Dislocation","Open reduction + VDRO + pelvic"], ["MP = 100%","Complete disl.","Salvage or reconstruction"]], Inches(6.4),Inches(1.85),Inches(6.6),Inches(2.9),font_size=13) rect(s,Inches(0.3),Inches(4.35),Inches(5.8),Inches(0.42),MID_BLUE) txbox(s,"Risk Factors for Failure / Recurrence",Inches(0.4),Inches(4.37),Inches(5.6),Inches(0.38), size=14,bold=True,color=WHITE) for i,r in enumerate(["Age < 6 years at time of VDRO", "Preoperative MP > 70%", "Acetabular index > 25° (acetabular dysplasia)", "GMFCS IV-V (non-ambulatory, severe spasticity)", "Failure to perform pelvic osteotomy when indicated"]): txbox(s,f" x {r}",Inches(0.35),Inches(4.85+i*0.38),Inches(5.8),Inches(0.36), size=13,color=RED_ACCENT) rect(s,Inches(6.4),Inches(4.85),Inches(6.6),Inches(0.42),GREEN_ACC) txbox(s,"Outcome Statistics",Inches(6.5),Inches(4.87),Inches(6.4),Inches(0.38), size=14,bold=True,color=WHITE) for i,o in enumerate(["84% effective at preventing redislocation (combined approach)", "95% good/excellent results at 7-year follow-up (VDRO + Dega)", "Adductor/psoas release performed concurrently in ~80% of cases", "Resubluxation rate ~15% when MP > 70% preoperatively", "Best results: age 6-10, MP 40-70%, GMFCS III-IV"]): txbox(s,f" v {o}",Inches(6.4),Inches(5.35+i*0.38),Inches(6.6),Inches(0.36), size=13,color=GREEN_ACC) footer(s) # ─── SLIDE 6 — Surgical Technique ──────────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, WHITE); header_bar(s,"Surgical Technique","Step-by-step VDRO procedure") rect(s, 0, Inches(1.15), W, H-Inches(1.15), LIGHT_GRAY) steps = [ ("1. Positioning","Supine on radiolucent table with image intensifier. Affected limb draped free for intraoperative fluoroscopy."), ("2. Approach","Lateral approach to proximal femur. Incision from greater trochanter distally ~8-10 cm."), ("3. Exposure","Reflect vastus lateralis anteriorly. Expose proximal femur subperiosteally. Identify lesser trochanter."), ("4. Pre-cut planning","Fluoroscopic templating. Mark osteotomy site at/below lesser trochanter. Plan varus correction to target NSA ~120°."), ("5. Osteotomy","Transverse or oblique cut with oscillating saw. Remove medialization wedge for varus correction."), ("6. Derotation","Rotate distal fragment internally 20-40° (per preoperative anteversion). Check with fluoroscopy — patella should face forward."), ("7. Fixation","Blade plate (90° or 100°) or Locking Compression Plate (LCP-Paediatric Hip Plate). Ensure stable proximal purchase."), ("8. Shortening","Optional — 1-2 cm femoral shortening reduces pressure on femoral head if significant displacement."), ("9. Closure","Layer closure over drain. Restore vastus lateralis over plate."), ("10. Casting","Hip spica cast (45° flexion, 30° abduction) applied under GA. Maintained 4-6 weeks postoperatively."), ] for i,(step,detail) in enumerate(steps): col = 0 if i < 5 else 1; row = i if i < 5 else i-5 x = Inches(0.25) if col==0 else Inches(6.6) y = Inches(1.5 + row*1.08) rect(s,x,y,Inches(6.2),Inches(0.98),PALE_BLUE2) rect(s,x,y,Inches(2.0),Inches(0.98),NAVY) txbox(s,step,x+Inches(0.05),y+Inches(0.08),Inches(1.85),Inches(0.82),size=12,bold=True,color=WHITE) txbox(s,detail,x+Inches(2.1),y+Inches(0.08),Inches(4.0),Inches(0.82),size=12,color=DARK_GRAY) footer(s) # ─── SLIDE 7 — Combined Procedures ─────────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s,"Combined Procedures with VDRO", "VDRO is rarely performed in isolation — adjunct procedures improve outcomes") rect(s, 0, Inches(1.15), W, H-Inches(1.15), LIGHT_GRAY) add_table(s,["Procedure","Indication","Technique / Notes","Evidence"], [["Adductor Release\n(longus +/- gracilis)","MP 30-60%, spastic adductors","Percutaneous or open tenotomy; often first step","Level II-III"], ["Iliopsoas Release","Hip flexion contracture > 30°","Intramuscular recession or tendon lengthening","Level II-III"], ["Dega Pelvic Osteotomy\n(PREFERRED for CP)","MP > 60%, posterosuperior deficiency","Incomplete transiliac osteotomy; rotates acetabulum anterolaterally","Level II"], ["Salter Innominate Osteotomy","Young child, AP deficiency, DDH","Complete innominate cut; rotation on pubic symphysis","Level II"], ["Pemberton Osteotomy","Severe global dysplasia, mobile cartilage","Perichondrial osteotomy through triradiate cartilage","Level III"], ["San Diego (Shelf) Procedure","Adolescent, inadequate coverage","Extraarticular bone graft shelf above acetabulum","Level III"], ["Open Reduction","Established dislocation (MP = 100%)","Medial or anterior approach; capsulorrhaphy","Level II"], ["Femoral Shortening","Significant head displacement, AVN risk","Combined with VDRO; 1-2 cm shortening","Level III"]], Inches(0.25),Inches(1.5),Inches(12.85),Inches(4.4),font_size=12) rect(s,Inches(0.25),Inches(6.0),Inches(12.85),Inches(0.6),AMBER) txbox(s,"KEY POINT: The Dega pelvic osteotomy is preferred for CP due to the characteristic posterosuperior acetabular deficiency. " "Combined VDRO + Dega + soft tissue release yields 95% good results at 7 years.", Inches(0.35),Inches(6.02),Inches(12.6),Inches(0.55),size=13,color=NAVY) footer(s) # ─── SLIDE 8 — Clinical Radiographs ────────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, DEEP_BG) header_bar(s,"Clinical Radiographs","Pre- and postoperative imaging in VDRO") rect(s, 0, Inches(1.05), W, Inches(0.08), GOLD) safe_img(s,IMG1,Inches(0.2),Inches(1.25),Inches(4.2),Inches(3.3)) rect(s,Inches(0.2),Inches(4.55),Inches(4.2),Inches(0.65),NAVY) txbox(s,"Fig 1: AP Pelvis — VDRO + Dega Osteotomy\nPre-op subluxation → Post-op concentric reduction with LCP fixation", Inches(0.3),Inches(4.57),Inches(4.0),Inches(0.6),size=11,color=WHITE) safe_img(s,IMG2,Inches(4.55),Inches(1.25),Inches(4.2),Inches(3.3)) rect(s,Inches(4.55),Inches(4.55),Inches(4.2),Inches(0.65),NAVY) txbox(s,"Fig 2: Longitudinal Series — GMFCS V\nPre-op, 1-day post-op, 7.4-year follow-up. MP improved 67% to 19%", Inches(4.65),Inches(4.57),Inches(4.0),Inches(0.6),size=11,color=WHITE) safe_img(s,IMG3,Inches(8.9),Inches(1.25),Inches(4.2),Inches(3.3)) rect(s,Inches(8.9),Inches(4.55),Inches(4.2),Inches(0.65),NAVY) txbox(s,"Fig 3: 8-yr-old CP GMFCS V — MP 74% to 51%\nPre-op, post-op, 2.9-yr follow-up showing partial relapse", Inches(9.0),Inches(4.57),Inches(4.0),Inches(0.6),size=11,color=WHITE) txbox(s,"All images: AP pelvis radiographs. LCP = Locking Compression Plate. GMFCS = Gross Motor Function Classification System.", Inches(0.2),Inches(5.28),Inches(12.9),Inches(0.4),size=11,color=LINK_BLUE,italic=True) footer(s) # ─── SLIDE 9 — Complications ───────────────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, WHITE); header_bar(s,"Complications of VDRO","Surgical and medical adverse outcomes") rect(s, 0, Inches(1.15), W, H-Inches(1.15), LIGHT_GRAY) rect(s,Inches(0.25),Inches(1.45),Inches(6.2),Inches(0.4),RED_ACCENT) txbox(s,"Surgical Complications",Inches(0.35),Inches(1.47),Inches(6.0),Inches(0.36), size=14,bold=True,color=WHITE) for i,(comp,detail) in enumerate([ ("Resubluxation / Redislocation","~15% when MP > 70% preoperatively. Risk with inadequate pelvic osteotomy."), ("Avascular Necrosis (AVN)","Damage to medial circumflex artery; avoid excessive shortening or medial dissection."), ("Leg Length Discrepancy (LLD)","Due to shortening osteotomy or epiphyseal disturbance; monitor with serial X-rays."), ("Implant Failure / Breakage","Blade plate cutout in osteopenic bone; ensure adequate fixation with LCP."), ("Wound Infection","2-5%; higher in GMFCS V patients with poor nutritional status."), ("Heterotopic Ossification","Rare; prophylaxis with NSAIDs in high-risk patients."), ("Malunion / Nonunion","Rare with modern fixation; ensure adequate cortical contact at osteotomy site.")]): rect(s,Inches(0.25),Inches(1.92+i*0.52),Inches(6.2),Inches(0.48), PALE_RED if i%2==0 else WHITE) txbox(s,f"• {comp}:",Inches(0.35),Inches(1.94+i*0.52),Inches(2.3),Inches(0.44), size=12,bold=True,color=RED_ACCENT) txbox(s,detail,Inches(2.65),Inches(1.94+i*0.52),Inches(3.7),Inches(0.44), size=12,color=DARK_GRAY) rect(s,Inches(6.6),Inches(1.45),Inches(6.5),Inches(0.4),MID_BLUE) txbox(s,"Medical Complications (83% of all complications)",Inches(6.7),Inches(1.47),Inches(6.3),Inches(0.36), size=14,bold=True,color=WHITE) for i,(comp,detail) in enumerate([ ("Respiratory Complications","Most common; pneumonia, aspiration. CP patients have swallowing dysfunction."), ("Urinary Tract Infection","Related to catheterisation and immobilisation in spica cast."), ("Deep Vein Thrombosis","Less common in children; prophylaxis with LMWH in adolescents."), ("Pressure Sores","From hip spica cast; adequate padding over bony prominences is essential."), ("Anaesthetic Complications","Temperature instability, seizure threshold alteration, drug interactions."), ("Nutritional Compromise","Common in GMFCS V; tube feeding may be needed perioperatively.")]): rect(s,Inches(6.6),Inches(1.92+i*0.52),Inches(6.5),Inches(0.48), PALE_BLUE4 if i%2==0 else WHITE) txbox(s,f"• {comp}:",Inches(6.7),Inches(1.94+i*0.52),Inches(2.5),Inches(0.44), size=12,bold=True,color=MID_BLUE) txbox(s,detail,Inches(9.2),Inches(1.94+i*0.52),Inches(3.8),Inches(0.44), size=12,color=DARK_GRAY) rect(s,Inches(0.25),Inches(5.95),Inches(12.85),Inches(0.7),AMBER) txbox(s,"NOTE: Medical complications account for 83% of all postoperative complications in CP patients undergoing VDRO. " "Multidisciplinary perioperative planning (neurology, pulmonology, nutrition, physiotherapy) is essential.", Inches(0.35),Inches(5.97),Inches(12.65),Inches(0.65),size=13,color=NAVY) footer(s) # ─── SLIDE 10 — Radiographic Assessment ────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s,"Radiographic Assessment","Preoperative planning and postoperative monitoring") rect(s, 0, Inches(1.15), W, H-Inches(1.15), LIGHT_GRAY) txbox(s,"Preoperative Measurements",Inches(0.25),Inches(1.4),Inches(6.3),Inches(0.4), size=15,bold=True,color=NAVY) add_table(s,["Measurement","Method","Normal","Threshold"], [["Migration % (MP)\nReiners Index","% femoral head lateral to Perkins line","< 30%","> 40-60%"], ["Acetabular Index (AI)","Angle of acetabular roof to Hilgenreiner's line","< 25°","> 25-30°"], ["Neck-Shaft Angle (NSA)","Femoral neck axis to femoral shaft axis","120-135°","> 150° (coxa valga)"], ["CE Angle (Wiberg)","Lateral edge of acetabulum to vertical","> 25°","< 20° (dysplastic)"], ["Femoral Anteversion","CT scan or fluoroscopic trochanteric prominence","15-20°","> 40°"], ["Shenton's Line","Continuity medial neck-obturator foramen arc","Unbroken","Broken = sublux"]], Inches(0.25),Inches(1.85),Inches(6.3),Inches(3.5),font_size=12) txbox(s,"Postoperative Targets & Follow-Up",Inches(6.8),Inches(1.4),Inches(6.3),Inches(0.4), size=15,bold=True,color=NAVY) add_table(s,["Parameter","Target","Follow-Up"], [["NSA post-VDRO","~120° ambulatory\n100-110° non-ambulatory","6 wks, 3 mths, 6 mths"], ["Migration %","< 30%","Every 6-12 months"], ["Acetabular Index","< 25°","Monitor for remodelling"], ["Radiograph Type","AP pelvis + Lauenstein (frog-leg)","At spica removal 4-6 wks"], ["Implant Check","Blade plate / LCP position, screw cutout","6 weeks and 3 months"], ["Bone healing","Callus at osteotomy site","6-8 weeks for bridging"]], Inches(6.8),Inches(1.85),Inches(6.3),Inches(3.5),font_size=12) rect(s,Inches(0.25),Inches(5.45),Inches(12.85),Inches(0.5),LIGHT_BLUE) txbox(s,"Radiographic Protocol: AP pelvis in neutral rotation, supine. Use standing AP in ambulatory patients post-op. " "Add MRI if AVN suspected (T1/T2 sequence of femoral head).", Inches(0.35),Inches(5.47),Inches(12.65),Inches(0.45),size=12,color=NAVY) add_table(s,["Pelvis View","Purpose"], [["AP pelvis (neutral)","MP, AI, NSA measurement"], ["Lauenstein (frog-leg)","Femoral head morphology"], ["Von Rosen (abduction)","Reducibility of hip"], ["CT / MRI","Anteversion, AVN, 3D planning"]], Inches(0.25),Inches(6.02),Inches(6.3),Inches(1.18),font_size=12) add_table(s,["Timing","Purpose"], [["Pre-op","Templating, NSA/MP baseline"], ["Intraoperative","Fluoroscopy confirm reduction"], ["Day 1 post-op","Confirm position in spica"], ["6 weeks","Check union, remove spica"]], Inches(6.8),Inches(6.02),Inches(6.3),Inches(1.18),font_size=12) footer(s) # ─── SLIDE 11 — Postoperative Care ─────────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s,"Postoperative Care & Rehabilitation", "Spica management, physiotherapy, and long-term surveillance") rect(s, 0, Inches(1.15), W, H-Inches(1.15), LIGHT_GRAY) phases = [ ("Phase 1\n(0-6 weeks)",NAVY, ["Hip spica: 45 deg flexion, 30 deg abduction", "Non-weight bearing in spica","Nursing care: pressure area, hygiene", "Pain management: regular analgesia", "Monitor for cast complications","Spica window for bowel/bladder"]), ("Phase 2\n(6-12 weeks)",MID_BLUE, ["Spica removed at 4-6 weeks", "Gradual hip ROM exercises","Hydrotherapy commenced", "Progressive weight bearing if ambulatory", "Physiotherapy for hip strengthening", "Radiograph to confirm union"]), ("Phase 3\n(3-12 months)",GREEN_ACC, ["Full weight bearing (ambulatory patients)", "Gait re-education / orthotics", "Regular neurodevelopmental therapy", "Hip radiograph at 6 months", "Monitor for LLD, implant issues", "School reintegration"]), ("Long-Term\n(> 1 year)",GOLD, ["Annual AP pelvis radiograph", "Monitor MP until skeletal maturity", "Implant removal: 12-18 months post-op", "GMFCS-based function assessment", "Repeat VDRO if significant recurrence", "Orthopaedic review at skeletal maturity"]), ] for i,(phase,col,items) in enumerate(phases): x = Inches(0.25 + i*3.27) rect(s,x,Inches(1.45),Inches(3.1),Inches(0.6),col) txbox(s,phase,x+Inches(0.08),Inches(1.47),Inches(2.95),Inches(0.56), size=14,bold=True,color=WHITE,align=PP_ALIGN.CENTER) for ii,item in enumerate(items): rect(s,x,Inches(2.1+ii*0.58),Inches(3.1),Inches(0.54), LIGHT_BLUE if ii%2==0 else WHITE) txbox(s,f" * {item}",x+Inches(0.05),Inches(2.12+ii*0.58), Inches(3.0),Inches(0.52),size=12,color=DARK_GRAY) rect(s,Inches(0.25),Inches(5.62),Inches(12.85),Inches(0.55),AMBER) txbox(s,"Special Considerations in CP: Nutritional support (NGT/PEG if needed), seizure medication review, " "positioning aids, pressure-relieving mattress, and carer education for spica care are essential.", Inches(0.35),Inches(5.64),Inches(12.65),Inches(0.5),size=13,color=NAVY) add_table(s,["Warning Sign","Action"], [["Increasing cast pressure pain","Window / bivalve cast"], ["Skin breakdown / erythema","Urgent cast review"], ["Fever > 38 deg C","Rule out infection — bloods, X-ray"], ["Neurovascular compromise","Immediate bivalve / remove cast"]], Inches(0.25),Inches(6.25),Inches(6.3),Inches(1.0),font_size=12) add_table(s,["Milestone","Target Timeframe"], [["Spica removal","4-6 weeks"], ["Sitting, transfers","6-8 weeks"], ["Walking frame / wheelchair","8-12 weeks"], ["Return to school","8-10 weeks"]], Inches(6.8),Inches(6.25),Inches(6.3),Inches(1.0),font_size=12) footer(s) # ─── SLIDE 12 — Key Summary ─────────────────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, NAVY) rect(s, 0, 0, Inches(0.2), H, GOLD) txbox(s,"Key Summary Points",Inches(0.45),Inches(0.2),Inches(12),Inches(0.7), size=30,bold=True,color=WHITE) txbox(s,"VDRO — Clinical Pearls and Take-Home Messages",Inches(0.45),Inches(0.88), Inches(12),Inches(0.38),size=16,color=LIGHT_BLUE) rect(s, 0, Inches(1.25), W, Inches(0.04), GOLD) points = [ ("Definition", "VDRO simultaneously corrects coxa valga (NSA to ~120°) AND increased femoral anteversion (derotation 20-40°)"), ("Indication", "Primary indication: CP hip subluxation (MP > 40-60%). Also DDH, LCPD, paralytic hips."), ("Threshold", "Operate before MP exceeds 70% and before age 8 for best results"), ("Combined Rx", "VDRO alone insufficient in ~40% — add Dega pelvic osteotomy for posterosuperior deficiency"), ("Technique", "Lateral approach, transverse osteotomy below lesser trochanter, blade plate/LCP fixation"), ("Outcomes", "84% prevent redislocation; 95% good results at 7 years with VDRO + Dega combined"), ("Complications","Medical complications = 83% of all; Surgical: AVN, resubluxation, LLD, implant failure"), ("Post-op", "Hip spica 45 deg flex / 30 deg abduction for 4-6 weeks; physiotherapy after spica removal"), ("Surveillance", "Annual AP pelvis until skeletal maturity; GMFCS V = every 6 months"), ("Failure risk", "Age < 6 yrs, MP > 70%, AI > 25 deg, GMFCS IV-V — higher recurrence risk"), ] for i,(key,val) in enumerate(points): col = i%2; row = i//2 x = Inches(0.25+col*6.62) y = Inches(1.38+row*1.15) rect(s,x,y,Inches(6.35),Inches(1.0),DARK_NAVY2) rect(s,x,y,Inches(1.6),Inches(1.0),MID_BLUE) txbox(s,key,x+Inches(0.05),y+Inches(0.25),Inches(1.5),Inches(0.5), size=13,bold=True,color=WHITE,align=PP_ALIGN.CENTER) txbox(s,val,x+Inches(1.7),y+Inches(0.1),Inches(4.55),Inches(0.8), size=13,color=LINK2) footer(s) # ─── SLIDE 13 — References ──────────────────────────────────────────────────── s = prs.slides.add_slide(blank) bg(s, WHITE) header_bar(s,"References & Further Reading","Sources and recommended literature") rect(s, 0, Inches(1.15), W, H-Inches(1.15), LIGHT_GRAY) refs = [ "1. Azar FM, Beaty JH, Campbell WC. Campbell's Operative Orthopaedics, 15th Edition. Elsevier; 2026.", "2. Miller MD. Miller's Review of Orthopaedics, 9th Edition. Elsevier; 2024.", "3. Soo B et al. Hip displacement in cerebral palsy. J Bone Joint Surg Br. 2006.", "4. Reimers J. The stability of the hip in children. A radiological study of the results of muscle surgery in CP. Acta Orthop Scand Suppl. 1980.", "5. Scrutton D, Baird G, Smeeton N. Hip dysplasia in bilateral cerebral palsy. Dev Med Child Neurol. 2001.", "6. Shore BJ, et al. Proximal femoral varus derotation osteotomy in children with CP: a systematic review. J Bone Joint Surg Am. 2012.", "7. Canavese F, Emara K. Recent developments in the management of hip dysplasia in cerebral palsy. J Pediatr Orthop B. 2021.", "8. Gordon GS et al. Dega osteotomy for acetabular dysplasia in children with spastic cerebral palsy. J Bone Joint Surg Br. 1996.", "9. Robin J et al. Proximal femoral geometry in cerebral palsy: a population-based cross-sectional study. J Bone Joint Surg Br. 2008.", "10. AACPDM. Hip surveillance guidelines for children with cerebral palsy. 2020.", ] for i,ref in enumerate(refs): y = Inches(1.42+i*0.51) rect(s,Inches(0.25),y,Inches(12.85),Inches(0.48),LIGHT_BLUE if i%2==0 else WHITE) txbox(s,ref,Inches(0.35),y+Inches(0.04),Inches(12.65),Inches(0.42),size=12,color=DARK_GRAY) rect(s,Inches(0.25),Inches(6.6),Inches(12.85),Inches(0.52),NAVY) txbox(s,"This presentation is for educational purposes only. Clinical decisions should be based on current guidelines and individual patient assessment.", Inches(0.35),Inches(6.62),Inches(12.65),Inches(0.45),size=12,color=LINK_BLUE,italic=True) footer(s) # ─── Save ───────────────────────────────────────────────────────────────────── out = "/tmp/workspace/vdro/VDRO_Presentation.pptx" prs.save(out) print(f"Saved: {out}") import os; print(f"Size: {os.path.getsize(out):,} bytes") print(f"Slides: {len(prs.slides)}") PYEOF python3 /tmp/workspace/vdro/build_vdro.py
VDRO Presentation
Presentation · PPTX
.pptx file download.