can you help me with my presentation. Basically, my topic is describe thrust and manipulation under anesthesia. And my lecture told that for manipulation, add home program and peripheral joint mobilization for shoulder techniques. For thrust, refer the class notes and some videos you can add. And she gave the reference as Therapeutic Exercise of Carolyn Kisner. Refer these images and help me to create a beautiful presentation which is meaningful and it will be like medically approved.
manipulation under anesthesia MUA shoulder peripheral joint mobilization techniques physiotherapy
mkdir -p /tmp/workspace/mua-presentation && ls /tmp/workspace/
~/mua-presentation/build_pptx.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
import copy
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank_layout = prs.slide_layouts[6]
# ─── Color Palette ────────────────────────────────────────────────
TEAL = RGBColor(0x00, 0x7B, 0x8A) # main accent
TEAL_DARK = RGBColor(0x00, 0x56, 0x64) # dark teal (headings)
TEAL_LIGHT = RGBColor(0xE0, 0xF4, 0xF6) # very light teal fill
GOLD = RGBColor(0xE6, 0xAC, 0x00) # highlight
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_GRAY = RGBColor(0x1A, 0x1A, 0x2E)
MID_GRAY = RGBColor(0x55, 0x55, 0x55)
LIGHT_GRAY = RGBColor(0xF4, 0xF7, 0xF9)
ORANGE = RGBColor(0xE8, 0x60, 0x10) # warning/note accent
GREEN = RGBColor(0x1A, 0x7A, 0x4A) # home program accent
# ─── Helper utilities ─────────────────────────────────────────────
def add_rect(slide, x, y, w, h, fill_color=None, line_color=None, line_width=Pt(1)):
shape = slide.shapes.add_shape(1, x, y, w, h) # MSO_SHAPE_TYPE.RECTANGLE
if fill_color:
shape.fill.solid()
shape.fill.fore_color.rgb = fill_color
else:
shape.fill.background()
if line_color:
shape.line.color.rgb = line_color
shape.line.width = line_width
else:
shape.line.fill.background()
return shape
def add_text(slide, text, x, y, w, h, font_size=18, bold=False, italic=False,
color=DARK_GRAY, align=PP_ALIGN.LEFT, font_name="Calibri",
word_wrap=True, v_anchor=MSO_ANCHOR.TOP):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = word_wrap
tf.vertical_anchor = v_anchor
tf.margin_left = Inches(0.05)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.03)
tf.margin_bottom= Inches(0.03)
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
run.font.name = font_name
return tb
def add_multiline(slide, lines, x, y, w, h, font_size=14, color=DARK_GRAY,
bold_first=False, line_spacing=1.15, font_name="Calibri"):
"""lines = list of (text, bold, color_override) or plain strings"""
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Inches(0.08)
tf.margin_right = Inches(0.08)
tf.margin_top = Inches(0.05)
tf.margin_bottom= Inches(0.05)
for i, line in enumerate(lines):
if isinstance(line, str):
txt, bold, col = line, False, color
else:
txt = line[0]
bold = line[1] if len(line) > 1 else False
col = line[2] if len(line) > 2 else color
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.space_after = Pt(4)
run = p.add_run()
run.text = txt
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.color.rgb = col
run.font.name = font_name
return tb
def add_badge(slide, text, x, y, w, h, bg=TEAL, fg=WHITE, font_size=13):
rect = add_rect(slide, x, y, w, h, fill_color=bg)
add_text(slide, text, x, y, w, h, font_size=font_size, bold=True,
color=fg, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
return rect
def add_divider(slide, y, color=TEAL, thickness=Pt(1.5)):
line = slide.shapes.add_connector(1, Inches(0.4), y, Inches(12.9), y)
line.line.color.rgb = color
line.line.width = thickness
def section_header(slide, title, sub, y_pos=Inches(0.25)):
"""Top banner with title and subtitle"""
add_rect(slide, Inches(0), Inches(0), prs.slide_width, Inches(1.1),
fill_color=TEAL_DARK)
add_text(slide, title,
Inches(0.4), Inches(0.05), Inches(12.5), Inches(0.6),
font_size=28, bold=True, color=WHITE, v_anchor=MSO_ANCHOR.MIDDLE)
if sub:
add_text(slide, sub,
Inches(0.4), Inches(0.62), Inches(12.5), Inches(0.4),
font_size=14, color=RGBColor(0xCC, 0xEE, 0xF2), italic=True)
def slide_bg(slide):
add_rect(slide, 0, 0, prs.slide_width, prs.slide_height,
fill_color=RGBColor(0xF8, 0xFB, 0xFD))
# ══════════════════════════════════════════════════════════════════
# SLIDE 1 — TITLE SLIDE
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank_layout)
# Deep teal full background
add_rect(slide, 0, 0, prs.slide_width, prs.slide_height, fill_color=TEAL_DARK)
# Decorative strip at top
add_rect(slide, 0, 0, prs.slide_width, Inches(0.18), fill_color=GOLD)
# Decorative strip at bottom
add_rect(slide, 0, Inches(7.32), prs.slide_width, Inches(0.18), fill_color=GOLD)
# White card in center
add_rect(slide, Inches(1.0), Inches(1.2), Inches(11.3), Inches(5.1),
fill_color=WHITE, line_color=GOLD, line_width=Pt(2))
# Teal accent left bar
add_rect(slide, Inches(1.0), Inches(1.2), Inches(0.25), Inches(5.1),
fill_color=TEAL)
add_text(slide, "THRUST &\nMANIPULATION UNDER ANESTHESIA",
Inches(1.5), Inches(1.35), Inches(10.5), Inches(2.5),
font_size=38, bold=True, color=TEAL_DARK,
align=PP_ALIGN.LEFT, v_anchor=MSO_ANCHOR.TOP)
add_text(slide, "Principles of Joint Mobilization | Manual Therapy",
Inches(1.5), Inches(3.75), Inches(10.5), Inches(0.5),
font_size=17, color=MID_GRAY, italic=True)
add_rect(slide, Inches(1.5), Inches(4.38), Inches(3.5), Inches(0.04),
fill_color=GOLD)
add_text(slide, "Reference: Therapeutic Exercise — Carolyn Kisner, 6th Ed.",
Inches(1.5), Inches(4.5), Inches(10.0), Inches(0.45),
font_size=13, color=MID_GRAY)
add_text(slide, "Physical Therapy Dept. | Lecture Presentation",
Inches(1.5), Inches(5.85), Inches(10.0), Inches(0.4),
font_size=12, color=RGBColor(0x88, 0x88, 0x88))
# ══════════════════════════════════════════════════════════════════
# SLIDE 2 — OVERVIEW / TABLE OF CONTENTS
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank_layout)
slide_bg(slide)
section_header(slide, "Presentation Overview", "Topics covered in this lecture")
topics = [
("01", "Mobilization & Manipulation — Definition & Overview"),
("02", "Thrust Manipulation (High-Velocity Thrust — HVT)"),
("03", "Manipulation Under Anesthesia (MUA)"),
("04", "Grades of Mobilization (Kaltenborn System)"),
("05", "Positioning & Stabilization Principles"),
("06", "Peripheral Joint Mobilization — Shoulder Techniques"),
("07", "Home Program for Shoulder Mobilization"),
("08", "Summary & Reference"),
]
col_x = [Inches(0.4), Inches(6.9)]
row_h = Inches(0.7)
start_y = Inches(1.25)
for i, (num, topic) in enumerate(topics):
col = i % 2
row = i // 2
x = col_x[col]
y = start_y + row * row_h
w = Inches(6.0)
bg = TEAL if col == 0 else TEAL_DARK
add_rect(slide, x, y, Inches(0.55), row_h - Inches(0.08),
fill_color=bg)
add_text(slide, num, x, y, Inches(0.55), row_h - Inches(0.08),
font_size=14, bold=True, color=WHITE,
align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, x + Inches(0.55), y, w - Inches(0.55), row_h - Inches(0.08),
fill_color=TEAL_LIGHT, line_color=TEAL, line_width=Pt(0.75))
add_text(slide, topic, x + Inches(0.62), y + Inches(0.06),
w - Inches(0.7), row_h - Inches(0.18),
font_size=13.5, color=TEAL_DARK, bold=False)
# ══════════════════════════════════════════════════════════════════
# SLIDE 3 — DEFINITION & OVERVIEW
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank_layout)
slide_bg(slide)
section_header(slide, "Mobilization & Manipulation", "Definition & Overview — Kisner")
# Key definition box
add_rect(slide, Inches(0.4), Inches(1.2), Inches(12.5), Inches(1.55),
fill_color=TEAL_DARK, line_color=GOLD, line_width=Pt(1))
add_text(slide,
"Mobilization and manipulation are passive, skilled manual therapy techniques applied to joints and related "
"soft tissues at varying speeds and amplitudes using physiological or accessory motions for therapeutic purposes.",
Inches(0.55), Inches(1.25), Inches(12.2), Inches(1.45),
font_size=14.5, color=WHITE, word_wrap=True)
# Two columns
points_l = [
("Interchangeable Terms", True, TEAL),
"Mobilization and manipulation have the same meaning and are therefore interchangeable.",
"",
("Varying Speeds & Amplitudes", True, TEAL),
"Range from a small-amplitude force at HIGH velocity (thrust) to a large-amplitude force at SLOW velocity.",
"This forms a continuum of intensities — the technique is adapted to clinical findings.",
]
points_r = [
("Physiological Movements", True, TEAL),
"Movements that occur in normal active/passive ROM (flexion, abduction, etc.)",
"",
("Accessory Movements", True, TEAL),
"Joint play movements — joint surface glides, spins, rolls — not under voluntary control.",
"Accessory motions are necessary for pain-free physiological motion.",
]
add_multiline(slide, points_l,
Inches(0.4), Inches(2.85), Inches(6.1), Inches(3.8),
font_size=13, color=DARK_GRAY)
add_multiline(slide, points_r,
Inches(6.7), Inches(2.85), Inches(6.1), Inches(3.8),
font_size=13, color=DARK_GRAY)
add_divider(slide, Inches(2.82), color=TEAL, thickness=Pt(1))
add_rect(slide, Inches(6.5), Inches(2.85), Inches(0.04), Inches(3.8),
fill_color=TEAL)
add_text(slide, "Reference: Kisner C, Colby LA. Therapeutic Exercise, 6th Ed.",
Inches(0.4), Inches(7.1), Inches(12.5), Inches(0.3),
font_size=10, color=RGBColor(0xAA, 0xAA, 0xAA), italic=True)
# ══════════════════════════════════════════════════════════════════
# SLIDE 4 — THRUST (HVT)
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank_layout)
slide_bg(slide)
section_header(slide, "Thrust Manipulation (HVT)",
"High-Velocity, Short-Amplitude Technique")
# Definition card
add_rect(slide, Inches(0.4), Inches(1.2), Inches(12.5), Inches(1.3),
fill_color=ORANGE, line_color=None)
add_text(slide,
"Thrust: A HIGH-VELOCITY, SHORT-AMPLITUDE motion — so fast that the patient cannot prevent the motion.",
Inches(0.55), Inches(1.22), Inches(12.2), Inches(1.25),
font_size=15, bold=True, color=WHITE, word_wrap=True)
# Three feature boxes
boxes = [
("Performed at...",
"The END of the pathological limit of the joint — i.e., the end of available ROM when restriction is present.",
TEAL),
("Intended to...",
"• Alter positional relationships\n• Snap adhesions around the joint\n• Stimulate joint mechanoreceptors",
TEAL_DARK),
("Pathological Limit",
"The end of available ROM when there is restriction. This is distinct from the physiological and anatomical limits.",
RGBColor(0x1A, 0x50, 0x7A)),
]
box_w = Inches(3.9)
for i, (title, body, col) in enumerate(boxes):
bx = Inches(0.4) + i * (box_w + Inches(0.22))
add_rect(slide, bx, Inches(2.65), box_w, Inches(0.4), fill_color=col)
add_text(slide, title, bx, Inches(2.65), box_w, Inches(0.4),
font_size=13, bold=True, color=WHITE,
align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, bx, Inches(3.05), box_w, Inches(1.5),
fill_color=TEAL_LIGHT, line_color=col, line_width=Pt(1))
add_text(slide, body, bx + Inches(0.08), Inches(3.1), box_w - Inches(0.16), Inches(1.4),
font_size=12.5, color=DARK_GRAY, word_wrap=True)
# Note box
add_rect(slide, Inches(0.4), Inches(4.7), Inches(12.5), Inches(1.35),
fill_color=RGBColor(0xFF, 0xF8, 0xE7), line_color=GOLD, line_width=Pt(1))
add_text(slide, "⚠ Clinical Note:",
Inches(0.55), Inches(4.75), Inches(12.0), Inches(0.35),
font_size=13, bold=True, color=RGBColor(0xB8, 0x60, 0x00))
add_text(slide,
"The terms 'thrust' and 'manipulation' are often used interchangeably. The current trend uses 'manipulation' "
"to include ALL manipulative techniques — including non-thrust techniques such as passive stretching and mobilization.",
Inches(0.55), Inches(5.1), Inches(12.1), Inches(0.9),
font_size=12.5, color=DARK_GRAY, word_wrap=True)
# YouTube video reference
add_rect(slide, Inches(0.4), Inches(6.15), Inches(12.5), Inches(0.5),
fill_color=RGBColor(0xE8, 0xF4, 0xE8), line_color=GREEN, line_width=Pt(0.75))
add_text(slide,
"🎬 Video Reference: Search YouTube — 'High Velocity Thrust Manipulation Technique' | 'Spinal HVLA Technique'",
Inches(0.55), Inches(6.17), Inches(12.0), Inches(0.46),
font_size=12, color=GREEN, italic=True)
add_text(slide, "Reference: Kisner C, Colby LA. Therapeutic Exercise, 6th Ed.",
Inches(0.4), Inches(7.1), Inches(12.5), Inches(0.3),
font_size=10, color=RGBColor(0xAA, 0xAA, 0xAA), italic=True)
# ══════════════════════════════════════════════════════════════════
# SLIDE 5 — MANIPULATION UNDER ANESTHESIA (MUA)
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank_layout)
slide_bg(slide)
section_header(slide, "Manipulation Under Anesthesia (MUA)",
"Medical Procedure — Restoring Full ROM")
# Big definition
add_rect(slide, Inches(0.4), Inches(1.2), Inches(12.5), Inches(1.2),
fill_color=TEAL_DARK)
add_text(slide,
"MUA is a medical procedure used to restore full ROM by BREAKING ADHESIONS around a joint "
"while the patient is anesthetized.",
Inches(0.55), Inches(1.23), Inches(12.2), Inches(1.15),
font_size=15, bold=False, color=WHITE, word_wrap=True)
# Two columns: Technique + Indications
# Left column
add_rect(slide, Inches(0.4), Inches(2.52), Inches(5.9), Inches(0.38), fill_color=TEAL)
add_text(slide, "TECHNIQUE", Inches(0.4), Inches(2.52), Inches(5.9), Inches(0.38),
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
tech_lines = [
("The technique may be:", True, TEAL_DARK),
"• A rapid THRUST (high-velocity, short-amplitude)",
"• A PASSIVE STRETCH using physiological movements",
"• A PASSIVE STRETCH using accessory movements",
"",
("Performed while patient is under general or local anesthesia",
False, MID_GRAY),
("Allows the therapist to restore motion without patient guarding or pain response",
False, MID_GRAY),
]
add_multiline(slide, tech_lines, Inches(0.5), Inches(2.98),
Inches(5.7), Inches(3.1), font_size=13, color=DARK_GRAY)
# Right column
add_rect(slide, Inches(6.8), Inches(2.52), Inches(6.1), Inches(0.38), fill_color=ORANGE)
add_text(slide, "PRIMARY INDICATION: FROZEN SHOULDER (Adhesive Capsulitis)",
Inches(6.8), Inches(2.52), Inches(6.1), Inches(0.38),
font_size=11, bold=True, color=WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
ind_lines = [
("When is MUA indicated?", True, ORANGE),
"• Idiopathic frozen shoulder (adhesive capsulitis)",
"• Maximum stiffness stage — when night pain is decreasing but ROM loss is maximal",
"• When conventional physiotherapy alone cannot break adhesions",
"",
("Goal:", True, TEAL_DARK),
"Restore full ROM — especially shoulder flexion, abduction, and internal/external rotation",
"",
("Post-MUA Physiotherapy is ESSENTIAL", True, GREEN),
"PT immediately after MUA maintains the ROM achieved during procedure",
]
add_multiline(slide, ind_lines, Inches(6.9), Inches(2.98),
Inches(5.8), Inches(3.5), font_size=12.5, color=DARK_GRAY)
add_rect(slide, Inches(6.6), Inches(2.52), Inches(0.04), Inches(4.0),
fill_color=TEAL)
# Caution box
add_rect(slide, Inches(0.4), Inches(6.18), Inches(12.5), Inches(0.5),
fill_color=RGBColor(0xFF, 0xEB, 0xEB), line_color=RGBColor(0xCC, 0x00, 0x00), line_width=Pt(0.75))
add_text(slide,
"⚠ Complications: Traction injury to brachial plexus | Humeral shaft fracture — apply force through full humerus length, avoid scapular elevation",
Inches(0.55), Inches(6.21), Inches(12.0), Inches(0.44),
font_size=11.5, color=RGBColor(0xAA, 0x00, 0x00), italic=True)
add_text(slide, "Reference: Kisner C, Colby LA. Therapeutic Exercise, 6th Ed. | Shoulderdoc.co.uk",
Inches(0.4), Inches(7.1), Inches(12.5), Inches(0.3),
font_size=10, color=RGBColor(0xAA, 0xAA, 0xAA), italic=True)
# ══════════════════════════════════════════════════════════════════
# SLIDE 6 — GRADES OF MOBILIZATION (KALTENBORN)
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank_layout)
slide_bg(slide)
section_header(slide, "Grades of Mobilization",
"Kaltenborn Sustained Translatory Joint Play Technique")
# Maitland grades - left column
add_rect(slide, Inches(0.4), Inches(1.2), Inches(6.0), Inches(0.4),
fill_color=TEAL_DARK)
add_text(slide, "MAITLAND — Oscillatory Grades (I–IV)",
Inches(0.4), Inches(1.2), Inches(6.0), Inches(0.4),
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
mait_grades = [
("Grade I", "Small-amplitude oscillation at BEGINNING of range — no stress on capsule. "
"Used for PAIN RELIEF (neurophysiological effect)."),
("Grade II", "Large-amplitude oscillation within the range, NOT reaching end range — "
"tightens tissues around joint. Used for PAIN RELIEF."),
("Grade III", "Large-amplitude oscillation up to the END of available range — "
"places stretch on joint capsule. Used to INCREASE ROM."),
("Grade IV", "Small-amplitude oscillation at the END of range — "
"places high stress on capsule. Used to INCREASE ROM."),
]
colors = [TEAL, RGBColor(0x00, 0x8C, 0x7A), RGBColor(0x00, 0x6A, 0x8A), TEAL_DARK]
for i, (grade, desc) in enumerate(mait_grades):
gy = Inches(1.7) + i * Inches(1.1)
add_rect(slide, Inches(0.4), gy, Inches(1.2), Inches(1.0), fill_color=colors[i])
add_text(slide, grade, Inches(0.4), gy, Inches(1.2), Inches(1.0),
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, Inches(1.6), gy, Inches(4.8), Inches(1.0),
fill_color=TEAL_LIGHT, line_color=colors[i], line_width=Pt(0.75))
add_text(slide, desc, Inches(1.7), gy + Inches(0.06), Inches(4.6), Inches(0.88),
font_size=12, color=DARK_GRAY, word_wrap=True)
# Clinical use note (grades)
add_rect(slide, Inches(0.4), Inches(6.1), Inches(6.0), Inches(0.58),
fill_color=RGBColor(0xFF, 0xF8, 0xE7), line_color=GOLD, line_width=Pt(0.8))
add_text(slide,
"Grades I & II → Pain-limited joints (gentle oscillation relieves pain neurophysiologically & mechanically)\n"
"Grades III & IV → Stiffness-limited joints (stretching to increase ROM)",
Inches(0.52), Inches(6.13), Inches(5.8), Inches(0.52),
font_size=11.5, color=RGBColor(0x66, 0x44, 0x00), word_wrap=True)
# Kaltenborn - right column
add_rect(slide, Inches(6.8), Inches(1.2), Inches(6.1), Inches(0.4),
fill_color=TEAL_DARK)
add_text(slide, "KALTENBORN — Sustained Translatory Grades",
Inches(6.8), Inches(1.2), Inches(6.1), Inches(0.4),
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
kalt_grades = [
("Grade I", TEAL,
"Small-amplitude DISTRACTION — no stress on capsule.\n"
"Used to relieve pain (unloading joint)."),
("Grade II", RGBColor(0x00, 0x6A, 0x8A),
"Enough distraction/glide to TIGHTEN tissues around the joint.\n"
"Takes up the slack — begins to apply tension."),
("Grade III", TEAL_DARK,
"Distraction/glide with amplitude large enough to STRETCH the joint capsule "
"and surrounding periarticular structures.\n"
"Used to increase ROM."),
]
for i, (grade, col, desc) in enumerate(kalt_grades):
gy = Inches(1.7) + i * Inches(1.25)
add_rect(slide, Inches(6.8), gy, Inches(1.3), Inches(1.15), fill_color=col)
add_text(slide, grade, Inches(6.8), gy, Inches(1.3), Inches(1.15),
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, Inches(8.1), gy, Inches(4.8), Inches(1.15),
fill_color=TEAL_LIGHT, line_color=col, line_width=Pt(0.75))
add_text(slide, desc, Inches(8.2), gy + Inches(0.07), Inches(4.6), Inches(1.0),
font_size=12, color=DARK_GRAY, word_wrap=True)
# Diagram legend
add_rect(slide, Inches(6.8), Inches(5.1), Inches(6.1), Inches(1.6),
fill_color=RGBColor(0xF0, 0xF8, 0xFF), line_color=TEAL, line_width=Pt(0.75))
add_text(slide, "Kaltenborn Diagram:",
Inches(6.95), Inches(5.13), Inches(5.8), Inches(0.3),
font_size=12, bold=True, color=TEAL_DARK)
diagram_text = (
" |——→ Grade I (within available joint play)\n"
" |————————→ Grade II (to tissue resistance)\n"
" |——————————————→ Grade III (beyond tissue resistance → Stretch)"
)
add_text(slide, diagram_text,
Inches(6.95), Inches(5.45), Inches(5.8), Inches(1.1),
font_size=11, color=DARK_GRAY, font_name="Courier New")
add_rect(slide, Inches(6.6), Inches(1.2), Inches(0.04), Inches(5.5),
fill_color=TEAL)
add_text(slide, "Reference: Kisner C, Colby LA. Therapeutic Exercise, 6th Ed.",
Inches(0.4), Inches(7.1), Inches(12.5), Inches(0.3),
font_size=10, color=RGBColor(0xAA, 0xAA, 0xAA), italic=True)
# ══════════════════════════════════════════════════════════════════
# SLIDE 7 — POSITIONING & STABILIZATION
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank_layout)
slide_bg(slide)
section_header(slide, "Positioning & Stabilization",
"Principles of Joint Mobilization Setup")
# 3 principle cards
principle_data = [
("Patient & Extremity Positioning",
TEAL,
[
"Patient and extremity must be positioned so the patient can fully RELAX.",
"Muscle guarding will resist mobilization and reduce effectiveness.",
"Use pillows, bolsters, and plinth adjustments for comfort.",
"Loose-packed (resting) position preferred for initial assessment.",
]),
("Resting Position (Examination)",
RGBColor(0x00, 0x6A, 0x8A),
[
"Joint play (accessory motion) is examined in the RESTING POSITION.",
"Resting position = position of GREATEST CAPSULAR LAXITY.",
"This allows maximal joint play and most accurate assessment.",
"Example — Shoulder: 55° abduction, 30° horizontal adduction, neutral rotation.",
]),
("Stabilization",
TEAL_DARK,
[
"FIRM STABILIZATION of one joint partner is required — usually the PROXIMAL segment.",
"Prevents unwanted motion at adjacent joints.",
"Stabilization can be by: therapist's hand, belt, wedge, or treatment table.",
"Only the bone being mobilized (distal) should move.",
]),
]
card_w = Inches(4.0)
for i, (title, col, points) in enumerate(principle_data):
cx = Inches(0.4) + i * (card_w + Inches(0.22))
# Header
add_rect(slide, cx, Inches(1.25), card_w, Inches(0.5), fill_color=col)
add_text(slide, title, cx, Inches(1.25), card_w, Inches(0.5),
font_size=13, bold=True, color=WHITE,
align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
# Card body
add_rect(slide, cx, Inches(1.75), card_w, Inches(4.5),
fill_color=WHITE, line_color=col, line_width=Pt(1.2))
for j, pt in enumerate(points):
add_text(slide, f"• {pt}",
cx + Inches(0.12), Inches(1.85) + j * Inches(1.0),
card_w - Inches(0.24), Inches(0.95),
font_size=12.5, color=DARK_GRAY, word_wrap=True)
# Bottom summary
add_rect(slide, Inches(0.4), Inches(6.4), Inches(12.5), Inches(0.55),
fill_color=TEAL_LIGHT, line_color=TEAL, line_width=Pt(0.75))
add_text(slide,
"Key Principle: Firm stabilization of the PROXIMAL partner + Mobilize the DISTAL partner → "
"Ensures isolated, controlled accessory motion for optimal therapeutic effect.",
Inches(0.55), Inches(6.43), Inches(12.0), Inches(0.49),
font_size=12.5, bold=False, color=TEAL_DARK, word_wrap=True)
add_text(slide, "Reference: Kisner C, Colby LA. Therapeutic Exercise, 6th Ed.",
Inches(0.4), Inches(7.1), Inches(12.5), Inches(0.3),
font_size=10, color=RGBColor(0xAA, 0xAA, 0xAA), italic=True)
# ══════════════════════════════════════════════════════════════════
# SLIDE 8 — PERIPHERAL JOINT MOBILIZATION: SHOULDER TECHNIQUES
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank_layout)
slide_bg(slide)
section_header(slide, "Peripheral Joint Mobilization — Shoulder",
"Glenohumeral Joint Techniques (Kisner)")
techniques = [
("Inferior Glide\n(Caudal Traction)",
TEAL,
"Patient: Supine | Shoulder: ~55° abduction (resting position)\n"
"Therapist: Stabilize scapula; apply inferior glide on proximal humerus\n"
"Indication: Restricted abduction and flexion\n"
"Effect: Increases abduction/flexion ROM"),
("Posterior Glide",
RGBColor(0x00, 0x6A, 0x8A),
"Patient: Supine | Shoulder: 55–90° abduction\n"
"Therapist: Stabilize glenoid; glide humeral head posteriorly\n"
"Indication: Restricted internal rotation & flexion\n"
"Effect: Increases IR and horizontal adduction ROM"),
("Anterior Glide",
TEAL_DARK,
"Patient: Prone | Shoulder: over table edge, slight abduction\n"
"Therapist: Stabilize anterior scapula; glide humeral head anteriorly\n"
"Indication: Restricted external rotation and extension\n"
"Effect: Increases ER and extension ROM"),
("Long-Axis Traction\n(Distraction)",
RGBColor(0x00, 0x45, 0x60),
"Patient: Supine | Arm: resting position (55° abd, 30° horiz. add.)\n"
"Therapist: Grasp distal humerus; apply longitudinal distraction\n"
"Indication: General joint tightness, pain; all grades\n"
"Effect: Pain relief (Grades I–II); capsule stretch (Grade III)"),
]
tw = Inches(3.0)
for i, (title, col, body) in enumerate(techniques):
col_x2 = Inches(0.35) + i * (tw + Inches(0.15))
add_rect(slide, col_x2, Inches(1.2), tw, Inches(0.55), fill_color=col)
add_text(slide, title, col_x2, Inches(1.2), tw, Inches(0.55),
font_size=12.5, bold=True, color=WHITE,
align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
add_rect(slide, col_x2, Inches(1.75), tw, Inches(4.5),
fill_color=TEAL_LIGHT, line_color=col, line_width=Pt(1))
add_text(slide, body, col_x2 + Inches(0.1), Inches(1.85), tw - Inches(0.2), Inches(4.3),
font_size=11.5, color=DARK_GRAY, word_wrap=True)
add_rect(slide, Inches(0.35), Inches(6.37), Inches(12.6), Inches(0.42),
fill_color=TEAL_LIGHT, line_color=TEAL, line_width=Pt(0.75))
add_text(slide,
"All techniques: Stabilize proximal (scapula/glenoid) | Mobilize distal (humerus) | "
"Perform at resting position (greatest capsular laxity) | Progress grade based on response",
Inches(0.5), Inches(6.4), Inches(12.2), Inches(0.38),
font_size=11.5, color=TEAL_DARK, word_wrap=True)
add_text(slide, "Reference: Kisner C, Colby LA. Therapeutic Exercise, 6th Ed.",
Inches(0.4), Inches(7.1), Inches(12.5), Inches(0.3),
font_size=10, color=RGBColor(0xAA, 0xAA, 0xAA), italic=True)
# ══════════════════════════════════════════════════════════════════
# SLIDE 9 — HOME PROGRAM
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank_layout)
slide_bg(slide)
section_header(slide, "Home Program — Shoulder Mobilization",
"Self-Mobilization & Auto-Mobilization (Post-MUA / Post-Treatment)")
# Left: Purpose
add_rect(slide, Inches(0.4), Inches(1.25), Inches(4.1), Inches(0.4), fill_color=GREEN)
add_text(slide, "PURPOSE OF HOME PROGRAM",
Inches(0.4), Inches(1.25), Inches(4.1), Inches(0.4),
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
purpose_lines = [
"• Maintain ROM gains achieved during clinic treatment or MUA",
"• Reduce stiffness from daily inactivity",
"• Reinforce neuromuscular patterns of normal joint movement",
"• Empower patient in their own recovery",
"• Prevent recurrence of adhesions",
]
add_multiline(slide, purpose_lines,
Inches(0.4), Inches(1.7), Inches(4.1), Inches(2.5),
font_size=13, color=DARK_GRAY)
# Middle: Self-stretches
add_rect(slide, Inches(4.7), Inches(1.25), Inches(4.1), Inches(0.4), fill_color=TEAL)
add_text(slide, "SELF-MOBILIZATION EXERCISES",
Inches(4.7), Inches(1.25), Inches(4.1), Inches(0.4),
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
self_mob = [
("Pendulum (Codman's) Exercises",
"Forward/backward & circular pendulum with arm hanging — uses gravity to distract GH joint"),
("Pulley Exercises",
"Overhead pulley — unaffected arm assists affected arm into elevation"),
("Wall Walking / Finger Ladder",
"Fingers walk up wall for shoulder flexion & abduction ROM"),
("Towel Stretch",
"Cross-body internal rotation stretch using towel behind back"),
("Doorway Stretch",
"Pectorals/anterior capsule stretch — hands on doorframe, step forward"),
]
for i, (title, desc) in enumerate(self_mob):
add_rect(slide, Inches(4.7), Inches(1.72) + i * Inches(0.85), Inches(4.1), Inches(0.82),
fill_color=TEAL_LIGHT, line_color=TEAL, line_width=Pt(0.6))
add_text(slide, title, Inches(4.8), Inches(1.74) + i * Inches(0.85),
Inches(3.9), Inches(0.28),
font_size=12, bold=True, color=TEAL_DARK)
add_text(slide, desc, Inches(4.8), Inches(2.02) + i * Inches(0.85),
Inches(3.9), Inches(0.5),
font_size=11, color=MID_GRAY, word_wrap=True)
# Right: Instructions
add_rect(slide, Inches(9.05), Inches(1.25), Inches(4.05), Inches(0.4), fill_color=ORANGE)
add_text(slide, "HOME PROGRAM INSTRUCTIONS",
Inches(9.05), Inches(1.25), Inches(4.05), Inches(0.4),
font_size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER, v_anchor=MSO_ANCHOR.MIDDLE)
instr_lines = [
("Frequency & Dosage:", True, ORANGE),
"• 3–5 times per day",
"• 10–20 repetitions per exercise",
"• Hold stretches 20–30 seconds",
"",
("Progression:", True, TEAL_DARK),
"• Start with Grade I–II (pain-free range)",
"• Progress to Grade III when pain resolves",
"• Use ice 10 min after if soreness",
"",
("Precautions:", True, RGBColor(0xAA, 0x00, 0x00)),
"• Avoid forceful, jerky movements",
"• Stop if sharp pain occurs",
"• Report increased pain/swelling to therapist",
]
add_multiline(slide, instr_lines,
Inches(9.05), Inches(1.7), Inches(4.05), Inches(4.8),
font_size=12.5, color=DARK_GRAY)
add_rect(slide, Inches(0.4), Inches(6.88), Inches(12.55), Inches(0.38),
fill_color=GREEN, line_color=None)
add_text(slide,
"Self-mobilization: Self-stretching techniques that use joint traction or glides to direct the stretch force to the joint capsule — Kisner",
Inches(0.55), Inches(6.9), Inches(12.0), Inches(0.33),
font_size=11.5, color=WHITE, italic=True)
# ══════════════════════════════════════════════════════════════════
# SLIDE 10 — SUMMARY & REFERENCE
# ══════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank_layout)
slide_bg(slide)
section_header(slide, "Summary", "Key Take-Home Points")
summary_points = [
(TEAL, "Mobilization / Manipulation",
"Passive manual therapy techniques — physiological or accessory motions — at varying speeds & amplitudes."),
(ORANGE, "Thrust (HVT)",
"High-velocity, short-amplitude — at pathological limit — alters positional relationships, snaps adhesions, stimulates receptors."),
(TEAL_DARK, "MUA (Manipulation Under Anesthesia)",
"Restores full ROM by breaking adhesions — rapid thrust or passive stretch — indicated for frozen shoulder. PT immediately post-MUA is essential."),
(GREEN, "Grades (Kaltenborn I–III)",
"Grade I = no stress on capsule; Grade II = tighten tissues; Grade III = stretch capsule & periarticular structures."),
(RGBColor(0x00, 0x6A, 0x8A), "Maitland Grades I–IV",
"I & II for pain relief; III & IV as stretching to increase ROM."),
(RGBColor(0x55, 0x44, 0x99), "Positioning & Stabilization",
"Resting position (max capsular laxity); firm stabilization of proximal partner; mobilize distal bone."),
]
for i, (col, heading, body) in enumerate(summary_points):
row = i // 2
c = i % 2
sx = Inches(0.4) + c * Inches(6.5)
sy = Inches(1.25) + row * Inches(1.45)
sw = Inches(6.1)
sh = Inches(1.35)
add_rect(slide, sx, sy, Inches(0.18), sh, fill_color=col)
add_rect(slide, sx + Inches(0.18), sy, sw - Inches(0.18), sh,
fill_color=WHITE, line_color=col, line_width=Pt(0.75))
add_text(slide, heading, sx + Inches(0.28), sy + Inches(0.05),
sw - Inches(0.35), Inches(0.33),
font_size=13.5, bold=True, color=col)
add_text(slide, body, sx + Inches(0.28), sy + Inches(0.38),
sw - Inches(0.35), Inches(0.88),
font_size=12, color=DARK_GRAY, word_wrap=True)
# Reference box
add_rect(slide, Inches(0.4), Inches(5.7), Inches(12.5), Inches(1.15),
fill_color=TEAL_DARK, line_color=GOLD, line_width=Pt(1.5))
add_text(slide, "📚 REFERENCES",
Inches(0.6), Inches(5.75), Inches(12.0), Inches(0.33),
font_size=14, bold=True, color=GOLD)
ref_text = (
"Kisner C, Colby LA, Borstad J. Therapeutic Exercise: Foundations and Techniques, 6th Ed. F.A. Davis, 2012.\n"
"Maitland GD. Peripheral Manipulation, 3rd Ed. | Kaltenborn FM. Manual Mobilization of the Joints, 6th Ed."
)
add_text(slide, ref_text,
Inches(0.6), Inches(6.1), Inches(12.0), Inches(0.7),
font_size=12.5, color=WHITE, word_wrap=True)
# Video note
add_rect(slide, Inches(0.4), Inches(6.95), Inches(12.5), Inches(0.42),
fill_color=RGBColor(0xE8, 0xF4, 0xE8), line_color=GREEN, line_width=Pt(0.75))
add_text(slide,
"🎬 Recommended Videos: 'Shoulder MUA Frozen Shoulder' | 'HVLA Thrust Technique Spine' | "
"'Maitland Shoulder Mobilization' | 'Kaltenborn Grade III Shoulder' — search on YouTube",
Inches(0.55), Inches(6.97), Inches(12.0), Inches(0.38),
font_size=11, color=GREEN, italic=True)
# ══════════════════════════════════════════════════════════════════
# SAVE
# ══════════════════════════════════════════════════════════════════
out_path = "/tmp/workspace/mua-presentation/Thrust_and_MUA_Presentation.pptx"
prs.save(out_path)
print(f"Saved: {out_path}")
cd /tmp/workspace/mua-presentation && python build_pptx.py 2>&1
ls -lh /tmp/workspace/mua-presentation/Thrust_and_MUA_Presentation.pptx
cd /tmp/workspace/mua-presentation && python -c " from pptx import Presentation prs = Presentation('Thrust_and_MUA_Presentation.pptx') print(f'Total slides: {len(prs.slides)}') for i, slide in enumerate(prs.slides, 1): texts = [] for shape in slide.shapes: if shape.has_text_frame: t = shape.text_frame.text.strip() if t: texts.append(t[:60]) print(f'Slide {i}: {texts[:2]}') "
Thrust and MUA Presentation
Presentation · PPTX
| # | Slide Title | Content |
|---|---|---|
| 1 | Title Slide | "Thrust & Manipulation Under Anesthesia" — professional teal/gold design with Kisner reference |
| 2 | Table of Contents | 8-topic overview with numbered badges |
| 3 | Definition & Overview | Mobilization/Manipulation definition from Kisner — physiological vs. accessory movements |
| 4 | Thrust (HVT) | High-velocity short-amplitude definition, pathological limit, clinical note, YouTube video search suggestion |
| 5 | Manipulation Under Anesthesia (MUA) | Full definition, technique (thrust or passive stretch), indications (frozen shoulder), complications, post-MUA PT |
| 6 | Grades of Mobilization | Maitland Grades I–IV (left) + Kaltenborn Grades I–III with diagram (right) — both from your notes |
| 7 | Positioning & Stabilization | 3 principle cards: patient positioning, resting position, proximal stabilization |
| 8 | Peripheral Joint Mobilization — Shoulder | 4 GH joint techniques: inferior glide, posterior glide, anterior glide, long-axis traction |
| 9 | Home Program | Purpose + 5 self-mobilization exercises (Codman's, pulley, wall walk, towel, doorway) + frequency/precautions |
| 10 | Summary & References | 6-point summary + Kisner + Maitland + Kaltenborn full references + video search suggestions |