Read the case from first 3 images and creat poster as shown in last image ..editable
mkdir -p /tmp/workspace/asd-poster && ls /tmp/workspace/
~/asd-poster/create_poster.py
"""
Create an editable PPTX poster for the ASD homoeopathic case report
modeled after the "From Persistent Cough to Clinical Relief" template.
"""
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx.util import Cm
import copy
# ── Color Palette (matching template) ──────────────────────────────────────
DARK_BLUE = RGBColor(0x0D, 0x2B, 0x55) # deep navy
MID_BLUE = RGBColor(0x1A, 0x52, 0x76) # section headers
ACCENT_RED = RGBColor(0xC0, 0x10, 0x10) # titles / accents
LIGHT_BLUE = RGBColor(0xD6, 0xE8, 0xF7) # light bg panels
GOLD = RGBColor(0xF0, 0xA8, 0x00) # highlight arrow
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
BLACK = RGBColor(0x0A, 0x0A, 0x0A)
LIGHT_GRAY = RGBColor(0xF0, 0xF4, 0xF8)
GREEN_DARK = RGBColor(0x14, 0x6B, 0x3A)
GREEN_LIGHT = RGBColor(0xD4, 0xED, 0xDA)
RED_LIGHT = RGBColor(0xF8, 0xD7, 0xDA)
TEAL = RGBColor(0x0D, 0x6E, 0x6E)
# ── Slide dimensions: A1 portrait (594 × 841 mm) ───────────────────────────
W_MM, H_MM = 594, 841
def mm(val):
return Cm(val / 10)
# Helper: add a solid-fill rectangle
def add_rect(slide, x, y, w, h, fill_color, border_color=None, border_width=0):
shape = slide.shapes.add_shape(
1, # MSO_SHAPE_TYPE.RECTANGLE
mm(x), mm(y), mm(w), mm(h)
)
shape.fill.solid()
shape.fill.fore_color.rgb = fill_color
if border_color:
shape.line.color.rgb = border_color
shape.line.width = Pt(border_width)
else:
shape.line.fill.background()
return shape
# Helper: add a text box
def add_textbox(slide, x, y, w, h, text, font_size=10, bold=False,
color=BLACK, align=PP_ALIGN.LEFT, wrap=True,
bg_color=None, border_color=None, v_anchor=None):
txBox = slide.shapes.add_textbox(mm(x), mm(y), mm(w), mm(h))
tf = txBox.text_frame
tf.word_wrap = wrap
if v_anchor:
tf.vertical_anchor = v_anchor
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.color.rgb = color
if bg_color:
txBox.fill.solid()
txBox.fill.fore_color.rgb = bg_color
else:
txBox.fill.background()
if border_color:
txBox.line.color.rgb = border_color
txBox.line.width = Pt(0.5)
else:
txBox.line.fill.background()
return txBox
# Helper: add textbox with multiple paragraphs
def add_textbox_multi(slide, x, y, w, h, paras, bg_color=None, border_color=None):
"""
paras: list of dicts with keys: text, size, bold, color, align, bullet
"""
txBox = slide.shapes.add_textbox(mm(x), mm(y), mm(w), mm(h))
tf = txBox.text_frame
tf.word_wrap = True
if bg_color:
txBox.fill.solid()
txBox.fill.fore_color.rgb = bg_color
else:
txBox.fill.background()
if border_color:
txBox.line.color.rgb = border_color
txBox.line.width = Pt(0.5)
else:
txBox.line.fill.background()
for i, para in enumerate(paras):
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.alignment = para.get('align', PP_ALIGN.LEFT)
if para.get('bullet'):
p.space_before = Pt(1)
run = p.add_run()
run.text = para.get('text', '')
run.font.size = Pt(para.get('size', 9))
run.font.bold = para.get('bold', False)
run.font.color.rgb = para.get('color', BLACK)
if para.get('italic'):
run.font.italic = True
return txBox
# ── Create presentation ────────────────────────────────────────────────────
prs = Presentation()
prs.slide_width = mm(W_MM)
prs.slide_height = mm(H_MM)
blank_layout = prs.slide_layouts[6] # blank layout
slide = prs.slides.add_slide(blank_layout)
# ═══════════════════════════════════════════════════════════════════════════
# BACKGROUND
# ═══════════════════════════════════════════════════════════════════════════
add_rect(slide, 0, 0, W_MM, H_MM, RGBColor(0xF2, 0xF6, 0xFC)) # light bg
# ═══════════════════════════════════════════════════════════════════════════
# TOP BANNER
# ═══════════════════════════════════════════════════════════════════════════
add_rect(slide, 0, 0, W_MM, 52, DARK_BLUE)
# BIG TITLE (left)
add_textbox_multi(slide, 6, 3, 340, 46, [
{'text': 'FROM', 'size': 28, 'bold': True, 'color': WHITE, 'align': PP_ALIGN.LEFT},
{'text': 'SILENCE TO', 'size': 28, 'bold': True, 'color': ACCENT_RED, 'align': PP_ALIGN.LEFT},
{'text': 'COMMUNICATION', 'size': 28, 'bold': True, 'color': WHITE, 'align': PP_ALIGN.LEFT},
])
# Subtitle
add_textbox(slide, 6, 46, 340, 9,
'AN EVIDENCE-BASED HOMOEOPATHIC CASE REPORT OF AUTISM SPECTRUM DISORDER',
font_size=7.5, bold=False, color=LIGHT_BLUE, align=PP_ALIGN.LEFT)
# AUTHOR block (right)
add_textbox_multi(slide, 360, 4, 140, 24, [
{'text': 'AUTHOR', 'size': 7, 'bold': True, 'color': GOLD},
{'text': 'Dr. Harsh Patel', 'size': 9.5, 'bold': True, 'color': WHITE},
{'text': '', 'size': 4, 'bold': False, 'color': WHITE},
{'text': 'GUIDED BY', 'size': 7, 'bold': True, 'color': GOLD},
{'text': 'Dr. Jaykumar Chandarana', 'size': 9.5, 'bold': True, 'color': WHITE},
])
# Institution block
add_textbox_multi(slide, 360, 28, 180, 28, [
{'text': '🏛 PG DEPARTMENT OF MATERIA MEDICA', 'size': 7.5, 'bold': True, 'color': LIGHT_BLUE},
{'text': ' BARODA HOMOEOPATHIC MEDICAL COLLEGE', 'size': 7.5, 'bold': False, 'color': LIGHT_BLUE},
{'text': ' & HOSPITAL, VADODARA, GUJARAT', 'size': 7.5, 'bold': False, 'color': LIGHT_BLUE},
{'text': 'ESTD. : 1992', 'size': 7.5, 'bold': True, 'color': GOLD},
])
# ═══════════════════════════════════════════════════════════════════════════
# CASE SNAPSHOT (top-left panel)
# ═══════════════════════════════════════════════════════════════════════════
Y0 = 57
add_rect(slide, 5, Y0, 178, 44, DARK_BLUE, WHITE, 0.3)
add_textbox(slide, 5, Y0, 178, 7, 'CASE SNAPSHOT',
font_size=8, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
bg_color=MID_BLUE)
snapshot_items = [
('👦 AGE / SEX', '5 Years, Male'),
('🔖 DIAGNOSIS', 'Autism Spectrum Disorder (ASD)'),
('⏱ DURATION', '~3 Years (since age 2)'),
('💊 MAIN REMEDY', 'Baryta carbonica'),
('📈 OUTCOME', 'Significant Improvement in 4 months'),
]
for i, (label, val) in enumerate(snapshot_items):
yy = Y0 + 8 + i * 7.2
add_textbox_multi(slide, 7, yy, 174, 7, [
{'text': label + ': ', 'size': 7, 'bold': True, 'color': GOLD},
{'text': val, 'size': 7.5, 'bold': False, 'color': WHITE},
])
# ═══════════════════════════════════════════════════════════════════════════
# COMORBIDITIES / DEVELOPMENTAL HISTORY (top-right of snapshot row)
# ═══════════════════════════════════════════════════════════════════════════
add_rect(slide, 190, Y0, 200, 44, DARK_BLUE, WHITE, 0.3)
add_textbox(slide, 190, Y0, 200, 7, 'DEVELOPMENTAL HISTORY',
font_size=8, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
bg_color=MID_BLUE)
dev_items = [
'Normal birth: LSCS, BW 3.9 kg, full-term (2nd child)',
'Normal milestones up to 1.5 years',
'No speech by age 2 yrs → Neurologist consulted',
'ASD diagnosed; OT started at Gandhinagar',
'Walking – 15 months | Dentition – 9 months | Sitting – 8 months',
]
for i, txt in enumerate(dev_items):
add_textbox(slide, 192, Y0 + 8 + i * 7, 196, 7,
'• ' + txt, font_size=7, color=LIGHT_BLUE)
# ═══════════════════════════════════════════════════════════════════════════
# KEY COMPLAINTS (right column)
# ═══════════════════════════════════════════════════════════════════════════
add_rect(slide, 398, Y0, 191, 120, LIGHT_GRAY, MID_BLUE, 0.5)
add_textbox(slide, 398, Y0, 191, 8, 'KEY COMPLAINTS',
font_size=8.5, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
bg_color=MID_BLUE)
key_complaints = [
('🤐', 'No eye-to-eye contact'),
('🔄', 'Bites himself when angry'),
('🏃', 'Extreme restlessness (3+)'),
('🤫', 'No speech – meaningless words only'),
('👐', 'Puts everything in mouth'),
('🌀', 'Likes swinging to and fro'),
('🧍', 'Does not mingle / plays alone'),
('📚', 'Cannot write basic alphabets'),
('😰', 'Fear of heights'),
('💧', 'Excessive salivation'),
('❌', 'Does not follow instructions'),
('🧠', 'Forgetfulness (full++)'),
('😴', 'Teeth grinding in sleep'),
('🥶', 'Chilly thermal'),
]
for i, (icon, txt) in enumerate(key_complaints):
add_textbox_multi(slide, 400, Y0 + 10 + i * 7.8, 187, 8, [
{'text': icon + ' ', 'size': 7.5, 'bold': False, 'color': MID_BLUE},
{'text': txt, 'size': 7.5, 'bold': False, 'color': BLACK},
])
# ═══════════════════════════════════════════════════════════════════════════
# PERSONAL HISTORY (below snapshot)
# ═══════════════════════════════════════════════════════════════════════════
Y1 = Y0 + 46
add_rect(slide, 5, Y1, 370, 56, WHITE, MID_BLUE, 0.5)
add_textbox(slide, 5, Y1, 370, 7, 'PERSONAL HISTORY',
font_size=8, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
bg_color=MID_BLUE)
ph_left = [
('Thermal', 'Chilly 2+; worse cold drinks, food, cold air/water'),
('Perspiration', 'Normal as per season'),
('Appetite', 'Decreased. Eructation 3+'),
('Diet', 'Vegetarian'),
('Desire', 'Sweet, maize'),
('Aversion', 'Dal, vegetables'),
]
ph_right = [
('Thirst', 'As per season, 1.5–2 L/day'),
('Urine', 'No burning, transparent'),
('Bowels', 'Slimy, sticky stool; smell 1+; better in morning'),
('Habits', 'Everything puts in mouth'),
('Sleep', '8 hours, no complaints'),
('Dreams', 'Grinding of teeth'),
]
for i, (lbl, val) in enumerate(ph_left):
yy = Y1 + 8 + i * 7.8
add_textbox_multi(slide, 7, yy, 180, 8, [
{'text': lbl + ': ', 'size': 7.5, 'bold': True, 'color': MID_BLUE},
{'text': val, 'size': 7.5, 'color': BLACK},
])
for i, (lbl, val) in enumerate(ph_right):
yy = Y1 + 8 + i * 7.8
add_textbox_multi(slide, 190, yy, 183, 8, [
{'text': lbl + ': ', 'size': 7.5, 'bold': True, 'color': MID_BLUE},
{'text': val, 'size': 7.5, 'color': BLACK},
])
# ═══════════════════════════════════════════════════════════════════════════
# KEY COMPLAINTS continued / PAST HISTORY (right column continuation)
# ═══════════════════════════════════════════════════════════════════════════
Y2 = Y0 + 122
add_rect(slide, 398, Y2, 191, 36, LIGHT_GRAY, MID_BLUE, 0.5)
add_textbox(slide, 398, Y2, 191, 7, 'PAST HISTORY',
font_size=8, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
bg_color=MID_BLUE)
past = [
'Recurrent URTI (cough, cold, coryza – watery) every 10 days',
'Viral fever 2–3 times',
'Recurrent falls from bed',
]
for i, t in enumerate(past):
add_textbox(slide, 400, Y2 + 9 + i * 8.5, 187, 9, '• ' + t, font_size=7.5, color=BLACK)
# ═══════════════════════════════════════════════════════════════════════════
# TOTALITY OF SYMPTOMS + REPERTORIZATION
# ═══════════════════════════════════════════════════════════════════════════
Y3 = Y1 + 58
add_rect(slide, 5, Y3, 230, 95, LIGHT_GRAY, MID_BLUE, 0.5)
add_textbox(slide, 5, Y3, 230, 8, 'TOTALITY OF SYMPTOMS',
font_size=8.5, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
bg_color=MID_BLUE)
totality = [
'Autism Spectrum Disorder',
'Everything puts in mouth',
'Likes swinging (to and fro movement)',
'Developmental milestones delayed',
'Fear of high places; mingling with others',
'Sits in corners; does not mingle',
'Inattentive; forgetful (full++)',
'Restless; constantly moving / wandering',
'Stool – slimy, offensive, mucus, sticky',
'Thermal: Chilly',
'Tendency to catch cold easily (URTI)',
'Desire: sweet, maize',
'Grinding teeth in sleep',
'Open mouth mostly; excessive salivation',
]
for i, t in enumerate(totality):
add_textbox(slide, 7, Y3 + 9 + i * 6.1, 226, 7,
'• ' + t, font_size=7, color=BLACK)
# ── REPERTORIZATION ────────────────────────────────────────────────────────
add_rect(slide, 242, Y3, 350, 95, LIGHT_GRAY, MID_BLUE, 0.5)
add_textbox(slide, 242, Y3, 350, 8, 'REPERTORIZATION (Complete Repertory – Zomeo Pro)',
font_size=8.5, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
bg_color=MID_BLUE)
# Rubrics list
rubrics = [
'[Kent] Mind – Absent-minded (see Forgetful)',
'[Kent] Mind – Restlessness, nervousness',
'[Kent] Mouth – Salivation',
'[Kent] Stomach – Desires: Sweets',
'[Kent] Teeth – Grinding',
'[Kent] Generalities – Cold: In general agg.',
]
add_textbox(slide, 244, Y3 + 9, 160, 7, 'RUBRICS USED:', font_size=7.5, bold=True, color=MID_BLUE)
for i, r in enumerate(rubrics):
add_textbox(slide, 244, Y3 + 16 + i * 6.8, 158, 7,
'▸ ' + r, font_size=6.8, color=BLACK)
# Top remedies table header
table_x = 408
add_rect(slide, table_x, Y3 + 9, 180, 9, MID_BLUE)
headers = ['Remedy', 'Total', 'Sx']
col_w = [65, 58, 57]
cx = table_x
for h, cw in zip(headers, col_w):
add_textbox(slide, cx, Y3 + 9, cw, 9, h, font_size=7.5, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
cx += cw
top_remedies = [
('Lycopodium', '15', '6'),
('Sepia', '15', '6'),
('Sulphur', '14', '6'),
('Calcarea carb', '13', '6'),
('Mercurius', '13', '6'),
('Baryta carb', '11', '6'), # Highlighted – chosen remedy
('Nux vomica', '12', '6'),
('Kali carb', '12', '5'),
]
for j, (rem, tot, sx) in enumerate(top_remedies):
bg = GREEN_LIGHT if rem == 'Baryta carb' else (WHITE if j % 2 == 0 else LIGHT_GRAY)
row_y = Y3 + 19 + j * 9.4
add_rect(slide, table_x, row_y, 180, 9.4, bg)
vals = [rem, tot, sx]
cx = table_x
for v, cw in zip(vals, col_w):
fc = GREEN_DARK if rem == 'Baryta carb' else BLACK
add_textbox(slide, cx, row_y, cw, 9.4, v, font_size=7,
bold=(rem == 'Baryta carb'), color=fc, align=PP_ALIGN.CENTER)
cx += cw
add_textbox(slide, table_x, Y3 + 19 + 8 * 9.4, 180, 7,
'★ Baryta carb selected based on totality & individualisation',
font_size=7, bold=True, color=ACCENT_RED)
# ═══════════════════════════════════════════════════════════════════════════
# SYMPTOM ANALYSIS (Mental + Physical Generals + Particulars)
# ═══════════════════════════════════════════════════════════════════════════
Y4 = Y3 + 97
add_rect(slide, 5, Y4, 285, 90, LIGHT_GRAY, MID_BLUE, 0.5)
add_textbox(slide, 5, Y4, 285, 8, 'SYMPTOM ANALYSIS',
font_size=8.5, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
bg_color=MID_BLUE)
# Mental / Emotional
add_textbox(slide, 7, Y4 + 10, 130, 7, '🧠 MENTAL / EMOTIONAL',
font_size=7.5, bold=True, color=DARK_BLUE)
mental = [
'Dull, inattentive, forgetful (full++)',
'No eye contact; does not recognise people',
'Speaks meaningless words; cannot write ABCDs',
'Aversion to strangers; sits alone in corners',
'Does not play / mingle with other children',
'Fear of heights; clings to parents',
'Does not follow instructions or orders',
'Weakness ++ ; bites himself when angry',
]
for i, t in enumerate(mental):
add_textbox(slide, 7, Y4 + 17 + i * 6.3, 132, 7,
'• ' + t, font_size=6.5, color=BLACK)
# Physical Generals
add_textbox(slide, 145, Y4 + 10, 143, 7, '💪 PHYSICAL GENERALS',
font_size=7.5, bold=True, color=DARK_BLUE)
physical = [
'Thermal: Chilly 2+',
'Desire: Sweet, maize',
'Aversion: Dal, vegetables',
'Bowels: Slimy, sticky, smelly stool',
'Appetite: Decreased; eructation 3+',
'Thirst: 1.5–2 L/day (normal)',
'Sleep: 8 hours, undisturbed',
'Dreams: Grinding teeth',
]
for i, t in enumerate(physical):
add_textbox(slide, 145, Y4 + 17 + i * 6.3, 141, 7,
'• ' + t, font_size=6.5, color=BLACK)
# ─ REMEDY SELECTION ─────────────────────────────────────────────────────
add_rect(slide, 297, Y4, 292, 90, LIGHT_GRAY, MID_BLUE, 0.5)
add_textbox(slide, 297, Y4, 292, 8, 'REMEDY SELECTION',
font_size=8.5, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
bg_color=MID_BLUE)
add_textbox(slide, 299, Y4 + 10, 288, 7, '🌿 BARYTA CARBONICA 200',
font_size=9, bold=True, color=GREEN_DARK)
add_textbox(slide, 299, Y4 + 18, 288, 7, 'JUSTIFICATION:', font_size=8, bold=True, color=MID_BLUE)
just = [
'Dwarfishness in body and mind (Kent); late in learning & developing',
'Aversion to strangers; does not want to play; better alone',
'Chilliness predominates; worse in company',
'Absent-minded, cannot remember; forgetful',
'Salivation; open mouth; grinding teeth',
'Tendency to catch cold (URTI) easily',
'Fear of high places; holds & clings to parents',
'Restlessness; constantly moving and wandering',
'Developmental delay – intellect & memory affected',
]
for i, t in enumerate(just):
add_textbox(slide, 299, Y4 + 25 + i * 6.8, 288, 7,
'✓ ' + t, font_size=7, color=BLACK)
# Clarke & Kent quotes
add_textbox_multi(slide, 299, Y4 + 88, 288, 20, [
{'text': 'Dr J H Clarke: ', 'size': 7, 'bold': True, 'color': ACCENT_RED},
{'text': '"Baryta-carb has a want of self-confidence and aversion to strangers. '
'Children cannot remember and learn. Chilliness predominates, worse in company, better alone."',
'size': 6.8, 'italic': True, 'color': BLACK},
])
# ═══════════════════════════════════════════════════════════════════════════
# TREATMENT (prescription box)
# ═══════════════════════════════════════════════════════════════════════════
Y5 = Y4 + 92
add_rect(slide, 5, Y5, 285, 14, DARK_BLUE)
add_textbox(slide, 5, Y5, 285, 14,
'TREATMENT: Baryta carbonica 200',
font_size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(slide, 297, Y5, 292, 14, MID_BLUE)
add_textbox(slide, 297, Y5, 292, 14,
'Initial Rx: Baryta-carb 200 – 3 doses daily × 3 days + SL 30 TDS × 1 week',
font_size=8.5, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════════════════════════
# FOLLOW-UP TABLE
# ═══════════════════════════════════════════════════════════════════════════
Y6 = Y5 + 16
add_rect(slide, 5, Y6, 582, 8, MID_BLUE)
add_textbox(slide, 5, Y6, 582, 8, 'FOLLOW-UP',
font_size=9, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Column widths
col_widths = [52, 320, 208]
col_labels = ['DATE', 'SYMPTOMS / PROGRESS', 'PRESCRIPTION']
# Header row
rx = 5
add_rect(slide, 5, Y6 + 9, 582, 8, DARK_BLUE)
for lbl, cw in zip(col_labels, col_widths):
add_textbox(slide, rx, Y6 + 9, cw, 8, lbl,
font_size=7.5, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
rx += cw
followup_data = [
('11/03/2023',
'AS CASE DISCUSSED (all symptoms as above)',
'Baryta-carb 200, 3 doses daily × 3 days. SL 30 TDS × 1 week'),
('18/03/23',
'Sleeps well; now hears others; decrease in restlessness.',
'Baryta-carb 200, 4 doses – 1 dose every Sunday morning. SL 30 TDS × 1 month'),
('19/04/23',
'Follows parents & therapists instructions. Sees when spoken to. Hyperactivity decreased.',
'Baryta-carb 200, 4 doses – 1 dose every Sunday morning. SL 30 TDS × 1 month'),
('17/05/23',
'Comes when asked; tries to speak while looking at book; wears right shoes; follows instructions.',
'Baryta-carb 200, 4 doses – 1 dose every Sunday morning. SL 30 TDS × 1 month'),
('12/07/23',
'Further improvement: Eye contact developed; says "Bye"; memory improved; follows commands; sits focused; restlessness lesser.',
'SL 30 TDS × 1 month. Baryta-carb STOPPED – continuous improvement seen.'),
]
for j, (dt, sx, rx_txt) in enumerate(followup_data):
row_y = Y6 + 18 + j * 14.5
bg = LIGHT_GRAY if j % 2 == 0 else WHITE
add_rect(slide, 5, row_y, 582, 14.5, bg, MID_BLUE, 0.3)
vals = [dt, sx, rx_txt]
cx2 = 5
for v, cw in zip(vals, col_widths):
add_textbox(slide, cx2 + 1, row_y + 0.5, cw - 2, 14,
v, font_size=7, color=BLACK, align=PP_ALIGN.LEFT)
cx2 += cw
# ═══════════════════════════════════════════════════════════════════════════
# BEFORE vs AFTER
# ═══════════════════════════════════════════════════════════════════════════
Y7 = Y6 + 20 + 5 * 14.5
add_rect(slide, 5, Y7, 285, 8, ACCENT_RED)
add_textbox(slide, 5, Y7, 285, 8, 'BEFORE TREATMENT',
font_size=8.5, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
before = [
'No eye contact',
'No speech / meaningless words',
'Extreme restlessness (3+)',
'No response to instructions',
'Cannot write ABCDs',
'Excessive salivation',
'Bites himself when angry',
]
add_rect(slide, 5, Y7 + 9, 285, len(before) * 8 + 2, RED_LIGHT)
for i, t in enumerate(before):
add_textbox(slide, 7, Y7 + 10 + i * 8, 281, 8,
'✘ ' + t, font_size=7.5, color=RGBColor(0x99, 0x00, 0x00))
# Arrow
add_textbox(slide, 295, Y7 + 20, 8, 30, '→', font_size=24, bold=True,
color=GOLD, align=PP_ALIGN.CENTER)
add_rect(slide, 305, Y7, 282, 8, GREEN_DARK)
add_textbox(slide, 305, Y7, 282, 8, 'AFTER TREATMENT',
font_size=8.5, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
after = [
'Proper eye contact developed',
'Tries to speak (looking at book)',
'Restlessness significantly reduced',
'Follows instructions & commands',
'Wears right shoes independently',
'Memory improved; says "Bye"',
'Focuses and sits in one place',
]
add_rect(slide, 305, Y7 + 9, 282, len(after) * 8 + 2, GREEN_LIGHT)
for i, t in enumerate(after):
add_textbox(slide, 307, Y7 + 10 + i * 8, 278, 8,
'✔ ' + t, font_size=7.5, color=GREEN_DARK)
# ═══════════════════════════════════════════════════════════════════════════
# DISCUSSION | CONCLUSION | REFERENCES
# ═══════════════════════════════════════════════════════════════════════════
Y8 = Y7 + len(before) * 8 + 14
# Three equal columns
col_x = [5, 200, 395]
col_titles = ['DISCUSSION', 'CONCLUSION', 'REFERENCES']
col_bg = [MID_BLUE, DARK_BLUE, MID_BLUE]
col_contents = [
[
'• Individualised homoeopathic management based on totality of symptoms.',
'• Baryta carbonica was selected based on prominent characteristics: dullness, forgetfulness, developmental delay, aversion to strangers, chilliness.',
'• Serial follow-up showed sustained and progressive improvement.',
'• Occupational therapy continued as adjunct.',
'• Case published in National Journal of Homoeopathy, Oct 2023 (Periodic Table Row 6).',
],
[
'• Individualised homoeopathic management resulted in marked clinical improvement.',
'• Sustained improvement in ASD symptoms over 4 months of treatment.',
'• Baryta carbonica addressed the constitutional and specific symptoms of the child.',
'• Adds evidence to homoeopathic treatment in neurodevelopmental disorders.',
'• Quality of life improved for both the child and family.',
],
[
'1. Clarke J H. A Dictionary of Practical Materia Medica.',
'2. Kent J T. Repertory of the Homoeopathic Materia Medica.',
'3. Boericke W. Pocket Manual of Homoeopathic Materia Medica.',
'4. National Journal of Homoeopathy, Oct 2023, Periodic Table Row 6.',
'5. Case: Dr Jaykumar Chandarana & Dr Harsh Patel, Baroda Homoeopathic Medical College.',
],
]
rem_h = H_MM - Y8 - 10
for ci, (cx3, ctitle, cbg, items) in enumerate(
zip(col_x, col_titles, col_bg, col_contents)):
add_rect(slide, cx3, Y8, 188, rem_h, LIGHT_GRAY, MID_BLUE, 0.5)
add_textbox(slide, cx3, Y8, 188, 8, ctitle,
font_size=8, bold=True, color=WHITE, align=PP_ALIGN.CENTER,
bg_color=cbg)
for i, item in enumerate(items):
add_textbox(slide, cx3 + 2, Y8 + 10 + i * 12, 184, 12,
item, font_size=7, color=BLACK)
# ═══════════════════════════════════════════════════════════════════════════
# FOOTER
# ═══════════════════════════════════════════════════════════════════════════
add_rect(slide, 0, H_MM - 9, W_MM, 9, DARK_BLUE)
add_textbox_multi(slide, 5, H_MM - 8, W_MM - 10, 8, [
{'text': 'National Journal of Homoeopathy | October 2023 | Periodic Table Row 6 | ',
'size': 7, 'bold': False, 'color': LIGHT_BLUE, 'align': PP_ALIGN.CENTER},
{'text': 'A Case of Autism Spectrum Disorder – Dr Jaykumar Chandarana & Dr Harsh Patel',
'size': 7, 'bold': True, 'color': GOLD, 'align': PP_ALIGN.CENTER},
])
# ── Save ───────────────────────────────────────────────────────────────────
out = '/tmp/workspace/asd-poster/ASD_Case_Poster.pptx'
prs.save(out)
print(f'Saved: {out}')
cd /tmp/workspace/asd-poster && python create_poster.py 2>&1
ls -lh /tmp/workspace/asd-poster/
cd /tmp/workspace/asd-poster && python - <<'EOF' from pptx import Presentation prs = Presentation('ASD_Case_Poster.pptx') slide = prs.slides[0] print(f"Slide size: {prs.slide_width.cm:.1f} x {prs.slide_height.cm:.1f} cm") print(f"Number of shapes: {len(slide.shapes)}") texts = [] for s in slide.shapes: if s.has_text_frame: t = s.text_frame.text.strip()[:60] if t: texts.append(t) print(f"Text shapes: {len(texts)}") for t in texts[:20]: print(" ", repr(t)) EOF
ASD Case Poster
Presentation · PPTX
| Section | Content |
|---|---|
| Top Banner | Big title "FROM SILENCE TO COMMUNICATION", Author (Dr. Harsh Patel), Guide (Dr. Jaykumar Chandarana), Institution (Baroda Homoeopathic Medical College) |
| Case Snapshot | Age/Sex, Diagnosis, Duration, Main Remedy, Outcome |
| Developmental History | Birth details, milestone delay, ASD diagnosis, OT therapy |
| Key Complaints | 14 complaints with icons (no eye contact, restlessness, no speech, salivation, fear of heights, etc.) |
| Personal History | Thermal, appetite, bowels, sleep, desires, aversions, urine, dreams |
| Past History | URTI, viral fever, falls |
| Totality of Symptoms | 14 rubrics used for repertorization |
| Repertorization | Zomeo Pro result table – Lyco/Sep (15), Sulph (14), Calc/Merc (13), Baryta-carb (11) highlighted as chosen remedy |
| Symptom Analysis | Mental/emotional vs physical generals breakdown |
| Remedy Selection | Baryta carbonica justification with Clarke & Kent quotes |
| Follow-Up Table | All 5 dates (Mar–Jul 2023) with symptoms & prescription |
| Before vs After | Red/green comparison boxes |
| Discussion / Conclusion / References | Three-column footer |
Now create posterfrom this visible images
ls /tmp/workspace/asd-poster/ && python3 -c "import pptx; print('pptx ok')"
~/asd-poster/create_poster_v2.py
"""
ASD Homoeopathic Case Report Poster – v2
Closely mirrors the "From Persistent Cough to Clinical Relief" template layout.
A0-portrait (841 × 1189 mm) for maximum detail.
"""
from pptx import Presentation
from pptx.util import Pt, Cm, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx.oxml.ns import qn
from lxml import etree
import copy
# ── COLOURS (matching the reference template) ─────────────────────────────
NAVY = RGBColor(0x0D, 0x2B, 0x55)
STEEL = RGBColor(0x1A, 0x52, 0x76)
SKYBLUE = RGBColor(0xD6, 0xE8, 0xF7)
RED = RGBColor(0xB8, 0x0C, 0x0C)
GOLD = RGBColor(0xF0, 0xA5, 0x00)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
BLACK = RGBColor(0x12, 0x12, 0x12)
LGRAY = RGBColor(0xF0, 0xF4, 0xF8)
MGRAY = RGBColor(0xD8, 0xE2, 0xEC)
GREEN = RGBColor(0x0F, 0x6B, 0x3A)
GREENL = RGBColor(0xD4, 0xED, 0xDA)
REDL = RGBColor(0xF9, 0xD9, 0xD9)
TEAL = RGBColor(0x0D, 0x6E, 0x6E)
ORANGE = RGBColor(0xE8, 0x6B, 0x00)
# ── SLIDE SIZE: A0 portrait ────────────────────────────────────────────────
W = Cm(84.1)
H = Cm(118.9)
def cm(v): return Cm(v)
def pt(v): return Pt(v)
def rect(slide, x, y, w, h, fill, line=None, lw=0.5):
shp = slide.shapes.add_shape(1, cm(x), cm(y), cm(w), cm(h))
shp.fill.solid(); shp.fill.fore_color.rgb = fill
if line:
shp.line.color.rgb = line; shp.line.width = Pt(lw)
else:
shp.line.fill.background()
return shp
def tb(slide, x, y, w, h, text, size=9, bold=False,
color=BLACK, align=PP_ALIGN.LEFT, bg=None, wrap=True, italic=False):
box = slide.shapes.add_textbox(cm(x), cm(y), cm(w), cm(h))
tf = box.text_frame; tf.word_wrap = wrap
p = tf.paragraphs[0]; p.alignment = align
p.space_before = Pt(0); p.space_after = Pt(0)
run = p.add_run(); run.text = text
run.font.size = pt(size); run.font.bold = bold
run.font.color.rgb = color; run.font.italic = italic
if bg: box.fill.solid(); box.fill.fore_color.rgb = bg
else: box.fill.background()
box.line.fill.background()
return box
def tbm(slide, x, y, w, h, paras, bg=None, line=None):
"""Multi-paragraph text box."""
box = slide.shapes.add_textbox(cm(x), cm(y), cm(w), cm(h))
tf = box.text_frame; tf.word_wrap = True
if bg: box.fill.solid(); box.fill.fore_color.rgb = bg
else: box.fill.background()
if line: box.line.color.rgb = line; box.line.width = Pt(0.3)
else: box.line.fill.background()
for i, p_def in enumerate(paras):
para = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
para.alignment = p_def.get('align', PP_ALIGN.LEFT)
para.space_before = Pt(p_def.get('sb', 0))
para.space_after = Pt(p_def.get('sa', 0))
for r_def in p_def.get('runs', []):
run = para.add_run()
run.text = r_def.get('t', '')
run.font.size = pt(r_def.get('sz', 9))
run.font.bold = r_def.get('b', False)
run.font.italic = r_def.get('i', False)
run.font.color.rgb = r_def.get('c', BLACK)
return box
def sec_hdr(slide, x, y, w, h, title, bg=NAVY, fg=WHITE, sz=9):
rect(slide, x, y, w, h, bg)
tb(slide, x, y, w, h, title, size=sz, bold=True,
color=fg, align=PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════════════════
prs = Presentation()
prs.slide_width = W
prs.slide_height = H
slide = prs.slides.add_slide(prs.slide_layouts[6])
# ─────────────────────────────────────────────────────────────────────────
# BACKGROUND
# ─────────────────────────────────────────────────────────────────────────
rect(slide, 0, 0, 84.1, 118.9, RGBColor(0xEE, 0xF4, 0xFB))
# ══════════════════════════════════════════════════════════════════════════
# TOP HEADER BAND
# ══════════════════════════════════════════════════════════════════════════
rect(slide, 0, 0, 84.1, 18, NAVY)
# LEFT: BIG TITLE
tbm(slide, 1.5, 0.8, 52, 16, [
{'runs': [{'t': 'FROM', 'sz': 32, 'b': True, 'c': WHITE}]},
{'runs': [{'t': 'SILENCE TO', 'sz': 32, 'b': True, 'c': RED}]},
{'runs': [{'t': 'COMMUNICATION', 'sz': 32, 'b': True, 'c': WHITE}]},
{'runs': [{'t': 'AN EVIDENCE-BASED HOMOEOPATHIC CASE REPORT OF', 'sz': 9, 'c': SKYBLUE}]},
{'runs': [{'t': 'AUTISM SPECTRUM DISORDER (ASD)', 'sz': 9.5, 'b': True, 'c': GOLD}]},
])
# RIGHT: Author + Guide + Inst
tbm(slide, 55, 1, 28, 10, [
{'runs': [{'t': 'AUTHOR', 'sz': 7.5, 'b': True, 'c': GOLD}]},
{'runs': [{'t': 'Dr. Harsh Patel', 'sz': 11, 'b': True, 'c': WHITE}]},
{'sb': 4, 'runs': [{'t': '', 'sz': 3, 'c': WHITE}]},
{'runs': [{'t': 'GUIDED BY', 'sz': 7.5, 'b': True, 'c': GOLD}]},
{'runs': [{'t': 'Dr. Jaykumar Chandarana', 'sz': 11, 'b': True, 'c': WHITE}]},
])
tbm(slide, 55, 11.5, 28, 6.5, [
{'runs': [{'t': '🏛 PG DEPT. OF MATERIA MEDICA', 'sz': 8, 'b': True, 'c': SKYBLUE}]},
{'runs': [{'t': ' BARODA HOMOEOPATHIC MEDICAL COLLEGE & HOSPITAL', 'sz': 7.5, 'c': SKYBLUE}]},
{'runs': [{'t': ' VADODARA, GUJARAT | ESTD. 1992', 'sz': 7.5, 'b': True, 'c': GOLD}]},
])
# ══════════════════════════════════════════════════════════════════════════
# ROW 1 : CASE SNAPSHOT | DEV HISTORY | KEY COMPLAINTS
# ══════════════════════════════════════════════════════════════════════════
R1Y = 18.5
SNAP_W = 26
DEV_W = 27
KC_W = 29
# ─ CASE SNAPSHOT ──────────────────────────────────────────────────────────
rect(slide, 1, R1Y, SNAP_W, 18, LGRAY, STEEL, 0.4)
sec_hdr(slide, 1, R1Y, SNAP_W, 1.8, 'CASE SNAPSHOT', STEEL, WHITE, 9)
snap = [
('👦 AGE / SEX', '5 Years, Male'),
('🔖 DIAGNOSIS', 'Autism Spectrum Disorder (ASD)'),
('⏱ DURATION', '~3 Years (symptoms since age 2)'),
('💊 MAIN REMEDY', 'Baryta carbonica 200'),
('📈 OUTCOME', 'Significant Improvement in 4 months'),
]
for i,(lbl,val) in enumerate(snap):
yy = R1Y + 2.4 + i*3
tbm(slide, 1.3, yy, SNAP_W-0.6, 3, [
{'runs':[{'t':lbl+': ','sz':8,'b':True,'c':GOLD},
{'t':val,'sz':9,'b':False,'c':BLACK}]}
])
# ─ DEVELOPMENTAL HISTORY ──────────────────────────────────────────────────
rect(slide, 28, R1Y, DEV_W, 18, LGRAY, STEEL, 0.4)
sec_hdr(slide, 28, R1Y, DEV_W, 1.8, 'DEVELOPMENTAL HISTORY', STEEL, WHITE, 9)
dev = [
'2ⁿᵈ full-term child; LSCS birth; BW 3.9 kg',
'No complaints up to 1.5 years of age',
'No speech by age 2 yrs → Neurologist consulted',
'Diagnosed as Autism Spectrum Disorder (ASD)',
'Therapies started at Gandhinagar (COVID period)',
'Currently on Occupational Therapy',
'Sitting – 8 months | Dentition – 9 months',
'Walking – 15 months',
]
for i,t in enumerate(dev):
tb(slide, 28.3, R1Y+2.4+i*1.95, DEV_W-0.6, 2, '• '+t, size=8, color=BLACK)
# ─ KEY COMPLAINTS ─────────────────────────────────────────────────────────
rect(slide, 56, R1Y, KC_W, 18, LGRAY, STEEL, 0.4)
sec_hdr(slide, 56, R1Y, KC_W, 1.8, 'KEY COMPLAINTS', STEEL, WHITE, 9)
kc = [
('🚫','No eye-to-eye contact'),
('😬','Bites himself when angry'),
('🏃','Extreme restlessness (3+); wanders all day'),
('🤐','No meaningful speech; speaks gibberish'),
('👄','Everything puts in mouth'),
('🔄','Likes swinging to and fro'),
('🧍','Plays alone; does not mingle with children'),
('📚','Cannot write basic alphabets (ABCD)'),
('😰','Fear of heights; clings to parents'),
('💧','Excessive salivation; open mouth mostly'),
('❌','Does not follow instructions or orders'),
('🧠','Forgetfulness (full++)'),
('😴','Grinding teeth in sleep'),
('🥶','Thermal – Chilly 2+'),
]
for i,(ic,t) in enumerate(kc):
tbm(slide, 56.3, R1Y+2.2+i*1.12, KC_W-0.6, 1.2, [
{'runs':[{'t':ic+' ','sz':8,'c':STEEL},{'t':t,'sz':8,'c':BLACK}]}
])
# ══════════════════════════════════════════════════════════════════════════
# ROW 2 : PERSONAL HISTORY | PAST HISTORY
# ══════════════════════════════════════════════════════════════════════════
R2Y = R1Y + 19
rect(slide, 1, R2Y, 55, 12, LGRAY, STEEL, 0.4)
sec_hdr(slide, 1, R2Y, 55, 1.8, 'PERSONAL HISTORY', STEEL, WHITE, 9)
ph_L = [
('Thermal', 'Chilly 2+; worse cold drinks, food, cold air/water'),
('Perspiration','Normal as per season'),
('Appetite', 'Decreased; Eructation 3+'),
('Diet', 'Vegetarian'),
('Desire', 'Sweet, Maize'),
('Aversion', 'Dal, Vegetables'),
]
ph_R = [
('Thirst', 'As per season (1.5–2 L/day)'),
('Urine', 'No burning; transparent'),
('Bowels', 'Slimy, sticky; smell 1+; better in morning'),
('Habits', 'Everything puts in mouth'),
('Sleep', '8 hours; no complaints'),
('Dreams', 'Grinding of teeth'),
]
for i,(l,v) in enumerate(ph_L):
yy = R2Y+2.2+i*1.65
tbm(slide, 1.3, yy, 27, 1.8, [
{'runs':[{'t':l+': ','sz':8,'b':True,'c':STEEL},{'t':v,'sz':8,'c':BLACK}]}
])
for i,(l,v) in enumerate(ph_R):
yy = R2Y+2.2+i*1.65
tbm(slide, 29, yy, 26, 1.8, [
{'runs':[{'t':l+': ','sz':8,'b':True,'c':STEEL},{'t':v,'sz':8,'c':BLACK}]}
])
# PAST HISTORY
rect(slide, 57, R2Y, 27, 12, LGRAY, STEEL, 0.4)
sec_hdr(slide, 57, R2Y, 27, 1.8, 'PAST HISTORY', STEEL, WHITE, 9)
past = [
'Recurrent URTI – cough, cold, coryza (watery), every 10 days',
'Viral fever – 2 to 3 times',
'Recurrent falls from bed many times',
]
for i,t in enumerate(past):
tb(slide, 57.3, R2Y+2.4+i*3, 26.4, 3, '• '+t, size=8.5, color=BLACK)
# ══════════════════════════════════════════════════════════════════════════
# ROW 3 : TOTALITY | REPERTORIZATION
# ══════════════════════════════════════════════════════════════════════════
R3Y = R2Y + 13
TOT_W = 28
rect(slide, 1, R3Y, TOT_W, 26, LGRAY, STEEL, 0.4)
sec_hdr(slide, 1, R3Y, TOT_W, 1.8, 'TOTALITY OF SYMPTOMS', STEEL, WHITE, 9)
tot = [
'Autism Spectrum Disorder',
'Everything puts in mouth',
'Likes swinging – to and fro movement',
'Developmental milestones delayed',
'Fear of high places; mingling with other children',
'Sits in corners; does not mingle',
'Inattentive; not taking tasks seriously; forgetful',
'Restless; constantly moving and wandering',
'Stool – slimy, offensive, mucus, sticky',
'Thermal: Chilly',
'Tendency to catch cold easily',
'Desire: Sweet, Maize',
'Grinding teeth in sleep',
'Salivation; open mouth',
'Fear of heights',
]
for i,t in enumerate(tot):
tb(slide, 1.3, R3Y+2.2+i*1.55, TOT_W-0.6, 1.7, '• '+t, size=8, color=BLACK)
# ─ REPERTORIZATION ────────────────────────────────────────────────────────
REPERT_X = 30
REPERT_W = 54
rect(slide, REPERT_X, R3Y, REPERT_W, 26, LGRAY, STEEL, 0.4)
sec_hdr(slide, REPERT_X, R3Y, REPERT_W, 1.8,
'REPERTORIZATION (Complete Repertory – Zomeo Pro | Date: 04/09/2023 | Reg. No.: 45)',
STEEL, WHITE, 8.5)
# Rubrics
tb(slide, REPERT_X+0.3, R3Y+2.2, 25, 1.5, 'RUBRICS USED:', size=8, bold=True, color=NAVY)
rubrics = [
'[Kent] Mind – Absent-minded (see Forgetful)',
'[Kent] Mind – Restlessness, nervousness',
'[Kent] Mouth – Salivation',
'[Kent] Stomach – Desires: Sweets',
'[Kent] Teeth – Grinding',
'[Kent] Generalities – Cold: In general agg.',
]
for i,r in enumerate(rubrics):
tb(slide, REPERT_X+0.3, R3Y+3.8+i*1.55, 25, 1.6, '▸ '+r, size=7.5, color=BLACK)
# Top remedy table
TBL_X = REPERT_X + 27
TBL_W = 26
remedies = [
('Lycopodium', '15', '6'),
('Sepia', '15', '6'),
('Sulphur', '14', '6'),
('Calc. carb.', '13', '6'),
('Mercurius', '13', '6'),
('Nux vomica', '12', '6'),
('Plumbum', '12', '6'),
('Belladonna', '12', '5'),
('Baryta carb.', '11', '6'), # ← chosen
('Kali carb.', '12', '5'),
]
col_w = [14, 6, 6]
# header
rect(slide, TBL_X, R3Y+2, TBL_W, 1.8, NAVY)
cx = TBL_X
for hdr, cw in zip(['Remedy','Totality','Sx Cov.'], col_w):
tb(slide, cx, R3Y+2, cw, 1.8, hdr, size=8, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
cx += cw
for j,(rem,tot_score,sx) in enumerate(remedies):
ry = R3Y + 4 + j*2.05
is_chosen = (rem == 'Baryta carb.')
bg = GREENL if is_chosen else (LGRAY if j%2==0 else WHITE)
rect(slide, TBL_X, ry, TBL_W, 2.05, bg)
if is_chosen:
rect(slide, TBL_X, ry, TBL_W, 2.05, GREENL, GREEN, 0.8)
cx = TBL_X
for v, cw in zip([rem,tot_score,sx], col_w):
fc = GREEN if is_chosen else BLACK
tb(slide, cx, ry, cw, 2.05, v, size=8,
bold=is_chosen, color=fc, align=PP_ALIGN.CENTER)
cx += cw
# annotation
tbm(slide, TBL_X, R3Y+25.5-2.5, TBL_W+1, 2.5, [
{'runs':[{'t':'★ Baryta carb. selected on individualisation & totality',
'sz':8,'b':True,'c':ACCENT_RED if True else RED}]}
], bg=GREENL)
# ══════════════════════════════════════════════════════════════════════════
# ROW 4 : SYMPTOM ANALYSIS | REMEDY SELECTION
# ══════════════════════════════════════════════════════════════════════════
R4Y = R3Y + 27
SA_W = 40
RS_W = 43
rect(slide, 1, R4Y, SA_W, 30, LGRAY, STEEL, 0.4)
sec_hdr(slide, 1, R4Y, SA_W, 1.8, 'SYMPTOM ANALYSIS', STEEL, WHITE, 9)
# Mental / Emotional sub-heading
rect(slide, 1, R4Y+2, SA_W/2-0.5, 1.5, NAVY)
tb(slide, 1, R4Y+2, SA_W/2-0.5, 1.5, '🧠 MENTAL / EMOTIONAL', size=7.5, bold=True, color=WHITE)
mental = [
'Dull; attention deficit prominent',
'No eye-to-eye contact',
'Does not recognize people/things',
'Speaks meaningless words',
'Cannot write basic alphabets (ABCD)',
'Aversion to strangers; sits alone',
'Fear of heights; clings to parents',
'Does not follow instructions',
'Forgetfulness (full++)',
'Weakness (++) ; bites self when angry',
'Does not cry when injured',
]
for i,t in enumerate(mental):
tb(slide, 1.3, R4Y+4+i*2.3, SA_W/2-0.8, 2.3, '• '+t, size=8, color=BLACK)
# Physical Generals sub-heading
GX = 1+SA_W/2
rect(slide, GX, R4Y+2, SA_W/2-0.5, 1.5, STEEL)
tb(slide, GX, R4Y+2, SA_W/2-0.5, 1.5, '💪 PHYSICAL GENERALS', size=7.5, bold=True, color=WHITE)
phys = [
'Thermal: Chilly 2+',
'Desire: Sweet, Maize',
'Aversion: Dal, Vegetables',
'Bowels: Slimy, sticky; offensive',
'Appetite: Decreased; Eructation 3+',
'Thirst: 1.5–2 L/day (normal)',
'Sleep: 8 hours, undisturbed',
'Dreams: Grinding of teeth',
'Salivation from mouth; open mouth',
'Habits: Everything puts in mouth',
'Perspiration: Normal as per season',
]
for i,t in enumerate(phys):
tb(slide, GX+0.3, R4Y+4+i*2.3, SA_W/2-0.8, 2.3, '• '+t, size=8, color=BLACK)
# ─ REMEDY SELECTION ───────────────────────────────────────────────────────
RS_X = 42
rect(slide, RS_X, R4Y, RS_W, 30, LGRAY, STEEL, 0.4)
sec_hdr(slide, RS_X, R4Y, RS_W, 1.8, 'REMEDY SELECTION', STEEL, WHITE, 9)
# Remedy name box
rect(slide, RS_X, R4Y+2.2, RS_W, 3, GREEN)
tbm(slide, RS_X, R4Y+2.2, RS_W, 3, [
{'align': PP_ALIGN.CENTER,
'runs': [{'t': '🌿 BARYTA CARBONICA 200', 'sz': 16, 'b': True, 'c': WHITE}]},
])
tb(slide, RS_X+0.3, R4Y+6, RS_W-0.6, 1.6, 'JUSTIFICATION:', size=9, bold=True, color=NAVY)
just = [
'✓ Dwarfishness in body and mind (Kent); late in learning and developing',
'✓ Aversion to strangers; does not want to play; better alone',
'✓ Chilliness predominates; tendency to catch cold (URTI)',
'✓ Absent-minded; cannot remember; forgetful (full++)',
'✓ Salivation; open mouth; grinding teeth',
'✓ Fear of heights; holds and clings to parents',
'✓ Restlessness; constantly moving and wandering',
'✓ Developmental delay – intellect and memory affected',
'✓ Desire sweets; chilly thermal',
]
for i,t in enumerate(just):
tb(slide, RS_X+0.3, R4Y+7.8+i*2.3, RS_W-0.6, 2.3, t, size=8, color=BLACK)
# Clarke quote box
rect(slide, RS_X+0.3, R4Y+29.5-8.5, RS_W-0.6, 4, RGBColor(0xE8,0xF4,0xFB), STEEL, 0.4)
tbm(slide, RS_X+0.5, R4Y+29.5-8.3, RS_W-1, 3.8, [
{'runs':[{'t':'Dr J H Clarke: ','sz':8,'b':True,'c':RED},
{'t':'"Baryta-carb has a want of self-confidence and aversion to strangers. '
'Children cannot remember and learn. Chilliness predominates, worse in company, better alone."',
'sz':7.5,'i':True,'c':BLACK}]},
])
rect(slide, RS_X+0.3, R4Y+29.5-4, RS_W-0.6, 3.5, RGBColor(0xE8,0xF4,0xFB), STEEL, 0.4)
tbm(slide, RS_X+0.5, R4Y+29.5-3.8, RS_W-1, 3.5, [
{'runs':[{'t':'Dr JT Kent: ','sz':8,'b':True,'c':STEEL},
{'t':'"Dwarfishness in body and mind. Late in learning and developing. '
'Does not pay attention. Baryta-carb takes hold of the intellect and memory."',
'sz':7.5,'i':True,'c':BLACK}]},
])
# ══════════════════════════════════════════════════════════════════════════
# TREATMENT BANNER
# ══════════════════════════════════════════════════════════════════════════
R5Y = R4Y + 31
rect(slide, 1, R5Y, 84.1-2, 3.5, NAVY)
tbm(slide, 1, R5Y, 84.1-2, 3.5, [
{'align': PP_ALIGN.CENTER,
'runs': [{'t': 'TREATMENT: ', 'sz': 13, 'b': True, 'c': GOLD},
{'t': 'Baryta carbonica 200', 'sz': 14, 'b': True, 'c': WHITE, 'i': True},
{'t': ' | Initial Rx: 3 doses daily × 3 days + SL 30 TDS × 1 week',
'sz': 11, 'b': False, 'c': SKYBLUE}]}
])
# ══════════════════════════════════════════════════════════════════════════
# FOLLOW-UP TABLE
# ══════════════════════════════════════════════════════════════════════════
R6Y = R5Y + 4
rect(slide, 1, R6Y, 82.1, 2, STEEL)
tb(slide, 1, R6Y, 82.1, 2, 'FOLLOW-UP', size=10, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
C1W, C2W, C3W = 12, 45, 25.1
# column headers
rect(slide, 1, R6Y+2.2, 82.1, 2, NAVY)
cx = 1
for hdr, cw in zip(['DATE','SYMPTOMS / PROGRESS','PRESCRIPTION'],[C1W,C2W,C3W]):
tb(slide, cx, R6Y+2.2, cw, 2, hdr, size=8.5, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
cx += cw
followup = [
('11/03/2023',
'AS CASE DISCUSSED (all presenting symptoms as above)',
'Baryta-carb 200, 3 doses daily × 3 days.\nSL 30 TDS × 1 week'),
('18/03/23',
'Sleeps well; now hears others; decrease in restlessness.',
'Baryta-carb 200, 4 doses.\n1 dose every Sunday morning.\nSL 30 TDS × 1 month'),
('19/04/23',
'Follows parents & therapists instructions.\nSees when spoken to.\nHyperactivity decreased.',
'Baryta-carb 200, 4 doses.\n1 dose every Sunday morning.\nSL 30 TDS × 1 month'),
('17/05/23',
'Comes when asked; tries to speak while looking at book;\nwears right shoes; follows instructions.',
'Baryta-carb 200, 4 doses.\n1 dose every Sunday morning.\nSL 30 TDS × 1 month'),
('12/07/23',
'Eye contact developed; says "Bye"; memory improved;\nfollows commands; sits focused; restlessness lesser.',
'SL 30 TDS × 1 month.\nBaryta-carb STOPPED — continuous improvement.'),
]
ROW_H = 5.5
for j,(dt,sx,rx) in enumerate(followup):
ry = R6Y + 4.5 + j*ROW_H
bg = LGRAY if j%2==0 else WHITE
rect(slide, 1, ry, 82.1, ROW_H, bg, MGRAY, 0.3)
tb(slide, 1.2, ry+0.3, C1W-0.4, ROW_H-0.6, dt, size=8, bold=True, color=NAVY)
tb(slide, 1+C1W+0.2, ry+0.3, C2W-0.4, ROW_H-0.6, sx, size=8.5, color=BLACK)
tb(slide, 1+C1W+C2W+0.2, ry+0.3, C3W-0.4, ROW_H-0.6, rx, size=8.5, italic=True, color=GREEN)
# ══════════════════════════════════════════════════════════════════════════
# BEFORE vs AFTER
# ══════════════════════════════════════════════════════════════════════════
R7Y = R6Y + 5 + len(followup)*ROW_H + 0.5
HALF = 38
rect(slide, 1, R7Y, HALF, 2, RED)
tb(slide, 1, R7Y, HALF, 2, 'BEFORE TREATMENT', size=9.5, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
before = [
'No eye contact',
'No speech / meaningless words',
'Extreme restlessness (3+)',
'No response to instructions',
'Cannot write alphabets',
'Excessive salivation; open mouth',
'Bites himself when angry',
'Does not mingle with children',
]
rect(slide, 1, R7Y+2.2, HALF, len(before)*2.6+0.5, REDL)
for i,t in enumerate(before):
tb(slide, 1.3, R7Y+2.5+i*2.6, HALF-0.6, 2.6,
'✘ '+t, size=8.5, color=RGBColor(0x99,0x00,0x00))
# Arrow
tb(slide, HALF+1.2, R7Y+6, 3, 6, '→', size=28, bold=True,
color=GOLD, align=PP_ALIGN.CENTER)
rect(slide, HALF+5, R7Y, HALF, 2, GREEN)
tb(slide, HALF+5, R7Y, HALF, 2, 'AFTER TREATMENT', size=9.5, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
after = [
'Proper eye contact developed',
'Tries to speak; looks at book while speaking',
'Restlessness significantly reduced',
'Follows instructions and commands',
'Wears right shoes independently',
'Memory improved; says "Bye"',
'Sits in one place; better focused',
'Interacts more with family',
]
rect(slide, HALF+5, R7Y+2.2, HALF, len(after)*2.6+0.5, GREENL)
for i,t in enumerate(after):
tb(slide, HALF+5.3, R7Y+2.5+i*2.6, HALF-0.6, 2.6,
'✔ '+t, size=8.5, color=GREEN)
# ══════════════════════════════════════════════════════════════════════════
# DISCUSSION | CONCLUSION | REFERENCES
# ══════════════════════════════════════════════════════════════════════════
R8Y = R7Y + len(before)*2.6 + 4
COL_W3 = 26.7
cols = [
('DISCUSSION', NAVY, [
'• Individualised homoeopathic management based on totality of symptoms.',
'• Baryta carbonica selected due to its prominent characteristics: dullness, '
'forgetfulness, developmental delay, aversion to strangers, chilliness.',
'• Serial follow-up showed sustained and progressive improvement across all parameters.',
'• Occupational therapy continued as adjunct throughout.',
'• Case demonstrates the efficacy of classical homoeopathy in neurodevelopmental disorders.',
]),
('CONCLUSION', STEEL, [
'• Individualised homoeopathic management resulted in marked clinical improvement.',
'• Sustained improvement in core ASD symptoms over 4 months of treatment.',
'• Baryta carbonica addressed the constitutional and specific symptoms comprehensively.',
'• MEG-CSI-equivalent improvement noted across all follow-up visits.',
'• Adds evidence to homoeopathic treatment in paediatric neurodevelopmental conditions.',
]),
('REFERENCES', TEAL, [
'1. Clarke J H. A Dictionary of Practical Materia Medica.',
'2. Kent J T. Repertory of the Homoeopathic Materia Medica.',
'3. Boericke W. Pocket Manual of Homoeopathic Materia Medica.',
'4. National Journal of Homoeopathy, Oct 2023, Periodic Table Row 6.',
'5. Case: Dr Jaykumar Chandarana & Dr Harsh Patel, Baroda Homoeopathic '
'Medical College & Hospital, Vadodara.',
]),
]
REM_H = 118.9 - R8Y - 3.5
for ci, (title, hbg, items) in enumerate(cols):
cx2 = 1 + ci*(COL_W3+0.5)
rect(slide, cx2, R8Y, COL_W3, REM_H, LGRAY, STEEL, 0.4)
sec_hdr(slide, cx2, R8Y, COL_W3, 1.8, title, hbg, WHITE, 9)
for i,item in enumerate(items):
tb(slide, cx2+0.3, R8Y+2.4+i*3.2, COL_W3-0.6, 3.2, item, size=7.5, color=BLACK)
# ══════════════════════════════════════════════════════════════════════════
# FOOTER
# ══════════════════════════════════════════════════════════════════════════
rect(slide, 0, 118.9-2.8, 84.1, 2.8, NAVY)
tbm(slide, 1, 118.9-2.5, 82, 2.5, [
{'align': PP_ALIGN.CENTER, 'runs': [
{'t': 'National Journal of Homoeopathy | October 2023 | Periodic Table Row 6 | ',
'sz': 8, 'c': SKYBLUE},
{'t': 'A Case of Autism Spectrum Disorder – Dr Jaykumar Chandarana & Dr Harsh Patel',
'sz': 8, 'b': True, 'c': GOLD},
]},
])
# ══════════════════════════════════════════════════════════════════════════
# SAVE
# ══════════════════════════════════════════════════════════════════════════
# Fix the ACCENT_RED reference used above
ACCENT_RED = RGBColor(0xB8, 0x0C, 0x0C)
out = '/tmp/workspace/asd-poster/ASD_Case_Poster_v2.pptx'
prs.save(out)
print('Saved:', out)
cd /tmp/workspace/asd-poster && python create_poster_v2.py 2>&1
~/asd-poster/create_poster_v2.py
Error: String not found in file: ' {'t':'★ Baryta carb. selected on individualisation & totality',
'sz':8,'b':True,'c':ACCENT_RED if True else RED}]}
], bg=GREENL)'grep -n "ACCENT_RED" /tmp/workspace/asd-poster/create_poster_v2.py
sed -i "s/'c':ACCENT_RED if True else RED/'c':RED/" /tmp/workspace/asd-poster/create_poster_v2.py && python /tmp/workspace/asd-poster/create_poster_v2.py 2>&1
python3 - <<'EOF' from pptx import Presentation prs = Presentation('/tmp/workspace/asd-poster/ASD_Case_Poster_v2.pptx') slide = prs.slides[0] print(f"Size: {prs.slide_width.cm:.1f} x {prs.slide_height.cm:.1f} cm") print(f"Shapes: {len(slide.shapes)}") texts = [s.text_frame.text.strip()[:70] for s in slide.shapes if s.has_text_frame and s.text_frame.text.strip()] print(f"Text shapes: {len(texts)}") for t in texts[:25]: print(' ', repr(t)) import os; print(f"\nFile size: {os.path.getsize('/tmp/workspace/asd-poster/ASD_Case_Poster_v2.pptx')/1024:.0f} KB") EOF
ASD Case Poster v2
Presentation · PPTX
| Section | Content |
|---|---|
| Header Banner | "FROM SILENCE TO COMMUNICATION" title in navy/red/white, Author (Dr. Harsh Patel), Guide (Dr. Jaykumar Chandarana), Baroda Homoeopathic College |
| Case Snapshot | Age/Sex, Diagnosis, Duration, Main Remedy, Outcome |
| Developmental History | Birth details, milestones, ASD diagnosis, OT therapy timeline |
| Key Complaints | 14 symptoms with icons |
| Personal History | All 12 parameters (thermal, appetite, bowels, sleep, dreams, etc.) |
| Past History | URTI, viral fever, falls from bed |
| Totality of Symptoms | 15 rubrics listed |
| Repertorization Table | 10 remedies with totality scores - Baryta carb highlighted in green |
| Symptom Analysis | Mental/Emotional vs Physical Generals side-by-side |
| Remedy Selection | Baryta carb 200 with full justification + Clarke & Kent quotes |
| Treatment Banner | Baryta carb 200 prescription highlighted |
| Follow-Up Table | All 5 follow-up dates (Mar–Jul 2023) with progress & prescriptions |
| Before vs After | Red/green comparison columns with arrows |
| Discussion / Conclusion / References | 3-column footer |
| Footer bar | Journal, date, authors |