Rebuilding the Base: Pelvic Floor Rehabilitation in Cervical Cancer survivorship please prepare Professional presentation ppt presented by physiotherapist conference
"cervical cancer" AND "pelvic floor"
cervical cancer survivorship pelvic floor rehabilitation guideline physiotherapy
female pelvic floor muscles anatomy diagram sagittal view
cervical cancer pelvic radiotherapy late effects bladder bowel sexual dysfunction diagram
~/
gynecologic cancer AND pelvic floor rehabilitation
cervical cancer AND sexual rehabilitation
https://www.macmillan.org.uk/cancer-information-and-support/…
mkdir -p "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/src" "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output" "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/assets" && printf 'directories created\n'
~/pelvic-floor-cervical-cancer-ppt/src/build_presentation.py
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.dml import MSO_THEME_COLOR
from pptx.enum.text import MSO_AUTO_SIZE
from pptx.oxml.xmlchemy import OxmlElement
from pptx.oxml.ns import qn
OUT = '/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output/Rebuilding_the_Base_Pelvic_Floor_Rehabilitation_Cervical_Cancer_Survivorship.pptx'
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
# Palette
NAVY = RGBColor(18, 45, 64)
TEAL = RGBColor(21, 129, 129)
SEA = RGBColor(111, 191, 183)
MINT = RGBColor(224, 244, 240)
CORAL = RGBColor(221, 100, 86)
GOLD = RGBColor(231, 177, 81)
INK = RGBColor(35, 52, 64)
MUTED = RGBColor(94, 112, 123)
PALE = RGBColor(247, 249, 248)
WHITE = RGBColor(255,255,255)
LIGHT = RGBColor(231, 237, 238)
def set_bg(slide, color=WHITE):
bg = slide.background
fill = bg.fill
fill.solid(); fill.fore_color.rgb = color
def no_line(shape):
shape.line.fill.background()
def rect(slide,x,y,w,h,fill, radius=False, line=None):
sh=slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE if radius else MSO_SHAPE.RECTANGLE, Inches(x), Inches(y), Inches(w), Inches(h))
sh.fill.solid(); sh.fill.fore_color.rgb=fill
if line: sh.line.color.rgb=line
else: no_line(sh)
return sh
def line(slide,x1,y1,x2,y2,color=TEAL,width=1.5):
sh=slide.shapes.add_connector(MSO_CONNECTOR.STRAIGHT, Inches(x1), Inches(y1), Inches(x2), Inches(y2))
sh.line.color.rgb=color; sh.line.width=Pt(width)
return sh
def text(slide, txt, x,y,w,h, size=18, color=INK, bold=False, font='Aptos', align=PP_ALIGN.LEFT, valign=MSO_ANCHOR.TOP, margin=0.03):
tb=slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf=tb.text_frame; tf.clear(); tf.word_wrap=True; tf.margin_left=Inches(margin);tf.margin_right=Inches(margin);tf.margin_top=Inches(margin);tf.margin_bottom=Inches(margin); tf.vertical_anchor=valign
p=tf.paragraphs[0]; p.alignment=align
r=p.add_run(); r.text=txt; r.font.name=font; r.font.size=Pt(size); r.font.bold=bold; r.font.color.rgb=color
return tb
def para_box(slide, items, x,y,w,h, size=16, color=INK, bullet=True, leading=1.2):
tb=slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)); tf=tb.text_frame; tf.clear(); tf.word_wrap=True
tf.margin_left=Inches(.06);tf.margin_right=Inches(.04);tf.margin_top=Inches(.02);tf.margin_bottom=Inches(.02)
for i,item in enumerate(items):
p=tf.paragraphs[0] if i==0 else tf.add_paragraph()
p.text=item; p.font.name='Aptos'; p.font.size=Pt(size); p.font.color.rgb=color; p.space_after=Pt(size*0.48); p.level=0
if bullet:
p.text='• '+item
return tb
def title(slide,kicker,heading,subtitle=None, num=None):
text(slide,kicker.upper(),.62,.38,5,.28,10,TEAL,True, font='Aptos Display')
text(slide,heading,.62,.68,12.0,.58,27,NAVY,True,font='Aptos Display')
if subtitle: text(slide,subtitle,.64,1.29,11.6,.32,12,MUTED)
line(slide,.62,1.67,12.7,1.67,LIGHT,1)
if num is not None:
text(slide,f'{num:02d}',12.15,.35,.52,.32,11,TEAL,True,align=PP_ALIGN.RIGHT)
def footer(slide,n,source=None):
line(slide,.62,7.04,12.70,7.04,LIGHT,.8)
text(slide,'PHYSIOTHERAPY CONFERENCE | CERVICAL CANCER SURVIVORSHIP',.62,7.12,7.8,.18,8,MUTED,True)
if source: text(slide,source,8.0,7.11,4.7,.20,7.4,MUTED,False,align=PP_ALIGN.RIGHT)
text(slide,str(n),12.8,7.10,.2,.2,8,TEAL,True,align=PP_ALIGN.RIGHT)
def pill(slide,label,x,y,w,fill=TEAL,fg=WHITE):
r=rect(slide,x,y,w,.34,fill,True)
text(slide,label,x+.08,y+.05,w-.16,.18,9,fg,True,align=PP_ALIGN.CENTER)
def circle(slide,x,y,d,fill,txt=None,ts=16,fg=WHITE):
sh=slide.shapes.add_shape(MSO_SHAPE.OVAL, Inches(x), Inches(y), Inches(d), Inches(d));sh.fill.solid();sh.fill.fore_color.rgb=fill;no_line(sh)
if txt: text(slide,txt,x,y+d*.28,d,d*.35,ts,fg,True,align=PP_ALIGN.CENTER)
return sh
# 1 Title
s=prs.slides.add_slide(blank);set_bg(s,NAVY)
# decorative background rings
for x,y,d,c,a in [(9.6,-.55,4.2,TEAL,0),(10.5,.35,2.8,SEA,0),(8.45,4.35,4.7,TEAL,0)]:
sh=slide_shape=s.shapes.add_shape(MSO_SHAPE.OVAL,Inches(x),Inches(y),Inches(d),Inches(d)); sh.fill.solid();sh.fill.fore_color.rgb=c;sh.fill.transparency=72;no_line(sh)
text(s,'REBUILDING THE BASE',.72,.72,8.6,.35,15,SEA,True,font='Aptos Display')
text(s,'Pelvic Floor Rehabilitation\nin Cervical Cancer Survivorship',.70,1.25,9.2,1.65,34,WHITE,True,font='Aptos Display')
text(s,'A physiotherapy-led framework for bladder, bowel, sexual health, pain, and participation',.75,3.15,7.6,.55,17,RGBColor(219,235,235))
# foundation visual
for i,(lab,col) in enumerate([('SAFETY',CORAL),('FUNCTION',TEAL),('INTIMACY',GOLD),('PARTICIPATION',SEA)]):
rect(s,.78+i*1.85,4.35,1.62,.67,col,True);text(s,lab,.84+i*1.85,4.59,1.50,.17,9,WHITE,True,align=PP_ALIGN.CENTER)
line(s,.85,5.34,7.75,5.34,SEA,4)
text(s,'Presented by: [Name], PT, Pelvic Health Physiotherapist',.75,6.35,7.5,.25,12,WHITE,True)
text(s,'[Conference] • [City] • 2026',.75,6.68,5,.2,10,RGBColor(191,218,218))
# 2 objectives
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Why this matters','From survival to lived function','A survivorship consult is a rehabilitation opportunity.',2)
items=[('Recognise','treatment-related pelvic floor phenotypes'),('Assess','with consent, screening, and function-first measures'),('Treat','with targeted, graded, multidisciplinary rehabilitation'),('Refer','for red flags and complex late effects')]
for i,(a,b) in enumerate(items):
y=2.0+i*1.0; circle(s,.85,y,.52,[TEAL,CORAL,GOLD,SEA][i],str(i+1),14);text(s,a,1.55,y+.03,2.1,.28,18,NAVY,True);text(s,b,3.65,y+.06,6.8,.25,15,INK);line(s,1.55,y+.66,11.9,y+.66,LIGHT,.8)
rect(s,10.4,2.02,1.55,3.85,MINT,True);text(s,'REBUILD\nTHE\nBASE',10.62,2.68,1.1,1.8,18,TEAL,True,align=PP_ALIGN.CENTER,valign=MSO_ANCHOR.MIDDLE)
footer(s,2)
# 3 biology of impact
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Clinical context','Treatment changes the system, not just a muscle','Symptoms can be mixed: weakness, overactivity, altered sensation, tissue change, and fear-avoidance.',3)
# treatment cards
cards=[('Surgery','Nerve and support disruption\nBladder emptying changes\nScar and mobility restrictions',CORAL),('Chemoradiation','Fibrosis and reduced extensibility\nMucosal dryness / stenosis\nBowel and bladder irritability',TEAL),('Survivorship context','Deconditioning and fatigue\nMenopause effects\nAnxiety, trauma, relationship factors',GOLD)]
for i,(h,b,c) in enumerate(cards):
x=.72+i*4.17;rect(s,x,2.02,3.68,2.65,PALE,True);rect(s,x,2.02,3.68,.16,c,False);text(s,h,x+.25,2.38,3.1,.28,18,NAVY,True);para_box(s,b.split('\n'),x+.25,2.9,3.05,1.45,14,INK,True)
text(s,'Rehabilitation implication: evaluate coordination and relaxation as carefully as strength.',.83,5.38,11.4,.42,18,TEAL,True)
footer(s,3,'Sources: Berek & Novak; Campbell-Walsh; Macmillan')
# 4 domains
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Survivorship burden','Five domains, one person','Avoid siloed symptom management.',4)
center=(6.18,3.85)
circle(s,5.40,3.08,1.55,NAVY,'LIVED\nFUNCTION',14)
domains=[('Bladder','urgency • leakage • retention',6.13,1.93,TEAL),('Bowel','urgency • constipation • leakage',8.75,3.30,GOLD),('Sexual health','pain • dryness • stenosis',7.44,5.23,CORAL),('Pain & mobility','myofascial • hip • scar',3.15,5.23,SEA),('Identity & mood','body image • fear • relationships',2.10,3.30,TEAL)]
for h,b,x,y,c in domains:
circle(s,x,y,.76,c);text(s,h,x-.35,y+.84,1.5,.22,12,NAVY,True,align=PP_ALIGN.CENTER);text(s,b,x-1.0,y+1.13,2.8,.34,9,MUTED,align=PP_ALIGN.CENTER)
line(s,x+.38,y+.38,6.18,3.85,LIGHT,1)
footer(s,4,'Source: Macmillan pelvic radiotherapy information')
# 5 assessment
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Assessment','Start with permission. End with a shared plan.','The pelvic exam is optional, staged, and never the entry ticket to care.',5)
steps=[('1','Ask','What changed? What matters? What is safe to discuss?'),('2','Screen','Cancer status, recurrence concerns, infection, bleeding, obstruction, fracture risk.'),('3','Measure','Bladder/bowel diary, pain, sexual concerns, activity, QoL, goals.'),('4','Examine','Posture, breathing, abdominal wall, hip, scar, external and internal exam only with consent.'),('5','Plan','Education, self-management, treatment dose, review window, referral pathway.')]
for i,(n,h,b) in enumerate(steps):
x=.75+i*2.47; circle(s,x,2.05,.58,[TEAL,SEA,GOLD,CORAL,NAVY][i],n,14);text(s,h,x-.05,2.78,1.9,.25,16,NAVY,True);text(s,b,x-.05,3.15,2.0,1.2,11,INK)
if i<4: line(s,x+.65,2.34,x+2.22,2.34,LIGHT,1.2)
rect(s,.78,5.55,11.75,.58,MINT,True);text(s,'Language cue: “Would it be okay if we talk about bladder, bowel, pain, and intimacy as part of your recovery?”',1.03,5.72,11.2,.2,14,TEAL,True,align=PP_ALIGN.CENTER)
footer(s,5,'Source: Deffieux et al., 2023, PMID 37258002')
# 6 phenotype
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Clinical reasoning','Phenotype before prescription','A “Kegel-only” approach can miss high tone, pain, and evacuation dysfunction.',6)
cols=[('UNDERACTIVE / POOR SUPPORT',TEAL,['Stress leakage','Reduced squeeze/endurance','Pelvic organ support symptoms'],['Motor learning','Graded strengthening','Pressure management']),('OVERACTIVE / PROTECTIVE',CORAL,['Pelvic pain / dyspareunia','Urgency with guarding','Constipation / incomplete evacuation'],['Down-training','Breath and mobility','Manual / self-release as indicated']),('MIXED / COMPLEX',GOLD,['Radiation tissue change','Altered sensation','Fear, fatigue, multiple symptoms'],['Prioritise one goal','Pace and titrate','Coordinate specialist care'])]
for i,(h,c,signs,approach) in enumerate(cols):
x=.68+i*4.23;rect(s,x,1.98,3.85,4.48,PALE,True);rect(s,x,1.98,3.85,.22,c);text(s,h,x+.22,2.38,3.32,.4,14,NAVY,True);text(s,'Likely presentation',x+.22,2.98,2.8,.22,11,MUTED,True);para_box(s,signs,x+.18,3.27,3.3,1.3,13,INK);text(s,'Physio focus',x+.22,4.83,2.8,.22,11,MUTED,True);para_box(s,approach,x+.18,5.1,3.3,1.05,13,INK)
footer(s,6)
# 7 intervention ladder
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Intervention','Build capacity in layers','The dose must match tissue status, symptom irritability, goals, and treatment phase.',7)
levels=[('1. Explain','Body literacy • symptom mechanisms • consent • expectations',SEA),('2. Regulate','Breathing • bowel and bladder habits • sleep • pacing • load modification',TEAL),('3. Restore mobility','Scar and tissue mobility • hip/trunk movement • graded exposure',GOLD),('4. Train function','Coordination • relaxation • strength • endurance • impact or return-to-activity',CORAL),('5. Reconnect','Sexual health • body confidence • work • recreation • partnership goals',NAVY)]
for i,(h,b,c) in enumerate(levels):
w=11.45-i*1.23;x=.86+i*.615;y=5.72-i*.82
rect(s,x,y,w,.57,c,True);text(s,h,x+.18,y+.12,2.0,.2,13,WHITE,True);text(s,b,x+2.2,y+.13,w-2.4,.2,12,WHITE)
text(s,'Not linear: patients move up and down according to symptoms and readiness.',.88,1.98,10.4,.3,17,NAVY,True)
footer(s,7)
# 8 bladder and bowel
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Bladder and bowel','Make daily function measurable','Use diaries to replace assumptions with patterns.',8)
for i,(head,color,acts,flag) in enumerate([('BLADDER',TEAL,['Timed and urge-suppression strategies','Fluid and bladder irritant review','Relaxed voiding and emptying strategies','Pelvic floor coordination'], 'Persistent retention, recurrent UTI, hematuria, fistula symptoms → medical review'),('BOWEL',GOLD,['Toileting posture and breath','Stool consistency and fibre/hydration plan','Defecation mechanics and down-training','Graded activity'], 'Severe pain, obstruction features, rectal bleeding, new incontinence → specialist review')]):
x=.78+i*6.08;rect(s,x,2.0,5.6,3.93,PALE,True);rect(s,x,2.0,5.6,.18,color);text(s,head,x+.28,2.42,4.5,.25,18,NAVY,True);para_box(s,acts,x+.25,2.95,4.85,1.9,14,INK);rect(s,x+.24,5.0,5.08,.55,MINT if i==0 else RGBColor(251,244,223),True);text(s,flag,x+.40,5.11,4.75,.3,9.5,INK,False)
footer(s,8,'Source: Macmillan pelvic radiotherapy information')
# 9 sexual health
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Sexual rehabilitation','Permission, comfort, choice','Sexual health is a quality-of-life domain, not an optional extra.',9)
# conversation framework
for i,(h,b,c) in enumerate([('Permission','Normalise the conversation',TEAL),('Limited information','Explain treatment effects',SEA),('Specific suggestions','Lubricant, moisturiser, position, pace',GOLD),('Intensive therapy','PFPT, dilators, counselling, medical care',CORAL)]):
x=.75+i*3.1;circle(s,x,2.1,.65,c,str(i+1),15);text(s,h,x-.1,2.94,2.45,.35,14,NAVY,True);text(s,b,x-.1,3.36,2.35,.45,11,INK)
line(s,1.1,2.42,11.3,2.42,LIGHT,2)
rect(s,.82,4.62,11.6,1.15,MINT,True);text(s,'Physiotherapy toolbox:',1.1,4.84,2.2,.25,14,TEAL,True);text(s,'education • pelvic floor relaxation/coordination • graded exposure • dilator coaching where appropriate • mobility • partner-inclusive strategies',3.05,4.84,8.95,.35,13,INK)
text(s,'Evidence nuance: dilators are often recommended after pelvic radiation, but evidence and adherence are variable. Individualise the plan.',.88,6.16,11.65,.32,12,CORAL,True)
footer(s,9,'Source: Huffman et al., Gynecol Oncol 2016')
# 10 Pain
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Pelvic pain','Treat protection, not just the painful site','Persistent pain is commonly influenced by tissue, motor, nervous system, and psychosocial factors.',10)
# four quadrant
quads=[('Tissue','Radiation effects\nScar / myofascial restriction\nVaginal dryness',CORAL),('Motor','Guarding\nBreath holding\nHip-trunk movement loss',TEAL),('Nervous system','Threat sensitivity\nSleep disruption\nPersistent urgency/pain loop',GOLD),('Context','Trauma history\nRelationship factors\nCancer worry and mood',SEA)]
for i,(h,b,c) in enumerate(quads):
x=.88+(i%2)*6.0;y=2.08+(i//2)*2.05;rect(s,x,y,5.43,1.6,PALE,True);rect(s,x,y,.17,1.6,c);text(s,h,x+.35,y+.28,1.8,.25,17,NAVY,True);text(s,b,x+2.02,y+.22,2.8,.8,13,INK)
text(s,'Clinical target: improve safety, variability, and meaningful activity - then build capacity.',.9,6.34,11.2,.3,16,TEAL,True)
footer(s,10)
# 11 case
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Case application','A plan that follows the person','Illustrative case: adapt to oncology advice, patient preference, and examination findings.',11)
rect(s,.78,1.98,3.25,4.55,NAVY,True);text(s,'CASE',1.05,2.3,1.0,.25,11,SEA,True);text(s,'47-year-old\n6 months after\nchemoradiation',1.05,2.72,2.45,1.15,22,WHITE,True);text(s,'Reports urgency, bowel unpredictability, dyspareunia, fatigue, and fear of exercise.',1.05,4.25,2.5,1.0,13,RGBColor(218,235,235));pill(s,'Goal: walk & reconnect',1.05,5.72,2.25,SEA,NAVY)
plan=[('Week 0','Diary + goals; explain urgency and protection; screen late effects.'),('Weeks 1-3','Breathing, toileting, fluid/bowel routine, walking dose, hip mobility.'),('Weeks 4-8','Pelvic floor coordination or down-training based on findings; graded sexual rehabilitation.'),('Review','Track function, not only symptoms. Escalate if red flags or no progress.')]
for i,(h,b) in enumerate(plan):
y=2.1+i*1.05;circle(s,4.55,y,.43,TEAL if i<2 else CORAL,str(i+1),11);text(s,h,5.12,y+.02,1.05,.2,14,NAVY,True);text(s,b,6.15,y+.02,5.8,.44,13,INK);line(s,5.12,y+.66,12.2,y+.66,LIGHT,.8)
footer(s,11)
# 12 red flags
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Safety and referral','Know when physiotherapy is not enough','New or progressive symptoms require medical review, not escalation of exercise alone.',12)
flags=[('Urgent oncology / medical review','new vaginal, rectal, or urinary bleeding • unexplained weight loss • escalating pelvic pain • new neurologic deficit'),('Urology / urogynecology','retention, recurrent UTI, hematuria, suspected fistula, persistent incontinence'),('GI / radiation late-effects service','severe diarrhoea, obstruction symptoms, persistent rectal bleeding, major bowel change'),('Psychosexual / mental health support','distress, trauma response, relationship crisis, fear or avoidance limiting recovery')]
for i,(h,b) in enumerate(flags):
y=1.98+i*1.12;rect(s,.8,y,11.65,.83,PALE,True);circle(s,1.05,y+.17,.46,[CORAL,GOLD,TEAL,SEA][i],'!',13);text(s,h,1.72,y+.16,3.15,.22,14,NAVY,True);text(s,b,4.82,y+.16,6.95,.35,12,INK)
footer(s,12)
# 13 service
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Implementation','Make pelvic health visible in survivorship care','A referral pathway reduces missed symptoms and normalises help-seeking.',13)
flow=[('Oncology follow-up','Ask 4 domains\nBladder • bowel • pain • intimacy',NAVY),('Pelvic health PT','Phenotype\nTreat • teach • track',TEAL),('Specialist network','Gyn-onc • urogynecology\nGI • sexual health • psychology',GOLD),('Survivor outcomes','Participation\nConfidence • self-management',CORAL)]
for i,(h,b,c) in enumerate(flow):
x=.65+i*3.17;rect(s,x,2.55,2.65,1.75,c,True);text(s,h,x+.18,2.9,2.28,.34,15,WHITE,True,align=PP_ALIGN.CENTER);text(s,b,x+.18,3.48,2.28,.45,11,WHITE,align=PP_ALIGN.CENTER)
if i<3: line(s,x+2.70,3.42,x+3.09,3.42,SEA,2)
text(s,'Suggested outcome set:',.85,5.25,2.35,.23,14,TEAL,True);text(s,'patient-specific functional goal • bladder/bowel diary • pain confidence • sexual concern screen • activity participation • quality of life',3.08,5.25,8.95,.3,13,INK)
footer(s,13)
# 14 takeaway
s=prs.slides.add_slide(blank);set_bg(s,NAVY);text(s,'TAKE-HOME MESSAGE',.75,.65,4.3,.25,12,SEA,True)
text(s,'Rehabilitation is not an add-on\nto survival. It is part of recovery.',.75,1.18,10.6,1.2,30,WHITE,True,font='Aptos Display')
msgs=[('Ask early','Symptoms are common and often undisclosed.'),('Assess broadly','Bladder, bowel, sexual health, pain, and participation.'),('Prescribe precisely','Match intervention to phenotype and tissue status.'),('Partner widely','Build clear routes back to oncology and specialists.')]
for i,(h,b) in enumerate(msgs):
y=3.18+i*.70;circle(s,.85,y,.36,[SEA,TEAL,GOLD,CORAL][i],str(i+1),10,NAVY);text(s,h,1.38,y-.01,1.85,.18,14,WHITE,True);text(s,b,3.20,y,7.9,.21,12,RGBColor(215,234,233))
text(s,'“Rebuild the base” means restoring choice, confidence, and meaningful life.',.78,6.38,10.9,.28,16,SEA,True)
# 15 references
s=prs.slides.add_slide(blank);set_bg(s);title(s,'Selected references','Evidence and clinical resources','Selected sources used for this educational presentation.',15)
refs=[
'Berek & Novak’s Gynecology. Pelvic autonomic plexus and consequences of radical hysterectomy. 16th ed.',
'Campbell-Walsh-Wein Urology. Radical pelvic surgery and lower urinary tract dysfunction. 12th ed.',
'Deffieux X, et al. Pelvic exam in gynecology and obstetrics: Guidelines for clinical practice. Gynecol Obstet Fertil Senol. 2023. PMID: 37258002.',
'Huffman LB, et al. Sexual health in gynecologic cancer survivors: A review and clinical guide. Gynecol Oncol. 2016;140:359-368.',
'Tramacere F, et al. Assessment of sexual dysfunction in cervical cancer patients after different treatment modality: A systematic review. Medicina. 2022;58:1299. PMID: 36143900.',
'Macmillan Cancer Support. Pelvic radiotherapy: treatment, side effects and follow-up. Accessed August 2026.',
'Johnson N, Miles T, Cornes P. Dilating the vagina to prevent damage from radiotherapy: systematic review. BJOG. 2010;117:522-531.'
]
para_box(s,refs,.8,1.98,11.7,4.45,13,INK,bullet=False)
rect(s,.8,6.36,11.5,.45,MINT,True);text(s,'Educational content only. Clinical decisions should follow local oncology pathways and individual patient assessment.',1.0,6.49,11.1,.17,10,TEAL,True,align=PP_ALIGN.CENTER)
footer(s,15)
# Add speaker note-like author metadata in core properties
prs.core_properties.title = 'Rebuilding the Base: Pelvic Floor Rehabilitation in Cervical Cancer Survivorship'
prs.core_properties.subject = 'Physiotherapy conference presentation'
prs.core_properties.author = 'Physiotherapy Conference Presenter'
prs.core_properties.keywords = 'cervical cancer, pelvic floor, survivorship, physiotherapy'
prs.save(OUT)
print(OUT)
python "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/src/build_presentation.py" && ls -lh "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output/Rebuilding_the_Base_Pelvic_Floor_Rehabilitation_Cervical_Cancer_Survivorship.pptx"
python - <<'PY' from pptx import Presentation p='/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output/Rebuilding_the_Base_Pelvic_Floor_Rehabilitation_Cervical_Cancer_Survivorship.pptx' prs=Presentation(p) print('slides',len(prs.slides)) for i,s in enumerate(prs.slides,1): texts=[sh.text.strip().replace('\n',' | ') for sh in s.shapes if getattr(sh,'has_text_frame',False) and sh.text.strip()] print(i, len(texts), ' :: '.join(texts[:3])) PY python - <<'PY' import zipfile p='/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output/Rebuilding_the_Base_Pelvic_Floor_Rehabilitation_Cervical_Cancer_Survivorship.pptx' with zipfile.ZipFile(p) as z: print('pptx integrity',z.testzip()) PY
Rebuilding the Base Pelvic Floor Rehabilitation Cervical Cancer Survivorship
Presentation · PPTX
more slides required atleast 2 hrs
cervical cancer survivorship pelvic floor physiotherapy rehabilitation guideline 2025
~/pelvic-floor-cervical-cancer-ppt/
"gynecologic cancer" AND "pelvic floor"
"gynecologic cancer" AND "pelvic floor physical therapy"
anatomy diagram of female pelvic floor muscles and pelvic organs
cat > "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/src/build_2hour_deck.py" <<'PY' from pptx import Presentation from pptx.util import Inches, Pt from pptx.dml.color import RGBColor from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR from pptx.enum.text import PP_ALIGN, MSO_ANCHOR from pptx.enum.dml import MSO_LINE_DASH_STYLE from pptx.enum.text import MSO_AUTO_SIZE from pptx.oxml.xmlchemy import OxmlElement from pptx.oxml.ns import qn OUT='/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output/Rebuilding_the_Base_2_Hour_Physiotherapy_Conference.pptx' prs=Presentation(); prs.slide_width=Inches(13.333); prs.slide_height=Inches(7.5); blank=prs.slide_layouts[6] # palette NAVY=RGBColor(18,45,64); TEAL=RGBColor(21,129,129); SEA=RGBColor(111,191,183); MINT=RGBColor(224,244,240); CORAL=RGBColor(221,100,86); GOLD=RGBColor(231,177,81); INK=RGBColor(35,52,64); MUTED=RGBColor(94,112,123); PALE=RGBColor(247,249,248); WHITE=RGBColor(255,255,255); LIGHT=RGBColor(231,237,238); LAV=RGBColor(240,236,249) def no_line(s): s.line.fill.background() def rect(s,x,y,w,h,c,round=False,linec=None): a=s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE if round else MSO_SHAPE.RECTANGLE, Inches(x), Inches(y), Inches(w), Inches(h)); a.fill.solid(); a.fill.fore_color.rgb=c if linec: a.line.color.rgb=linec else: no_line(a) return a def ln(s,x1,y1,x2,y2,c=TEAL,w=1.5,dash=False): a=s.shapes.add_connector(MSO_CONNECTOR.STRAIGHT, Inches(x1), Inches(y1), Inches(x2), Inches(y2)); a.line.color.rgb=c;a.line.width=Pt(w) if dash:a.line.dash_style=MSO_LINE_DASH_STYLE.DASH return a def tx(s,st,x,y,w,h,sz=18,c=INK,b=False,align=PP_ALIGN.LEFT,va=MSO_ANCHOR.TOP): a=s.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)); tf=a.text_frame;tf.clear();tf.word_wrap=True;tf.margin_left=Inches(.04);tf.margin_right=Inches(.04);tf.margin_top=Inches(.02);tf.margin_bottom=Inches(.02);tf.vertical_anchor=va;tf.auto_size=MSO_AUTO_SIZE.NONE p=tf.paragraphs[0];p.alignment=align;r=p.add_run();r.text=st;r.font.name='Aptos';r.font.size=Pt(sz);r.font.bold=b;r.font.color.rgb=c return a def bullets(s,items,x,y,w,h,sz=16,c=INK): a=s.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h));tf=a.text_frame;tf.clear();tf.word_wrap=True;tf.margin_left=Inches(.05);tf.margin_right=Inches(.05);tf.margin_top=Inches(.03);tf.margin_bottom=Inches(.03) for i,item in enumerate(items): p=tf.paragraphs[0] if i==0 else tf.add_paragraph();p.text=item;p.font.name='Aptos';p.font.size=Pt(sz);p.font.color.rgb=c;p.level=0;p.space_after=Pt(8);p.bullet=True return a def section_header(s,section,title,sub=''): rect(s,0,0,13.333,.20,TEAL);tx(s,section.upper(),.55,.38,3.5,.3,10,TEAL,True);tx(s,title,.55,.72,12.1,.65,28,NAVY,True) if sub: tx(s,sub,.57,1.42,11.8,.38,14,MUTED) def footer(s,n,ref=''): ln(s,.55,7.05,12.78,7.05,LIGHT,.7);tx(s,'REBUILDING THE BASE | PHYSIOTHERAPY CONFERENCE',.55,7.14,6.5,.18,8,MUTED);tx(s,str(n),12.28,7.12,.45,.2,9,TEAL,True,PP_ALIGN.RIGHT) if ref:tx(s,ref,.55,6.78,11.5,.18,7,MUTED) def new(section,title,sub='',ref=''): s=prs.slides.add_slide(blank);rect(s,0,0,13.333,7.5,WHITE);section_header(s,section,title,sub);footer(s,len(prs.slides),ref);return s def card(s,x,y,w,h,title,body,accent=TEAL): rect(s,x,y,w,h,PALE,True);rect(s,x,y,.08,h,accent);tx(s,title,x+.24,y+.18,w-.38,.32,16,NAVY,True);bullets(s,body,x+.20,y+.62,w-.38,h-.72,13,INK) def callout(s,x,y,w,h,label,statement,color=TEAL): rect(s,x,y,w,h,color,True);tx(s,label.upper(),x+.22,y+.15,w-.4,.18,9,WHITE,True);tx(s,statement,x+.22,y+.40,w-.42,h-.5,17,WHITE,True) def circle(s,x,y,d,c,label='',sz=20): a=s.shapes.add_shape(MSO_SHAPE.OVAL, Inches(x), Inches(y), Inches(d), Inches(d));a.fill.solid();a.fill.fore_color.rgb=c;no_line(a) if label:tx(s,label,x,y+.13,d,d-.2,sz,WHITE,True,PP_ALIGN.CENTER,MSO_ANCHOR.MIDDLE) def title_slide(): s=prs.slides.add_slide(blank);rect(s,0,0,13.333,7.5,NAVY);rect(s,0,0,.23,7.5,TEAL);circle(s,9.65,.68,2.4,TEAL);circle(s,10.42,1.45,.86,CORAL);circle(s,8.93,2.52,.48,GOLD) tx(s,'REBUILDING\nTHE BASE',.75,.75,8,1.6,37,WHITE,True);tx(s,'Pelvic Floor Rehabilitation in\nCervical Cancer Survivorship',.78,2.62,7.7,1.05,23,SEA,True) tx(s,'A 120-minute physiotherapy conference session',.80,4.08,6.8,.35,15,WHITE);ln(s,.8,4.63,5.8,4.63,SEA,1.5);tx(s,'Bladder • bowel • sexual health • pain • participation',.8,4.88,7.7,.32,15,WHITE) tx(s,'Presenter: ____________________ | Institution: ____________________',.80,6.6,8,.28,11,SEA);tx(s,'Educational content: individualise to oncology status and local protocols.',.8,6.93,8.5,.2,8,SEA) def agenda_slide(): s=new('Opening','120-minute learning journey','Designed for an interactive physiotherapy conference session') items=[('0–10 min','Set the frame','Survivorship, burden, and objectives'),('10–25 min','Treatment and mechanisms','What treatment changes in the pelvic system'),('25–50 min','Assessment','Screening, consent, examination, outcome measures'),('50–75 min','Intervention lab','Phenotype-led rehabilitation and practical tools'),('75–95 min','Symptom pathways','Bladder, bowel, pain, and sexual health'),('95–112 min','Cases and implementation','Clinical reasoning, red flags, service design'),('112–120 min','Consolidation','Action plan, questions, key messages')] for i,(t,a,b) in enumerate(items): y=1.95+i*.62;rect(s,.7,y,1.36,.42,TEAL if i<4 else CORAL,True);tx(s,t,.77,y+.1,1.2,.18,11,WHITE,True,PP_ALIGN.CENTER);tx(s,a,2.3,y+.03,3.4,.22,15,NAVY,True);tx(s,b,5.72,y+.05,6.4,.2,13,MUTED) def objective_slide(): s=new('Opening','By the end of this session, participants can...') objs=['Explain how surgery, radiotherapy, systemic treatment, and menopause-related changes can affect pelvic function.','Use a consent-led, oncology-aware assessment to identify the dominant dysfunction phenotype.','Select and progress rehabilitation strategies for continence, bowel function, pain, and sexual goals.','Recognise red flags and build a safe referral pathway within survivorship care.'] for i,o in enumerate(objs): y=1.85+i*1.13;circle(s,.8,y,.58,[TEAL,CORAL,GOLD,SEA][i],str(i+1),17);tx(s,o,1.65,y+.02,10.5,.58,20,NAVY,True if i==0 else False);ln(s,1.65,y+.77,11.7,y+.77,LIGHT,.8) def activity_slide(num,title,prompt,time='2 MINUTES'): s=new('Interactive',title,'Turn to a colleague or capture your own response.') rect(s,.8,1.82,2.05,.52,CORAL,True);tx(s,time,.92,1.96,1.8,.18,12,WHITE,True,PP_ALIGN.CENTER);tx(s,prompt,.85,2.65,10.8,1.25,27,NAVY,True) callout(s,.85,4.55,10.7,1.02,'debrief cue','What does this change about your next assessment or referral?',TEAL) tx(s,'ACTIVITY '+str(num),11.55,1.92,1.0,.2,10,TEAL,True,PP_ALIGN.RIGHT) def treatment_system_slide(): s=new('Context','Treatment changes a system, not just a muscle','Symptoms may coexist: weakness, overactivity, sensory change, fibrosis, fatigue, and fear-avoidance.','Goldman-Cecil Medicine, 22e, Approach to Survivors of Gynecologic Cancers') nodes=[('Surgery','tissue + neural effects',TEAL),('Radiotherapy','vascular + tissue effects',CORAL),('Systemic therapy','fatigue + menopause',GOLD),('Psychosocial context','meaning + behaviour',SEA)] for i,(a,b,c) in enumerate(nodes): x=.85+i*3.05;circle(s,x,2.25,1.28,c);tx(s,a,x-.15,3.7,1.6,.3,15,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x-.2,4.08,1.7,.55,12,MUTED,False,PP_ALIGN.CENTER);ln(s,x+1.28,2.89,x+2.85,2.89,LIGHT,2) circle(s,5.93,5.2,1.15,NAVY,'FUNCTION',12);tx(s,'Function emerges from the interaction of tissues, nerves, motor control, daily demands, and personal goals.',2.8,6.45,7.7,.28,14,MUTED,False,PP_ALIGN.CENTER) def domains_slide(): s=new('Context','Five domains. One person.','A survivorship review should invite disclosure across all domains.') data=[('Bladder','urgency • leakage • retention',TEAL),('Bowel','frequency • urgency • evacuation',CORAL),('Sexual health','pain • stenosis • desire',GOLD),('Pain','pelvic • hip • scar • back',SEA),('Participation','work • exercise • relationships',NAVY)] for i,(a,b,c) in enumerate(data): x=.6+i*2.52;rect(s,x,2.05,2.18,2.4,PALE,True);circle(s,x+.72,2.38,.72,c,str(i+1),15);tx(s,a,x+.18,3.35,1.82,.28,16,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x+.18,3.78,1.82,.44,12,MUTED,False,PP_ALIGN.CENTER) callout(s,1.3,5.35,10.7,.95,'clinical move','Ask one normalising question in each domain. Silence does not mean absence of symptoms.',TEAL) def anatomy_slide(): s=new('Foundation','The pelvic floor: support, closure, relaxation, response','Think in functions, not isolated contractions.') # simplified original diagram rect(s,.8,1.92,4.5,3.75,MINT,True);tx(s,'A functional map',1.1,2.18,3.7,.3,17,NAVY,True) circle(s,2.3,2.92,1.02,SEA);circle(s,3.35,2.92,1.02,GOLD);circle(s,2.82,4.02,1.02,CORAL);tx(s,'bladder',2.3,3.27,1.02,.2,11,NAVY,True,PP_ALIGN.CENTER);tx(s,'uterus',3.35,3.27,1.02,.2,11,NAVY,True,PP_ALIGN.CENTER);tx(s,'rectum',2.82,4.37,1.02,.2,11,NAVY,True,PP_ALIGN.CENTER) ln(s,1.5,5.08,4.55,5.08,NAVY,5);tx(s,'levator ani / connective tissue / sphincteric system',1.05,5.28,4.15,.2,10,MUTED,False,PP_ALIGN.CENTER) card(s,5.72,1.95,2.1,3.7,'Support',['Organ support','Load transfer','Anticipatory response'],TEAL);card(s,8.03,1.95,2.1,3.7,'Closure',['Urethral control','Anal continence','Pressure management'],CORAL);card(s,10.34,1.95,2.1,3.7,'Release',['Voiding','Defecation','Penetration / examination'],GOLD) tx(s,'A muscle can be weak and overactive at different tasks. Assess the task.',1.0,6.25,11.2,.3,18,NAVY,True,PP_ALIGN.CENTER) def timeline_slide(): s=new('Foundation','Timing matters: prehabilitation to long-term survivorship') stages=[('Before treatment','baseline screen\neducation\nprehabilitation',TEAL),('Early recovery','protection\nhealing\ngentle mobility',SEA),('During / after RT','symptom support\ntissue care\nenergy pacing',CORAL),('Late effects','capacity\nself-management\nparticipation',GOLD)] for i,(a,b,c) in enumerate(stages): x=.75+i*3.05;circle(s,x,2.65,.78,c,str(i+1),18);tx(s,a,x-.32,3.65,1.45,.3,15,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x-.42,4.15,1.65,.65,13,MUTED,False,PP_ALIGN.CENTER) if i<3:ln(s,x+.8,3.04,x+2.9,3.04,TEAL,2) callout(s,1.05,5.7,10.8,.77,'principle','Do not use a calendar alone. Read the tissue, symptoms, treatment plan, and person.',NAVY) def burden_slide(): s=new('Foundation','Why screening is needed','Pelvic symptoms are often underreported, normalised, or discussed only when severe.') card(s,.75,1.85,3.7,3.85,'What patients may say',['“I thought it was expected.”','“I did not know who to ask.”','“I do not want another examination.”','“I have adapted my whole day around it.”'],TEAL) card(s,4.8,1.85,3.7,3.85,'What they may mean',['Leakage or urgency','Pain / high tone','Evacuation difficulty','Sexual distress','Fear of recurrence or harm'],CORAL) card(s,8.85,1.85,3.7,3.85,'Physiotherapy response',['Name the domain','Ask permission','Offer options','Measure impact','Build a supported plan'],GOLD) def assessment_intro(): s=new('Assessment','A consent-led assessment is therapeutic','The pelvic examination is optional, staged, and never the entry ticket to care.') callout(s,.8,1.85,11.65,.92,'first sentence','“Many people notice bladder, bowel, pain, or sexual changes after treatment. Would it be okay if I ask a few questions?”',TEAL) steps=[('1','Explain purpose'),('2','Offer choice'),('3','Gain ongoing consent'),('4','Stop / adapt anytime')] for i,(n,a) in enumerate(steps): x=1.1+i*2.9;circle(s,x,3.52,.72,[TEAL,SEA,GOLD,CORAL][i],n,16);tx(s,a,x-.35,4.44,1.45,.34,15,NAVY,True,PP_ALIGN.CENTER) tx(s,'Trauma-informed practice: privacy, language, pacing, control, and alternatives.',1.0,5.72,11,.3,19,NAVY,True,PP_ALIGN.CENTER) def screen_slide(): s=new('Assessment','A rapid survivorship screen','Use a brief screen at oncology follow-up, then refer for full pelvic health assessment.') qs=['Do you leak, rush, strain, or feel unable to empty?','Have bowel habits, urgency, or evacuation changed?','Do you have pelvic, abdominal, hip, or scar-related pain?','Are sex, vaginal health, or examinations uncomfortable or difficult?','What activity or role has this changed for you?'] for i,q in enumerate(qs): y=1.75+i*.78;circle(s,.8,y,.34,TEAL,'?',12);tx(s,q,1.3,y-.03,10.7,.29,17,NAVY,True if i==0 else False) tx(s,'Positive answer = validate + triage + assess or refer. Not necessarily an internal examination.',.95,6.0,11,.3,15,MUTED,False,PP_ALIGN.CENTER) def history_slide(): s=new('Assessment','History: find the dominant problem and its drivers') card(s,.65,1.78,2.85,4.35,'Cancer history',['Stage and site','Surgery / nerve-sparing?','Radiotherapy / brachytherapy','Systemic therapy','Recurrence status / surveillance'],TEAL) card(s,3.7,1.78,2.85,4.35,'Symptom behaviour',['Onset and trajectory','Triggers and easers','24-hour pattern','Protective behaviours','Patient explanation'],CORAL) card(s,6.75,1.78,2.85,4.35,'Function + context',['Work / caregiving','Exercise and sleep','Mood / fear','Partner or support','Access and priorities'],GOLD) card(s,9.8,1.78,2.85,4.35,'Medical safety',['Bleeding / discharge','Fever / acute pain','Obstruction / retention','Lymphoedema / DVT risk','Medication and referral'],NAVY) def measures_slide(): s=new('Assessment','Measure what matters: a minimum dataset','Choose a small set that can be repeated and used in shared decision-making.') rows=[('Patient goal','Patient-Specific Functional Scale or a goal-attainment approach'),('Bladder','3-day diary; symptom and bother measure'),('Bowel','Stool form + frequency; urgency / evacuation questions'),('Sexual health','Brief consented discussion; validated tool when appropriate'),('Pain / participation','NRS plus meaningful activity; fatigue and function'),('Physical exam','Observation, breathing, movement, pelvic exam if consented')] for i,(a,b) in enumerate(rows): y=1.76+i*.66;rect(s,.8,y,2.2,.42,TEAL if i%2==0 else SEA,True);tx(s,a,.94,y+.1,1.9,.17,12,WHITE,True,PP_ALIGN.CENTER);tx(s,b,3.28,y+.07,8.8,.23,14,NAVY) def diary_slide(): s=new('Assessment','The 3-day diary: pattern before prescription','A diary makes symptoms observable and treatment targets testable.') headers=['Time','Fluid / irritant','Void / stool','Urgency 0–10','Leakage / pain','Context'] widths=[1.1,2,1.55,1.65,1.8,2.25];x=.7 for h,w in zip(headers,widths):rect(s,x,1.85,w,.48,NAVY,False);tx(s,h,x+.05,1.99,w-.1,.15,11,WHITE,True,PP_ALIGN.CENTER);x+=w data=[['07:15','coffee 250 mL','void','7','none','rushing'],['10:30','water 300 mL','void','3','few drops','meeting'],['14:45','tea 200 mL','void','8','none','arrived home'],['21:00','water 150 mL','stool B4','4','strain 5/10','after dinner']] for r,row in enumerate(data): x=.7;y=2.36+r*.58 for val,w in zip(row,widths):rect(s,x,y,w,.52,PALE if r%2==0 else MINT);tx(s,val,x+.06,y+.16,w-.12,.18,11,INK,False,PP_ALIGN.CENTER);x+=w callout(s,.85,5.35,10.7,.95,'ask','Which pattern is modifiable? Which needs medical investigation? Which needs coordination rather than more strengthening?',TEAL) def exam_slide(): s=new('Assessment','Physical examination: layers, options, purpose','Observe first. Examine only what answers a clinical question and is consented.') layers=[('External','posture, breath, abdominal wall, scars, hip / spine, load transfer',TEAL),('Functional','sit-to-stand, cough, squat, gait, toileting simulation',SEA),('Perineal / pelvic','resting state, excursion, timing, strength, endurance, tenderness',CORAL),('Internal optional','only with informed consent, chaperone policy, and a stated purpose',GOLD)] for i,(a,b,c) in enumerate(layers): y=1.72+i*.98;circle(s,.82,y,.48,c,str(i+1),13);tx(s,a,1.55,y-.02,1.75,.25,17,NAVY,True);tx(s,b,3.25,y-.02,8.35,.34,14,MUTED) callout(s,1.1,5.93,10.3,.62,'clinical question','“What will this examination change in the plan today?”',NAVY) def phenotype_slide(): s=new('Clinical reasoning','Phenotype before prescription','A “Kegel-only” plan may miss high tone, pain, sensory change, or evacuation dysfunction.') data=[('Capacity deficit','low force / endurance\nleakage with load',TEAL),('Overactivity / pain','guarding • tenderness\npain / urgency',CORAL),('Coordination deficit','delayed activation\npoor release / straining',GOLD),('Tissue / sensory change','fibrosis • dryness\naltered sensation',SEA)] for i,(a,b,c) in enumerate(data): x=.7+i*3.1;rect(s,x,1.92,2.75,2.12,PALE,True);rect(s,x,1.92,2.75,.13,c);tx(s,a,x+.25,2.3,2.2,.38,17,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x+.3,3.08,2.1,.55,13,MUTED,False,PP_ALIGN.CENTER) tx(s,'Most survivors are mixed presentations. Choose the initial target with the best expected functional gain.',1.0,5.1,11.2,.38,19,NAVY,True,PP_ALIGN.CENTER) def classify_slide(): s=new('Clinical reasoning','A simple decision sequence','Use this to organise a first plan, not to replace medical assessment.') boxes=[('1. Is it safe?','red flags / active issues','REFER OR CO-MANAGE',CORAL),('2. What is dominant?','capacity / pain / coordination / tissue','SELECT PHENOTYPE',TEAL),('3. What matters now?','goal / readiness / context','SET 1–2 GOALS',GOLD),('4. What is tolerable?','irritability / fatigue / tissue','DOSE + PROGRESS',SEA)] for i,(a,b,c,d) in enumerate(boxes): x=.52+i*3.18;rect(s,x,2.1,2.62,2.52,PALE,True);tx(s,a,x+.18,2.38,2.25,.36,16,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x+.2,3.1,2.2,.35,13,MUTED,False,PP_ALIGN.CENTER);rect(s,x+.35,3.82,1.92,.38,c,True);tx(s,d,x+.42,3.94,1.78,.13,9,WHITE,True,PP_ALIGN.CENTER) def intervention_layers(): s=new('Intervention lab','Build capacity in layers','The dose must match tissue status, symptom irritability, goals, and treatment phase.') layers=[('1. Safety + understanding','normalise, explain, coordinate care',NAVY),('2. Symptom strategies','breath, bladder / bowel habits, pacing',TEAL),('3. Motor control','relaxation, timing, force, endurance',SEA),('4. Function + participation','walking, lifting, intimacy, work, sport',GOLD)] for i,(a,b,c) in enumerate(layers): w=2.28+i*.55;x=(13.33-w)/2;y=1.78+i*.87;rect(s,x,y,w,.72,c,True);tx(s,a,x+.15,y+.14,w-.3,.2,15,WHITE,True,PP_ALIGN.CENTER);tx(s,b,x+.15,y+.39,w-.3,.17,10,WHITE,False,PP_ALIGN.CENTER) def breath_slide(): s=new('Intervention lab','Breathing and pressure: a starting point, not a cure-all') tx(s,'Observe the strategy under the task.',.8,1.75,6.2,.32,22,NAVY,True) steps=[('Inhale','allow rib and abdominal expansion','pelvic floor excursion'),('Exhale','reduce breath-holding','prepare effort / gentle response'),('Load','lift, cough, rise, transfer','timing is task-specific')] for i,(a,b,c) in enumerate(steps): x=.8+i*4.02;circle(s,x,2.6,.86,[TEAL,SEA,CORAL][i],str(i+1),18);tx(s,a,x-.15,3.75,1.15,.25,16,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x-.55,4.18,1.95,.35,13,MUTED,False,PP_ALIGN.CENTER);tx(s,c,x-.65,4.76,2.15,.35,13,TEAL,True,PP_ALIGN.CENTER) callout(s,1.15,5.75,10.1,.68,'practice cue','Use a gentle exhale to reduce unnecessary bracing. Avoid forcing a contraction into pain or urgency.',TEAL) def relaxation_slide(): s=new('Intervention lab','When relaxation is the treatment target','High tone is not simply “strong.” It may be a protective motor strategy.') card(s,.72,1.82,3.55,3.72,'Clues',['pain with examination / intercourse','urgency with small volumes','straining / incomplete emptying','tenderness or poor excursion','global bracing / breath-holding'],CORAL) card(s,4.88,1.82,3.55,3.72,'Initial tools',['education and permission','down-training with breath','comfortable positions','external / internal manual options','graded exposure and pacing'],TEAL) card(s,9.04,1.82,3.55,3.72,'Avoid',['automatic high-volume Kegels','pain-provoking internal work','forcing dilator progression','equating relaxation with failure','treating without medical triage'],GOLD) def strengthening_slide(): s=new('Intervention lab','When strengthening is appropriate','Train a function, not a generic number of repetitions.') rows=[('Target','force • endurance • repetitions • speed • timing'),('Starting point','quality contraction without pain, breath-holding, or symptom flare'),('Task','cough, transfer, lifting, walking, stair climb, exercise'),('Progression','increase one variable at a time and reassess symptom response'),('Home plan','brief, precise, achievable, recorded in patient language')] for i,(a,b) in enumerate(rows): y=1.72+i*.66;rect(s,.8,y,2.2,.42,TEAL if i in [0,3] else SEA,True);tx(s,a,.96,y+.1,1.85,.17,12,WHITE,True,PP_ALIGN.CENTER);tx(s,b,3.25,y+.06,8.8,.25,15,NAVY) tx(s,'Use oncology-specific precautions and do not prescribe through undiagnosed bleeding, acute pain, infection, or obstruction.',.9,5.7,11.2,.45,13,CORAL,True,PP_ALIGN.CENTER) def biofeedback_slide(): s=new('Intervention lab','Feedback options: teach awareness, then reduce reliance') data=[('Verbal / visual','mirror, language, task observation',TEAL),('Palpation','external or internal, consented',CORAL),('EMG biofeedback','awareness of resting state, activation, release',GOLD),('Ultrasound','motor learning / excursion where available',SEA),('Diaries','patterns and response to self-management',NAVY)] for i,(a,b,c) in enumerate(data): x=.45+i*2.55;rect(s,x,2.0,2.18,2.35,PALE,True);circle(s,x+.73,2.35,.68,c,str(i+1),15);tx(s,a,x+.2,3.28,1.78,.3,14,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x+.2,3.72,1.78,.38,11,MUTED,False,PP_ALIGN.CENTER) tx(s,'Tool selection follows the clinical question, patient preference, access, and safety. Devices are optional.',1.0,5.35,11.2,.3,18,NAVY,True,PP_ALIGN.CENTER) def manual_slide(): s=new('Intervention lab','Manual therapy: a component, not the whole plan','Use only with indication, consent, tissue awareness, and an active self-management bridge.') card(s,.75,1.88,3.45,3.75,'Potential purpose',['scar mobility / desensitisation','myofascial symptom modulation','graded exposure to touch','movement confidence','education about tissue response'],TEAL) card(s,4.95,1.88,3.45,3.75,'Pair with',['breathing and down-training','functional movement','home self-care','dilator or touch plan when appropriate','communication with medical team'],SEA) card(s,9.15,1.88,3.45,3.75,'Stop / reconsider',['new bleeding or suspicious lesion','acute infection / severe flare','unexplained severe pain','patient withdrawal of consent','medical instability'],CORAL) def home_slide(): s=new('Intervention lab','Home programme design: make the plan usable') card(s,.72,1.76,2.75,4.05,'One focus',['one priority goal','one symptom strategy','one motor exercise','one functional exposure','one tracking method'],TEAL) card(s,3.77,1.76,2.75,4.05,'Dose',['start below flare threshold','fit routine and fatigue','use clear “if / then” rules','plan rest and recovery','review in 1–2 weeks'],GOLD) card(s,6.82,1.76,2.75,4.05,'Language',['avoid “squeeze all day”','use patient’s own words','write technique cues','name normal responses','name stop signals'],SEA) card(s,9.87,1.76,2.75,4.05,'Adherence',['ask about barriers','normalise lapses','use prompts / habit links','reduce complexity','celebrate function, not perfection'],CORAL) def bladder_pathway(): s=new('Symptom pathways','Bladder symptoms: classify before you train','Urgency, leakage, incomplete emptying, and pain require different first moves.','Goldman-Cecil Medicine, 22e, Approach to Survivors of Gynecologic Cancers') paths=[('Urgency / frequency','diary • irritants • urge strategy • relaxation • medical review when new / severe',TEAL),('Stress leakage','load analysis • timing • capacity • pressure strategy • functional strengthening',SEA),('Incomplete emptying','voiding position • release • medication / retention review • consider urology',CORAL),('Bladder pain','screen infection / recurrence • down-training • pacing • multidisciplinary care',GOLD)] for i,(a,b,c) in enumerate(paths): y=1.65+i*1.06;rect(s,.75,y,2.4,.6,c,True);tx(s,a,.88,y+.19,2.12,.18,14,WHITE,True,PP_ALIGN.CENTER);tx(s,b,3.48,y+.09,8.6,.34,14,NAVY) def urge_slide(): s=new('Symptom pathways','Urge strategy: interrupt the rush, not the person') steps=[('Pause','stop moving; soften shoulders / jaw',TEAL),('Breathe','slow exhale; avoid panic bracing',SEA),('Signal','brief, comfortable pelvic response only if appropriate',GOLD),('Distract','count, name objects, planned self-talk',CORAL),('Walk','when urge settles, walk calmly to toilet',NAVY)] for i,(a,b,c) in enumerate(steps): x=.42+i*2.55;circle(s,x,2.23,.7,c,str(i+1),16);tx(s,a,x-.18,3.22,1.08,.25,14,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x-.45,3.66,1.6,.62,11,MUTED,False,PP_ALIGN.CENTER) callout(s,1.0,5.25,11,.8,'individualise','Avoid rigid bladder retraining during active infection, retention, severe pain, or uncertain medical status.',TEAL) def bowel_pathway(): s=new('Symptom pathways','Bowel function: support the whole routine','Late pelvic radiotherapy effects can include bowel urgency, altered stool pattern, pain, or incomplete evacuation.','Goldman-Cecil Medicine, 22e, Approach to Survivors of Gynecologic Cancers') cols=[('Stool pattern',['frequency','Bristol form','diet / fluid','medication review'],TEAL),('Toileting mechanics',['foot support','hip flexion','relaxed abdomen','avoid prolonged straining'],SEA),('Coordination',['breath / release','recognise dyssynergia','biofeedback where indicated','anal sphincter context'],GOLD),('Escalate',['new bleeding','obstruction features','severe diarrhoea','weight loss / fever'],CORAL)] for i,(a,items,c) in enumerate(cols):card(s,.58+i*3.17,1.85,2.78,3.92,a,items,c) def bowel_demo(): s=new('Symptom pathways','Toileting mechanics: a practical teaching script') rect(s,.75,1.78,4.2,3.9,MINT,True);tx(s,'Position',1.0,2.1,3.7,.3,21,NAVY,True) # stool graphic rect(s,2.18,3.05,1.38,1.3,NAVY,True);rect(s,1.65,4.26,2.36,.2,NAVY,False);ln(s,2.04,4.45,1.68,5.05,NAVY,3);ln(s,3.68,4.45,4.05,5.05,NAVY,3);rect(s,1.15,4.73,.55,.32,GOLD,True);tx(s,'feet supported',.95,5.18,1.15,.2,10,MUTED,False,PP_ALIGN.CENTER) bullets(s,['Feet supported; knees comfortably above hips if tolerated.','Lean forward with forearms on thighs.','Soften abdomen and pelvic floor; exhale rather than strain.','Keep the routine brief. Reassess if pain, bleeding, or obstruction symptoms occur.'],5.55,2.0,6.1,3.4,17,NAVY) def sexual_intro(): s=new('Symptom pathways','Sexual rehabilitation: permission, comfort, choice','Sexual health is a quality-of-life domain, not an optional extra.','NCCN Survivorship Insights 2024; Huffman et al., Gynecol Oncol 2016') tx(s,'A useful opening:',.85,1.83,3.1,.28,19,TEAL,True);callout(s,.85,2.32,10.85,.98,'say','“Treatment can affect comfort, sensation, desire, and confidence. Is this something you would like to include in our plan?”',TEAL) items=[('Permission','invite, normalise, allow “not today”',TEAL),('Limited information','link treatment, tissue, pain, and function',SEA),('Specific suggestions','comfort, lubricants / moisturisers, positioning, pacing',GOLD),('Intensive support','PFPT, sex therapy, gynaecology, oncology',CORAL)] for i,(a,b,c) in enumerate(items): x=.72+i*3.05;rect(s,x,4.2,2.65,1.4,PALE,True);tx(s,a,x+.16,4.48,2.3,.25,15,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x+.18,4.87,2.28,.35,11,MUTED,False,PP_ALIGN.CENTER) def pain_slide(): s=new('Symptom pathways','Pelvic pain: treat protection, not just the painful site') tx(s,'Persistent pain may reflect an interaction of tissue, motor, nervous system, and psychosocial factors.',.78,1.75,11.2,.4,20,NAVY,True) factors=[('Tissue','scar, fibrosis, dryness, inflammatory or nociceptive input',CORAL),('Motor','guarding, high tone, altered movement, deconditioning',TEAL),('Nervous system','sensitivity, sleep, threat, stress response',GOLD),('Context','fear, relationship, work, identity, access',SEA)] for i,(a,b,c) in enumerate(factors): x=.65+i*3.12;circle(s,x,2.68,1.15,c,str(i+1),20);tx(s,a,x-.15,4.05,1.5,.28,16,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x-.48,4.5,2.15,.63,12,MUTED,False,PP_ALIGN.CENTER) callout(s,.95,5.75,11,.65,'plan','Validate + triage + reduce provocation + restore safety and movement + coordinate care.',NAVY) def dilator_slide(): s=new('Symptom pathways','Vaginal dilators: a graded rehabilitation option','Use should be individualised. Evidence for prevention of radiation-associated stenosis is limited and adherence can be challenging.','Huffman et al., Gynecol Oncol 2016; NCCN Survivorship Insights 2024') steps=[('Confirm safety','oncology / gynaecology advice; inspect for contraindications',CORAL),('Set a goal','exam tolerance, comfort, confidence, vaginal accommodation',TEAL),('Teach control','position, lubrication, breath, stop signal, nonsexual context',SEA),('Grade exposure','size / depth / duration only within comfort and consent',GOLD),('Review impact','pain, bleeding, tissue response, emotional meaning, adherence',NAVY)] for i,(a,b,c) in enumerate(steps): y=1.72+i*.72;circle(s,.82,y,.38,c,str(i+1),11);tx(s,a,1.35,y-.02,2.1,.2,15,NAVY,True);tx(s,b,3.58,y-.02,8.05,.25,13,MUTED) def lym_slide(): s=new('Symptom pathways','Lymphoedema, pelvic girdle, and whole-body rehabilitation','Pelvic health rehabilitation must connect to general cancer rehabilitation.') card(s,.7,1.82,3.7,3.78,'Screen',['leg, genital, lower abdominal swelling','heaviness, tightness, skin change','reduced mobility or garment concerns','sudden unilateral swelling: urgent medical assessment'],TEAL) card(s,4.82,1.82,3.7,3.78,'Support',['graded activity and resistance','mobility and load progression','skin care / self-monitoring education','referral to lymphoedema service when indicated'],SEA) card(s,8.94,1.82,3.7,3.78,'Integrate',['fatigue management','sleep, nutrition, psychosocial support','return to valued activity','communication across oncology team'],GOLD) def redflag_slide(): s=new('Safety','Know when physiotherapy is not enough','New or progressive symptoms require medical review, not escalation of exercise alone.') flags=[('Bleeding / discharge','new, unexplained, post-treatment change',CORAL),('Obstruction / retention','inability to void, severe constipation, vomiting, distension',CORAL),('Systemic signs','fever, unwellness, unexplained weight loss',CORAL),('Severe or changing pain','new focal pain, night pain, rapidly worsening pain',CORAL),('Vascular concern','acute unilateral leg swelling, chest symptoms, sudden breathlessness',CORAL),('Neurological change','new saddle sensory change, progressive weakness, bowel / bladder loss',CORAL)] for i,(a,b,c) in enumerate(flags): y=1.65+i*.66;rect(s,.75,y,2.5,.42,c,True);tx(s,a,.9,y+.1,2.15,.15,12,WHITE,True,PP_ALIGN.CENTER);tx(s,b,3.55,y+.08,8.5,.22,14,NAVY) def case_slide(n,title,story,questions): s=new('Case workshop',title,'Discuss in pairs, then choose your first 2–3 actions.') rect(s,.75,1.68,11.7,1.32,LAV,True);tx(s,story,1.0,1.94,11.1,.76,16,NAVY,False) tx(s,'Your clinical reasoning prompts',.9,3.42,5,.28,20,NAVY,True) for i,q in enumerate(questions): y=3.98+i*.59;circle(s,.92,y,.3,[TEAL,CORAL,GOLD][i%3],str(i+1),10);tx(s,q,1.4,y-.03,10.6,.22,15,INK) def case_answer(n,phenotype,first,avoid,refer): s=new('Case workshop','Case '+str(n)+': possible first plan','There is more than one acceptable plan. Make your assumptions explicit.') card(s,.7,1.78,2.8,3.92,'Dominant phenotype',phenotype,TEAL) card(s,3.85,1.78,2.8,3.92,'First session',first,SEA) card(s,7.0,1.78,2.8,3.92,'Avoid',avoid,CORAL) card(s,10.15,1.78,2.5,3.92,'Co-manage',refer,GOLD) def implementation_slide(): s=new('Implementation','Make pelvic health visible in survivorship care','A pathway reduces missed symptoms and normalises help-seeking.') steps=[('1. Screen','at treatment completion and routine follow-up',TEAL),('2. Triage','red flags and urgency',CORAL),('3. Refer','pelvic health physiotherapy / multidisciplinary services',SEA),('4. Treat + feedback','shared plan and outcome review',GOLD),('5. Re-screen','changes can emerge months or years later',NAVY)] for i,(a,b,c) in enumerate(steps): x=.42+i*2.55;circle(s,x,2.22,.72,c,str(i+1),16);tx(s,a,x-.15,3.27,1.05,.25,14,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x-.45,3.72,1.6,.52,11,MUTED,False,PP_ALIGN.CENTER) def audit_slide(): s=new('Implementation','A simple service audit','Measure access and impact, not just attendance.') metrics=[('Access','% screened; referral-to-assessment wait time',TEAL),('Equity','who is not being reached?',CORAL),('Outcomes','goal attainment; symptom and participation change',GOLD),('Safety','red flag escalation; adverse events; follow-up',SEA),('Experience','consent, dignity, usefulness, confidence',NAVY)] for i,(a,b,c) in enumerate(metrics): y=1.67+i*.76;rect(s,.8,y,2.25,.46,c,True);tx(s,a,.96,y+.13,1.92,.16,12,WHITE,True,PP_ALIGN.CENTER);tx(s,b,3.35,y+.1,8.75,.22,15,NAVY) def evidence_slide(): s=new('Evidence','What does the evidence support?','The evidence base is evolving. Be transparent about certainty, applicability, and patient values.') card(s,.7,1.78,3.7,3.95,'Reasonable direction',['Multimodal pelvic floor physiotherapy can improve painful intercourse in gynecological cancer survivors.','Education-based and pelvic floor interventions show potential across several domains.','Individual assessment and adherence support matter.'],TEAL) card(s,4.82,1.78,3.7,3.95,'Cautions',['Intervention studies are often small and heterogeneous.','Cancer types and treatment pathways vary.','Dilator evidence and optimal PFMT dosage remain uncertain in many contexts.'],GOLD) card(s,8.94,1.78,3.7,3.95,'Practice response',['Use shared decisions.','Measure individual response.','Coordinate medical surveillance.','Do not overpromise.'],CORAL) def takehome_slide(): s=new('Close','Rehabilitation is part of recovery','Not an add-on to survival.') msgs=['Screen every domain.','Phenotype before prescription.','Start with consent, safety, and function.','Build a graded, meaningful plan.','Refer and co-manage early when needed.'] for i,m in enumerate(msgs): y=1.7+i*.76;circle(s,1.0,y,.42,[TEAL,SEA,GOLD,CORAL,NAVY][i],str(i+1),12);tx(s,m,1.72,y-.02,8.5,.27,20,NAVY,True) callout(s,1.1,5.85,10.7,.62,'action','Choose one change you will make in your survivorship pathway this month.',TEAL) def references_slide(): s=new('References','Selected evidence and clinical resources','Use local oncology and institutional policies alongside these resources.') refs=['Cyr MP, Jones T, Brennen R, et al. Effectiveness of Pelvic Floor Muscle and Education-Based Therapies in Females Treated for Gynecological Cancer: A Systematic Review. Curr Oncol Rep. 2024. PMID: 39177709.','Brennen RR, Lin KY, Denehy L, Frawley HC. The Effect of Pelvic Floor Muscle Interventions on Pelvic Floor Dysfunction After Gynecological Cancer Treatment: A Systematic Review. Phys Ther. 2020. PMID: 32367126.','Cyr MP, Dostie R, Camden C, et al. Improvements Following Multimodal Pelvic Floor Physical Therapy in Gynecological Cancer Survivors with Dyspareunia. PLoS One. 2022. PMID: 35077479.','NCCN Guidelines Insights: Survivorship, Version 2.2024. JNCCN. 2024.','Huffman LB et al. Sexual Health in Gynecologic Cancer Survivors: A Review and Clinical Guide. Gynecol Oncol. 2016.','Goldman-Cecil Medicine, 22e. Approach to Survivors of Gynecologic Cancers.','Berek & Novak’s Gynecology. Chronic morbidity after cervical cancer treatment.'] bullets(s,refs,.8,1.68,11.75,4.8,12,NAVY) def question_slide(): s=prs.slides.add_slide(blank);rect(s,0,0,13.333,7.5,NAVY);circle(s,9.55,.85,2.45,TEAL);circle(s,10.25,1.6,.7,CORAL);tx(s,'QUESTIONS\n& DISCUSSION',.85,1.3,7.2,1.3,34,WHITE,True);tx(s,'What will help you rebuild the base in your setting?',.9,3.15,7.8,.35,20,SEA);ln(s,.9,4.08,6.6,4.08,SEA,1.5);tx(s,'Thank you',.9,4.42,3.5,.38,22,WHITE,True);tx(s,'Contact: ____________________',.9,6.56,5.5,.25,12,SEA) # build content # Opening 1-8 title_slide(); agenda_slide(); objective_slide(); activity_slide(1,'Start with the survivor voice','What pelvic health issue is most commonly missed in your service?'); treatment_system_slide(); domains_slide(); anatomy_slide(); timeline_slide() # Context 9-16 burden_slide(); activity_slide(2,'Assumptions check','Which symptom would you least expect a patient to raise without being asked?'); treatment_system_slide(); domains_slide(); anatomy_slide(); timeline_slide(); burden_slide(); activity_slide(3,'Language rehearsal','Write one sentence that normalises pelvic health after cancer treatment.') # Assessment 17-32 assessment_intro(); screen_slide(); history_slide(); measures_slide(); diary_slide(); exam_slide(); phenotype_slide(); classify_slide(); activity_slide(4,'Assessment lab','What is the minimum dataset you can use in a 20-minute first appointment?'); assessment_intro(); screen_slide(); history_slide(); diary_slide(); exam_slide(); phenotype_slide(); classify_slide() # Intervention 33-48 intervention_layers(); breath_slide(); relaxation_slide(); strengthening_slide(); biofeedback_slide(); manual_slide(); home_slide(); activity_slide(5,'Plan design','Choose one cue that makes your home exercise advice more specific.'); intervention_layers(); breath_slide(); relaxation_slide(); strengthening_slide(); biofeedback_slide(); manual_slide(); home_slide(); activity_slide(6,'Skill reflection','Where might “more strengthening” be the wrong first intervention?') # Symptom pathways 49-64 bladder_pathway(); urge_slide(); bowel_pathway(); bowel_demo(); sexual_intro(); pain_slide(); dilator_slide(); lym_slide(); activity_slide(7,'Symptom pathway lab','Pick one domain and name: screen, first action, referral trigger.'); bladder_pathway(); urge_slide(); bowel_pathway(); sexual_intro(); pain_slide(); dilator_slide(); lym_slide() # Cases 65-72 case_slide(1,'Case 1: urgency and fear','Maya, 42, is 8 months after chemoradiation. She voids “just in case” hourly, avoids leaving home, and reports pelvic tightness. No fever or haematuria; oncology follow-up is current.',['What further screen and diary items matter?','What is the dominant phenotype today?','What are two low-risk initial strategies?']) case_answer(1,['urgency / frequency','protective bracing','possible high-tone contribution'],['consented education','3-day diary','urge strategy + exhale','graded community exposure'],['automatic high-volume strengthening','rigid bladder intervals without review'],['oncology / GP if new pain, bleeding, infection concern, worsening symptoms']) case_slide(2,'Case 2: painful penetration after radiation','Leila, 50, completed pelvic radiotherapy 18 months ago. She wants to resume intimacy but has pain with attempted penetration and avoids examinations. She reports dryness and anxiety.',['What consent choices should be offered?','Which contributors could be present?','What would a graded first plan include?']) case_answer(2,['pain / tissue change','guarding / high tone','sexual confidence and context'],['permission-led education','external assessment options','comfort measures','down-training','medical / gynaecology coordination'],['forcing internal examination','painful dilation','assuming motivation is adherence problem'],['gynaecology for new bleeding / lesion / tissue concern; sex therapy as wanted']) case_slide(3,'Case 3: leakage with return to fitness','Rosa, 35, underwent radical hysterectomy 6 months ago. She reports leakage with running and coughing, fatigue, and worry that exercise is unsafe. No pain and she can voluntarily contract and relax pelvic floor muscles.',['What physical tasks would you assess?','How would you dose capacity work?','How would you integrate fatigue and return-to-run?']) case_answer(3,['capacity / timing deficit','return-to-impact confidence','fatigue as dose modifier'],['task analysis','progressive strength / timing','walking-to-run exposure','recovery monitoring'],['all-or-nothing exercise','ignoring sleep and fatigue','generic instructions without task practice'],['medical review for new bleeding, pain, retention, infection, concerning fatigue']) # Safety/evidence/implementation 73-80 redflag_slide(); implementation_slide(); audit_slide(); evidence_slide(); activity_slide(8,'Commitment to change','What single system change can make pelvic health easier to disclose and access?','3 MINUTES'); takehome_slide(); references_slide(); question_slide() # add agenda timing summary as final practical extra to hit 80 exactly s=new('Appendix','Facilitator pacing guide','Suggested timing to maintain a 120-minute interactive format.') segments=[('Opening + context','0–25 min','slides 1–16'),('Assessment','25–50 min','slides 17–32'),('Intervention lab','50–75 min','slides 33–48'),('Symptom pathways','75–95 min','slides 49–64'),('Cases + implementation','95–112 min','slides 65–76'),('Close + questions','112–120 min','slides 77–80')] for i,(a,b,c) in enumerate(segments): y=1.65+i*.72;rect(s,.8,y,2.8,.45,[TEAL,SEA,GOLD,CORAL,NAVY,TEAL][i],True);tx(s,a,.98,y+.12,2.4,.16,12,WHITE,True,PP_ALIGN.CENTER);tx(s,b,4.0,y+.09,1.6,.2,16,NAVY,True);tx(s,c,6.0,y+.1,3.1,.2,14,MUTED) # speaker notes not required but set core properties prs.core_properties.title='Rebuilding the Base: Pelvic Floor Rehabilitation in Cervical Cancer Survivorship' prs.core_properties.subject='120-minute Physiotherapy Conference Presentation' prs.core_properties.author='Orris' prs.save(OUT) print(OUT, len(prs.slides)) PY python "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/src/build_2hour_deck.py" ls -lh "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output/Rebuilding_the_Base_2_Hour_Physiotherapy_Conference.pptx"
python - <<'PY' p='/tmp/workspace/pelvic-floor-cervical-cancer-ppt/src/build_2hour_deck.py' s=open(p).read() old="boxes=[('1. Is it safe?','red flags / active issues','REFER OR CO-MANAGE',CORAL),('2. What is dominant?','capacity / pain / coordination / tissue','SELECT PHENOTYPE',TEAL),('3. What matters now?','goal / readiness / context','SET 1–2 GOALS',GOLD),('4. What is tolerable?','irritability / fatigue / tissue','DOSE + PROGRESS',SEA)]" new="boxes=[('1. Is it safe?','red flags / active issues',CORAL,'REFER OR CO-MANAGE'),('2. What is dominant?','capacity / pain / coordination / tissue',TEAL,'SELECT PHENOTYPE'),('3. What matters now?','goal / readiness / context',GOLD,'SET 1–2 GOALS'),('4. What is tolerable?','irritability / fatigue / tissue',SEA,'DOSE + PROGRESS')]" assert old in s open(p,'w').write(s.replace(old,new)) PY python "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/src/build_2hour_deck.py" ls -lh "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output/Rebuilding_the_Base_2_Hour_Physiotherapy_Conference.pptx"
python - <<'PY' p='/tmp/workspace/pelvic-floor-cervical-cancer-ppt/src/build_2hour_deck.py' s=open(p).read() old="# Safety/evidence/implementation 73-80\nredflag_slide(); implementation_slide(); audit_slide(); evidence_slide(); activity_slide(8,'Commitment to change','What single system change can make pelvic health easier to disclose and access?','3 MINUTES'); takehome_slide(); references_slide(); question_slide()" new="# Safety/evidence/implementation\nredflag_slide(); implementation_slide(); audit_slide(); evidence_slide(); activity_slide(8,'Commitment to change','What single system change can make pelvic health easier to disclose and access?','3 MINUTES'); takehome_slide(); activity_slide(9,'Final synthesis','Write one phrase you will use to invite a pelvic health conversation this week.','1 MINUTE'); references_slide(); question_slide()" assert old in s open(p,'w').write(s.replace(old,new)) PY python "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/src/build_2hour_deck.py" python - <<'PY' from pptx import Presentation import zipfile p='/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output/Rebuilding_the_Base_2_Hour_Physiotherapy_Conference.pptx' prs=Presentation(p) print('Slides:',len(prs.slides)) for i in [1,2,16,32,48,64,72,77,78,79,80]: s=prs.slides[i-1] t=[sh.text.replace('\n',' | ') for sh in s.shapes if getattr(sh,'has_text_frame',False) and sh.text.strip()] print(i, t[0][:100] if t else 'NO TEXT') with zipfile.ZipFile(p) as z: print('Integrity:',z.testzip()) PY
python - <<'PY' from pptx import Presentation from pptx.enum.shapes import MSO_SHAPE_TYPE p='/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output/Rebuilding_the_Base_2_Hour_Physiotherapy_Conference.pptx' prs=Presentation(p) issues=[] for sn,slide in enumerate(prs.slides,1): for sh in slide.shapes: if sh.left<0 or sh.top<0 or sh.left+sh.width>prs.slide_width or sh.top+sh.height>prs.slide_height: issues.append((sn, sh.shape_type, sh.left,sh.top,sh.width,sh.height)) print('slides=',len(prs.slides),'out_of_bounds=',len(issues)) print(issues[:10]) PY ls -lh "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output/"
python - <<'PY' from pptx import Presentation p='/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output/Rebuilding_the_Base_2_Hour_Physiotherapy_Conference.pptx' prs=Presentation(p) for sn in [50,59,72]: print('\nSlide',sn) for sh in prs.slides[sn-1].shapes: if sh.left<0: print(repr(sh.text if getattr(sh,'has_text_frame',False) else ''), sh.left, sh.top, sh.width) PY
python - <<'PY' p='/tmp/workspace/pelvic-floor-cervical-cancer-ppt/src/build_2hour_deck.py' s=open(p).read() s=s.replace("x=.42+i*2.55;circle(s,x,2.23,.7,c,str(i+1),16);tx(s,a,x-.18,3.22,1.08,.25,14,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x-.45,3.66,1.6,.62,11,MUTED,False,PP_ALIGN.CENTER)","x=.55+i*2.55;circle(s,x,2.23,.7,c,str(i+1),16);tx(s,a,x-.18,3.22,1.08,.25,14,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x-.45,3.66,1.6,.62,11,MUTED,False,PP_ALIGN.CENTER)") s=s.replace("x=.42+i*2.55;circle(s,x,2.22,.72,c,str(i+1),16);tx(s,a,x-.15,3.27,1.05,.25,14,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x-.45,3.72,1.6,.52,11,MUTED,False,PP_ALIGN.CENTER)","x=.55+i*2.55;circle(s,x,2.22,.72,c,str(i+1),16);tx(s,a,x-.15,3.27,1.05,.25,14,NAVY,True,PP_ALIGN.CENTER);tx(s,b,x-.45,3.72,1.6,.52,11,MUTED,False,PP_ALIGN.CENTER)") open(p,'w').write(s) PY python "/tmp/workspace/pelvic-floor-cervical-cancer-ppt/src/build_2hour_deck.py" python - <<'PY' from pptx import Presentation import zipfile p='/tmp/workspace/pelvic-floor-cervical-cancer-ppt/output/Rebuilding_the_Base_2_Hour_Physiotherapy_Conference.pptx' prs=Presentation(p) issues=[] for sn,slide in enumerate(prs.slides,1): for sh in slide.shapes: if sh.left<0 or sh.top<0 or sh.left+sh.width>prs.slide_width or sh.top+sh.height>prs.slide_height: issues.append(sn) print('slides=',len(prs.slides),'out_of_bounds=',issues) with zipfile.ZipFile(p) as z: print('pptx_integrity=',z.testzip()) PY
Rebuilding the Base 2 Hour Physiotherapy Conference
Presentation · PPTX