in detail about cap splints
cap splint dental oral surgery types uses fabrication
https://pmc.ncbi.nlm.nih.gov/articles/PMC9897721
cap splint oral maxillofacial surgery definition types indications Gunning splint
https://pmc.ncbi.nlm.nih.gov/articles/PMC4257934
"cap splint" mandibular fracture management
PMID: 40515765
cap splint fabrication steps materials acrylic cast metal open closed type advantages disadvantages
https://pmc.ncbi.nlm.nih.gov/articles/PMC9897721
| Type | Location | Use |
|---|---|---|
| Mandibular cap splint | Lower arch | Most common - for mandibular fractures |
| Maxillary cap splint | Upper arch | For maxillary/mid-face fractures, palatal fractures |
| Combined (both arches) | Upper + lower | Used together for IMF in bilateral fractures |
| Sectional cap splint | Lower jaw in two halves | For displaced fractures requiring reduction in parts |
| Method | Details |
|---|---|
| Circummandibular wiring | Wire passed around the mandible and through holes in the splint; gold standard for retention in children |
| Luting cement alone | Zinc phosphate or GIC; used as alternative to wiring, especially in cooperative patients |
| Circumzygomatic wiring | For maxillary splint retention in midface fractures |
| Intermaxillary fixation (IMF) | Wires or elastics between upper and lower splints |
| Interdental wiring | Wires placed between individual teeth through holes in splint |
| Feature | Cap Splint | Gunning Splint |
|---|---|---|
| Dentition | Dentate patients | Edentulous patients |
| Retention | Cemented onto teeth | Retained by circumferential wiring/denture adhesive |
| Material | Acrylic or metal | Vulcanite rubber or acrylic |
| Design | Covers tooth crowns | Covers the edentulous ridge |
| IMF | Via eyelets on splint | Via eyelets on splint |
does cap splints used in dentoalveolar fractures of pediatric patients
"dentoalveolar fracture" pediatric splint management
cap splint dentoalveolar fractures pediatric children alveolar process treatment
PMID: 32454961
alveolar fracture children splinting acrylic cap circummandibular wiring
https://pmc.ncbi.nlm.nih.gov/articles/PMC7235701
cap splint acrylic alveolar fracture children circummandibular wiring technique stabilization
"The two most commonly used modalities for stabilization of displaced dentoalveolar fractures are: the application of arch bars fixed with inter-dental wiring AND the use of metal (cap) splint/acrylic plates fixed using circummandibular wiring."
| Problem with Arch Bars in Children | Solution with Cap Splints |
|---|---|
| Height of contour of deciduous teeth is below the gingival level | Cap covers the entire crown - no height-of-contour dependency |
| Root resorption of deciduous teeth makes arch bars unstable | Cap distributes force over the whole dental arch |
| Incomplete root formation of erupting permanent teeth | Cap does not depend on root length for retention |
| Arch bar bending to fit small deciduous teeth is technically demanding | Cap is laboratory-fabricated to exact fit |
| Method | When Used |
|---|---|
| Circummandibular wiring | Gold standard for mandibular cap splint retention in active fractures |
| Glass ionomer cement (GIC) luting | Alternative to wiring; suitable for minimally displaced/cooperative patients; avoids GA |
| Circumzygomatic wiring | For maxillary cap splint retention |
| Cross elastics | For guiding occlusion in modified splints with buccal arch bar hooks |
| Interdental wiring through splint holes | Adjunct retention |
| Age Group | Recommended Duration | Rationale |
|---|---|---|
| Pediatric (2-12 years) | 2-3 weeks | Rapid bone healing, avoid TMJ ankylosis, prevent growth restriction |
| Adult (>12 years) | 3-4 weeks | Slower bone metabolism |
| IADT Recommendation | 4 weeks (all ages) | Conservative guideline recommendation |
can we use cap splints for luxated primary dentition with refernces
luxated primary teeth splinting management
cap splint luxated primary dentition treatment splinting indicated contraindicated guidelines IADT
PMID: 36930443
PMID: 37433924
https://pmc.ncbi.nlm.nih.gov/articles/PMC12094451
PMID: 36968882
PMID: 34562981
IADT 2020 guidelines primary dentition luxation splinting lateral extrusion intrusion flexible rigid splint
| Feature | Rigid Splint (e.g., Cap Splint) | Flexible Splint (e.g., Composite-wire, TTS) |
|---|---|---|
| Tooth mobility allowed | None | Yes - physiological movement preserved |
| Risk of ankylosis | Higher | Lower |
| Risk of pulp necrosis | Higher | Lower |
| Risk of external root resorption | Higher | Lower |
| Use in primary dentition | Restricted (alveolar fractures mainly) | Preferred for luxation injuries |
| Duration in primary dentition | 4 weeks | 2-4 weeks depending on injury |
"The IADT guidelines recommend using a flexible splint. A flexible splint (e.g., titanium trauma splint, composite and wire splint) allows functional movement in contrast to a rigid splint (e.g., composite splints) where the injured teeth are immobilized."
| Injury Type | Splinting Indicated? | Type | Duration |
|---|---|---|---|
| Concussion | No - observation only | - | - |
| Subluxation | No - observation only | - | - |
| Extrusive luxation (<3mm) | Sometimes | Flexible | 2-3 weeks |
| Lateral luxation (severe, with occlusal interference, repositioned) | Yes - if repositioned and unstable | Flexible | 4 weeks |
| Intrusive luxation | No - observation/extraction | - | - |
| Root fracture | Occasionally | Flexible | 4 weeks |
| Alveolar fracture | Yes | Flexible | 4 weeks |
| Avulsion | No - do NOT reimplant primary teeth | - | - |
"Individualized employment of the splinting option may be considered in other specific clinical conditions without jeopardizing the dentoalveolar health."
| Splint Type | Description | Advantage in Primary Dentition |
|---|---|---|
| Composite resin + wire (acid-etch) | Wire bonded with composite resin to adjacent teeth | Flexible, semi-rigid, easy, common |
| Titanium Trauma Splint (TTS) | Thin titanium mesh bonded with composite | Flexible, biocompatible, allows physiological movement |
| Orthodontic flexible wire splint | Stainless steel/NiTi wire bonded across adjacent teeth | Most flexible option |
| Vacuum-formed thermoplastic splint | Thermoplastic sheet adapted to teeth, bonded with GIC | Minimally invasive, outpatient, excellent anatomical fit |
| Luxation Type | Splinting in Primary Teeth | Cap Splint Appropriate? | Recommended Splint |
|---|---|---|---|
| Concussion | Not indicated | No | - |
| Subluxation | Not indicated | No | - |
| Extrusive luxation (<3mm) | Rarely; if unstable after repositioning | No | Flexible (composite-wire) |
| Extrusive luxation (>3mm) | Extract | No | - |
| Lateral luxation (mild) | Not needed | No | - |
| Lateral luxation (severe, repositioned) | Yes - 4 weeks | No (use flexible) | Flexible (composite-wire, TTS) |
| Intrusive luxation | Not indicated | No | - |
| Root fracture | Occasionally - 4 weeks | Rigid only if necessary | Flexible preferred |
| Alveolar fracture with luxation | Yes - 4 weeks | Yes - acceptable here | Flexible/cap splint |
Create a clinical decision flowchart for splinting primary dentition trauma
mkdir -p /home/daytona/workspace/cap-splint-flowchart && ls /home/daytona/worksp…
~/cap-splint-flowchart/flowchart.py
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.patches import FancyBboxPatch, FancyArrowPatch
fig, ax = plt.subplots(figsize=(22, 34))
ax.set_xlim(0, 22)
ax.set_ylim(0, 34)
ax.axis('off')
# ─── Color Palette ───────────────────────────────────────────────────────────
C_BG = "#0D1B2A" # deep navy – canvas
C_TITLE = "#1A2F4A" # dark navy – title banner
C_START = "#1B6CA8" # vivid blue – start/entry
C_DIAMOND = "#D4870A" # amber – decision
C_ACTION = "#1A7A4A" # forest green – action/treatment
C_EXTRACT = "#B03030" # crimson – extract
C_OBSERVE = "#2E7D96" # teal – observe
C_SPLINT = "#5B3A8C" # purple – splint indicated
C_FOOTER = "#0D1B2A" # same as bg
C_WHITE = "#FFFFFF"
C_LTGRAY = "#E8EDF2"
C_AMBER = "#FFB830"
C_GOLD = "#F0C040"
fig.patch.set_facecolor(C_BG)
ax.set_facecolor(C_BG)
# ─── Helper functions ─────────────────────────────────────────────────────────
def box(ax, x, y, w, h, text, facecolor, textcolor=C_WHITE, fontsize=9.5,
bold=False, radius=0.35, style="round,pad=0.05", wrap=True, zorder=3,
linewidth=0, edgecolor="none", alpha=1.0):
rect = FancyBboxPatch((x - w/2, y - h/2), w, h,
boxstyle=f"round,pad=0.08",
facecolor=facecolor, edgecolor=edgecolor,
linewidth=linewidth, zorder=zorder, alpha=alpha)
ax.add_patch(rect)
weight = 'bold' if bold else 'normal'
ax.text(x, y, text, ha='center', va='center', fontsize=fontsize,
color=textcolor, fontweight=weight, wrap=True,
multialignment='center', zorder=zorder+1,
linespacing=1.35)
def diamond(ax, x, y, w, h, text, facecolor=C_DIAMOND, textcolor=C_WHITE, fontsize=9):
xs = [x, x + w/2, x, x - w/2, x]
ys = [y + h/2, y, y - h/2, y, y + h/2]
ax.fill(xs, ys, color=facecolor, zorder=3)
ax.plot(xs, ys, color="#FFC95A", linewidth=1.2, zorder=4)
ax.text(x, y, text, ha='center', va='center', fontsize=fontsize,
color=textcolor, fontweight='bold', multialignment='center',
zorder=5, linespacing=1.3)
def arrow(ax, x1, y1, x2, y2, color="#90AFCC", lw=1.8, label="", label_side="right"):
ax.annotate("", xy=(x2, y2), xytext=(x1, y1),
arrowprops=dict(arrowstyle="-|>", color=color,
lw=lw, mutation_scale=14),
zorder=2)
if label:
mx = (x1+x2)/2
my = (y1+y2)/2
offset = 0.22 if label_side == "right" else -0.22
ax.text(mx + offset, my, label, ha='center', va='center',
fontsize=8, color=C_GOLD, fontweight='bold', zorder=6)
def line(ax, x1, y1, x2, y2, color="#90AFCC", lw=1.8):
ax.plot([x1, x2], [y1, y2], color=color, lw=lw, zorder=2)
# ─── TITLE BANNER ─────────────────────────────────────────────────────────────
title_bg = FancyBboxPatch((0.2, 32.3), 21.6, 1.5,
boxstyle="round,pad=0.1",
facecolor=C_TITLE, edgecolor=C_AMBER, linewidth=2, zorder=3)
ax.add_patch(title_bg)
ax.text(11, 33.15, "Clinical Decision Flowchart: Splinting in Primary Dentition Trauma",
ha='center', va='center', fontsize=15, color=C_WHITE, fontweight='bold', zorder=4)
ax.text(11, 32.6, "Based on IADT 2020 Guidelines | Dental Traumatology 2020;36(4):343–359",
ha='center', va='center', fontsize=8.5, color=C_GOLD, zorder=4)
# ─── ENTRY ────────────────────────────────────────────────────────────────────
box(ax, 11, 31.5, 7.5, 0.7,
"PRIMARY TOOTH TRAUMA PRESENTED",
C_START, bold=True, fontsize=11, edgecolor=C_AMBER, linewidth=1.5)
arrow(ax, 11, 31.15, 11, 30.55)
# ─── Step 1: Assess type ──────────────────────────────────────────────────────
box(ax, 11, 30.2, 8, 0.65,
"Clinical + Radiographic Assessment\n(Type of Traumatic Dental Injury)",
"#1A3A5C", fontsize=9.5, bold=False, edgecolor="#3A7ABF", linewidth=1)
arrow(ax, 11, 29.87, 11, 29.25)
diamond(ax, 11, 28.7, 9, 1.05,
"What type of injury?", C_DIAMOND, fontsize=10)
# ─── Six branches from diamond ────────────────────────────────────────────────
# Positions (x) for six injury columns
cols = {
"concussion": 2.0,
"sublux": 4.8,
"extrusion": 7.6,
"lateral": 11.0,
"intrusion": 14.4,
"root_fx": 17.2,
"alv_fx": 20.2,
}
y_label = 27.65
y_injbox = 26.95
y_q1 = 26.00
y_action1 = 25.05
y_splint = 24.15
y_type = 23.25
y_dur = 22.35
branch_color = "#90AFCC"
label_color = "#FFFFFF"
# ── draw horizontal distribution line ──
line(ax, 2.0, 28.18, 20.2, 28.18, color="#90AFCC")
for cx in cols.values():
line(ax, cx, 28.18, cx, 27.95, color="#90AFCC")
ax.annotate("", xy=(cx, 27.95), xytext=(cx, 28.18),
arrowprops=dict(arrowstyle="-|>", color="#90AFCC", lw=1.5, mutation_scale=12), zorder=2)
# ─── CONCUSSION ──────────────────────────────────────────────────────────────
cx = cols["concussion"]
box(ax, cx, 27.5, 3.4, 0.65, "CONCUSSION", "#1A5276", bold=True, fontsize=9, edgecolor="#3A7ABF", linewidth=1)
arrow(ax, cx, 27.18, cx, 26.6)
box(ax, cx, 26.3, 3.4, 0.55, "Normal mobility\nNo displacement", "#1A3A5C", fontsize=8)
arrow(ax, cx, 26.02, cx, 25.42)
box(ax, cx, 25.15, 3.4, 0.52, "Observation only\nNo splinting", C_OBSERVE, fontsize=8.5, bold=True, edgecolor="#5BC0D0", linewidth=1)
arrow(ax, cx, 24.89, cx, 24.29)
box(ax, cx, 24.0, 3.4, 0.52, "F/U: 1 wk, 6-8 wks", "#1A3A5C", fontsize=8)
# ─── SUBLUXATION ─────────────────────────────────────────────────────────────
cx = cols["sublux"]
box(ax, cx, 27.5, 3.4, 0.65, "SUBLUXATION", "#1A5276", bold=True, fontsize=9, edgecolor="#3A7ABF", linewidth=1)
arrow(ax, cx, 27.18, cx, 26.6)
box(ax, cx, 26.3, 3.4, 0.55, "Increased mobility\nNo displacement", "#1A3A5C", fontsize=8)
arrow(ax, cx, 26.02, cx, 25.42)
box(ax, cx, 25.15, 3.4, 0.52, "Observation only\nNo splinting", C_OBSERVE, fontsize=8.5, bold=True, edgecolor="#5BC0D0", linewidth=1)
arrow(ax, cx, 24.89, cx, 24.29)
box(ax, cx, 24.0, 3.4, 0.52, "F/U: 1 wk, 6-8 wks", "#1A3A5C", fontsize=8)
# ─── EXTRUSIVE LUXATION ──────────────────────────────────────────────────────
cx = cols["extrusion"]
box(ax, cx, 27.5, 3.4, 0.65, "EXTRUSIVE\nLUXATION", "#1A5276", bold=True, fontsize=9, edgecolor="#3A7ABF", linewidth=1)
arrow(ax, cx, 27.17, cx, 26.6)
diamond(ax, cx, 26.1, 3.4, 0.85, "Displacement\n> 3 mm?", C_DIAMOND, fontsize=8)
# YES → extract
arrow(ax, cx + 1.7, 26.1, cx + 2.4, 26.1, color="#FF6B6B")
ax.text(cx + 2.0, 26.22, "YES", ha='center', va='bottom', fontsize=7.5, color="#FF6B6B", fontweight='bold')
box(ax, cx + 3.05, 26.1, 1.55, 0.52, "EXTRACT", C_EXTRACT, fontsize=8.5, bold=True)
# NO → observe/spontaneous
arrow(ax, cx, 25.67, cx, 25.12)
ax.text(cx + 0.18, 25.42, "NO", ha='left', va='center', fontsize=7.5, color=C_GOLD, fontweight='bold')
box(ax, cx, 24.85, 3.4, 0.52, "Allow spontaneous\nre-eruption", C_OBSERVE, fontsize=8, bold=True, edgecolor="#5BC0D0", linewidth=1)
arrow(ax, cx, 24.59, cx, 24.04)
diamond(ax, cx, 23.65, 3.4, 0.72, "Unstable after\nrepositioning?", C_DIAMOND, fontsize=7.5)
# YES splint
arrow(ax, cx, 23.29, cx, 22.74)
ax.text(cx + 0.18, 23.05, "YES", ha='left', va='center', fontsize=7.5, color=C_GOLD, fontweight='bold')
box(ax, cx, 22.45, 3.4, 0.55, "Flexible splint\n2-3 weeks", C_SPLINT, fontsize=8.5, bold=True, edgecolor="#A080D0", linewidth=1)
# NO
arrow(ax, cx - 1.7, 23.65, cx - 2.45, 23.65, color="#FF6B6B")
ax.text(cx - 2.05, 23.78, "NO", ha='center', va='bottom', fontsize=7.5, color="#FF6B6B", fontweight='bold')
box(ax, cx - 2.9, 23.65, 1.4, 0.52, "Observe", C_OBSERVE, fontsize=8)
# ─── LATERAL LUXATION ────────────────────────────────────────────────────────
cx = cols["lateral"]
box(ax, cx, 27.5, 3.4, 0.65, "LATERAL\nLUXATION", "#1A5276", bold=True, fontsize=9, edgecolor="#3A7ABF", linewidth=1)
arrow(ax, cx, 27.17, cx, 26.6)
diamond(ax, cx, 26.1, 3.4, 0.85, "Occlusal\ninterference?", C_DIAMOND, fontsize=8)
# NO → spontaneous
arrow(ax, cx - 1.7, 26.1, cx - 2.45, 26.1, color="#FF6B6B")
ax.text(cx - 2.05, 26.22, "NO", ha='center', va='bottom', fontsize=7.5, color="#FF6B6B", fontweight='bold')
box(ax, cx - 3.05, 26.1, 1.55, 0.55, "Spontaneous\nReposition", C_OBSERVE, fontsize=7.5)
# YES → reposition
arrow(ax, cx, 25.67, cx, 25.12)
ax.text(cx + 0.18, 25.42, "YES", ha='left', va='center', fontsize=7.5, color=C_GOLD, fontweight='bold')
box(ax, cx, 24.85, 3.4, 0.52, "Reposition gently\nunder LA", C_ACTION, fontsize=8.5, bold=True, edgecolor="#40BF7A", linewidth=1)
arrow(ax, cx, 24.59, cx, 24.04)
diamond(ax, cx, 23.65, 3.4, 0.72, "Still unstable?", C_DIAMOND, fontsize=8)
# YES splint
arrow(ax, cx, 23.29, cx, 22.74)
ax.text(cx + 0.18, 23.05, "YES", ha='left', va='center', fontsize=7.5, color=C_GOLD, fontweight='bold')
box(ax, cx, 22.45, 3.4, 0.55,
"FLEXIBLE SPLINT\n4 weeks (IADT 2020)", C_SPLINT, fontsize=8.5, bold=True, edgecolor="#A080D0", linewidth=1.5)
# NO
arrow(ax, cx + 1.7, 23.65, cx + 2.5, 23.65, color="#FF6B6B")
ax.text(cx + 2.05, 23.78, "NO", ha='center', va='bottom', fontsize=7.5, color="#FF6B6B", fontweight='bold')
box(ax, cx + 3.05, 23.65, 1.5, 0.52, "Observe", C_OBSERVE, fontsize=8)
# ─── INTRUSION ────────────────────────────────────────────────────────────────
cx = cols["intrusion"]
box(ax, cx, 27.5, 3.4, 0.65, "INTRUSIVE\nLUXATION", "#1A5276", bold=True, fontsize=9, edgecolor="#3A7ABF", linewidth=1)
arrow(ax, cx, 27.17, cx, 26.6)
diamond(ax, cx, 26.1, 3.4, 0.85, "Apex toward\ntooth bud?", C_DIAMOND, fontsize=8)
# YES → extract
arrow(ax, cx, 25.67, cx, 25.12)
ax.text(cx + 0.18, 25.42, "YES", ha='left', va='center', fontsize=7.5, color=C_GOLD, fontweight='bold')
box(ax, cx, 24.85, 3.4, 0.52, "EXTRACT\n(protect tooth germ)", C_EXTRACT, fontsize=8, bold=True)
# NO → observe
arrow(ax, cx + 1.7, 26.1, cx + 2.45, 26.1, color="#90AFCC")
ax.text(cx + 2.05, 26.22, "NO", ha='center', va='bottom', fontsize=7.5, color=C_GOLD, fontweight='bold')
box(ax, cx + 2.95, 26.1, 1.55, 0.55, "Observe\nspontaneous\nre-eruption", C_OBSERVE, fontsize=7.5)
arrow(ax, cx, 24.59, cx, 24.02)
box(ax, cx, 23.72, 3.4, 0.55, "NO splinting\nMonitor 1-6 months", C_OBSERVE, fontsize=8.5, bold=True, edgecolor="#5BC0D0", linewidth=1)
# ─── ROOT FRACTURE ────────────────────────────────────────────────────────────
cx = cols["root_fx"]
box(ax, cx, 27.5, 3.4, 0.65, "ROOT\nFRACTURE", "#1A5276", bold=True, fontsize=9, edgecolor="#3A7ABF", linewidth=1)
arrow(ax, cx, 27.17, cx, 26.6)
diamond(ax, cx, 26.1, 3.4, 0.85, "Coronal fragment\nmobile / displaced?", C_DIAMOND, fontsize=7.8)
# YES
arrow(ax, cx, 25.67, cx, 25.12)
ax.text(cx + 0.18, 25.42, "YES", ha='left', va='center', fontsize=7.5, color=C_GOLD, fontweight='bold')
diamond(ax, cx, 24.75, 3.4, 0.72, "Apical fragment\nstable?", C_DIAMOND, fontsize=7.8)
arrow(ax, cx - 1.7, 24.75, cx - 2.45, 24.75)
ax.text(cx - 2.05, 24.87, "NO", ha='center', va='bottom', fontsize=7.5, color="#FF6B6B", fontweight='bold')
box(ax, cx - 2.95, 24.75, 1.55, 0.52, "Extract\ncoronal Fx", C_EXTRACT, fontsize=7.5, bold=True)
arrow(ax, cx, 24.39, cx, 23.84)
ax.text(cx + 0.18, 24.15, "YES", ha='left', va='center', fontsize=7.5, color=C_GOLD, fontweight='bold')
box(ax, cx, 23.55, 3.4, 0.55, "Flexible splint\n4 weeks\n(high success rate)", C_SPLINT, fontsize=8, bold=True, edgecolor="#A080D0", linewidth=1)
# NO
arrow(ax, cx + 1.7, 26.1, cx + 2.45, 26.1)
ax.text(cx + 2.05, 26.22, "NO", ha='center', va='bottom', fontsize=7.5, color=C_GOLD, fontweight='bold')
box(ax, cx + 2.95, 26.1, 1.55, 0.55, "Observe\nno splint\nneeded", C_OBSERVE, fontsize=7.5)
# ─── ALVEOLAR FRACTURE ────────────────────────────────────────────────────────
cx = cols["alv_fx"]
box(ax, cx, 27.5, 3.4, 0.65, "ALVEOLAR\nFRACTURE", "#1A5276", bold=True, fontsize=9, edgecolor="#3A7ABF", linewidth=1)
arrow(ax, cx, 27.17, cx, 26.6)
box(ax, cx, 26.3, 3.4, 0.55, "Displaced segment?\nOcclusal interference?", "#1A3A5C", fontsize=8)
arrow(ax, cx, 26.02, cx, 25.45)
box(ax, cx, 25.15, 3.4, 0.55, "Reposition segment\nunder LA", C_ACTION, fontsize=8.5, bold=True, edgecolor="#40BF7A", linewidth=1)
arrow(ax, cx, 24.87, cx, 24.29)
box(ax, cx, 24.0, 3.4, 0.7,
"SPLINT to adjacent\nuninjured teeth\n4 weeks (IADT 2020)",
C_SPLINT, fontsize=8.5, bold=True, edgecolor="#A080D0", linewidth=1.5)
arrow(ax, cx, 23.65, cx, 23.1)
diamond(ax, cx, 22.75, 3.4, 0.72, "Cap Splint\navailable?", C_DIAMOND, fontsize=8)
arrow(ax, cx, 22.39, cx, 21.84)
ax.text(cx + 0.18, 22.15, "YES", ha='left', va='center', fontsize=7.5, color=C_GOLD, fontweight='bold')
box(ax, cx, 21.55, 3.4, 0.55, "Cap Splint + CMW\n(Rigid - acceptable\nfor alveolar Fx)", "#6A3A9C", fontsize=8, bold=True, edgecolor="#C080FF", linewidth=1.5)
arrow(ax, cx - 1.7, 22.75, cx - 2.45, 22.75)
ax.text(cx - 2.05, 22.87, "NO", ha='center', va='bottom', fontsize=7.5, color="#FF6B6B", fontweight='bold')
box(ax, cx - 2.95, 22.75, 1.55, 0.55, "Composite\nwire splint\n(flexible)", C_SPLINT, fontsize=7.5)
# ─── BOTTOM COMMON CONVERGENCE: SPLINT TYPE GUIDANCE ─────────────────────────
y_guide = 20.2
guide_bg = FancyBboxPatch((0.5, 19.1), 21, 1.7,
boxstyle="round,pad=0.1",
facecolor="#0F2A45", edgecolor=C_AMBER, linewidth=1.5, zorder=3)
ax.add_patch(guide_bg)
ax.text(11, 20.65, "SPLINT SELECTION GUIDE FOR PRIMARY DENTITION",
ha='center', va='center', fontsize=10, color=C_AMBER, fontweight='bold', zorder=4)
splint_data = [
("FLEXIBLE SPLINTS\n(IADT Recommended)", "Composite-wire\nTitanium Trauma Splint\nOrthodontic wire + resin",
"Lateral luxation\nRoot fracture\nExtrusion (if needed)", "#5B3A8C"),
("RIGID SPLINTS\n(Limited use)", "Cap Splint (acrylic/cast metal)\nVacuum-formed splint + GIC\nComposite resin alone",
"Alveolar fracture\nMultiple luxated teeth\n+ alveolar segment Fx", "#7A2C2C"),
("NOT INDICATED", "No splint required",
"Concussion\nSubluxation\nIntrusion\nAvulsion (no reimplant)", "#2C5A3A"),
]
col_w = 6.5
start_x = 1.3
for i, (title, splints, when, color) in enumerate(splint_data):
bx = start_x + i * col_w + col_w/2
bx_rect = FancyBboxPatch((start_x + i * col_w, 17.25), col_w - 0.3, 1.65,
boxstyle="round,pad=0.07",
facecolor=color, edgecolor=C_AMBER, linewidth=1, zorder=3, alpha=0.9)
ax.add_patch(bx_rect)
ax.text(bx - 0.15, 18.67, title, ha='center', va='top', fontsize=8.5, color=C_WHITE,
fontweight='bold', zorder=4, multialignment='center', linespacing=1.3)
ax.text(bx - 0.15, 18.18, splints, ha='center', va='center', fontsize=7.5, color=C_LTGRAY,
zorder=4, multialignment='center', linespacing=1.25)
ax.text(1.3 + 0*col_w + col_w/2 - 0.15, 17.5, "When?", ha='center', va='center', fontsize=7,
color=C_GOLD, zorder=4)
# ─── DURATION TABLE ───────────────────────────────────────────────────────────
dur_y = 16.9
dur_bg = FancyBboxPatch((0.5, 14.8), 21, 1.95,
boxstyle="round,pad=0.1",
facecolor="#0A1E32", edgecolor="#3A7ABF", linewidth=1.2, zorder=3)
ax.add_patch(dur_bg)
ax.text(11, 16.55, "SPLINTING DURATION — IADT 2020 Primary Dentition Guidelines",
ha='center', va='center', fontsize=9.5, color=C_GOLD, fontweight='bold', zorder=4)
dur_data = [
("Lateral Luxation\n(if splinted)", "4 weeks", "Flexible"),
("Root Fracture\n(if splinted)", "4 weeks", "Flexible"),
("Alveolar Fracture", "4 weeks", "Flexible / Cap Splint"),
("Extrusive Luxation\n(if unstable)", "2-3 weeks", "Flexible"),
("Concussion / Subluxation", "No splint", "—"),
("Intrusive Luxation", "No splint", "—"),
("Avulsion", "No reimplant", "—"),
]
col_xs = [2.2, 7.5, 12.0, 16.5]
headers = ["Injury Type", "Duration", "Splint Type", "Cap Splint?"]
cap_splint_yn = ["NO", "NO", "YES*", "NO", "—", "—", "—"]
for j, h in enumerate(headers):
ax.text(col_xs[j], 16.05, h, ha='center', va='center', fontsize=8.5,
color=C_AMBER, fontweight='bold', zorder=4)
ax.plot([0.7, 21.3], [15.78, 15.78], color="#3A7ABF", lw=0.8, zorder=4)
for i, (inj, dur, spl) in enumerate(dur_data):
row_y = 15.55 - i * 0.28
bg_c = "#0D243A" if i % 2 == 0 else "#0A1E32"
row_rect = FancyBboxPatch((0.7, row_y - 0.13), 20.6, 0.27,
boxstyle="square,pad=0.0",
facecolor=bg_c, edgecolor="none", zorder=3)
ax.add_patch(row_rect)
ax.text(col_xs[0], row_y, inj.replace("\n", " "), ha='center', va='center',
fontsize=7.2, color=C_WHITE, zorder=4)
ax.text(col_xs[1], row_y, dur, ha='center', va='center',
fontsize=7.5, color=C_WHITE, fontweight='bold', zorder=4)
ax.text(col_xs[2], row_y, spl, ha='center', va='center',
fontsize=7.2, color=C_LTGRAY, zorder=4)
yn_color = "#70FF90" if cap_splint_yn[i] == "YES*" else ("#FF7070" if cap_splint_yn[i] == "NO" else C_LTGRAY)
ax.text(col_xs[3], row_y, cap_splint_yn[i], ha='center', va='center',
fontsize=8, color=yn_color, fontweight='bold', zorder=4)
# ─── FOLLOW-UP PROTOCOL BOX ───────────────────────────────────────────────────
fu_bg = FancyBboxPatch((0.5, 12.0), 10.1, 2.55,
boxstyle="round,pad=0.08",
facecolor="#0F2A45", edgecolor="#3A7ABF", linewidth=1.2, zorder=3)
ax.add_patch(fu_bg)
ax.text(5.55, 14.35, "FOLLOW-UP SCHEDULE", ha='center', va='center',
fontsize=9, color=C_GOLD, fontweight='bold', zorder=4)
fu_items = [
"1 week — Clinical exam after repositioning/splinting",
"4 weeks — Splint removal (if splint used)",
"6-8 weeks — Clinical assessment of healing",
"6 months — Check for complications",
"1 year — Radiographic check",
"Age 6+ — Monitor permanent tooth eruption",
]
for i, item in enumerate(fu_items):
ax.text(0.9, 14.0 - i * 0.35, f"• {item}", ha='left', va='center',
fontsize=7.8, color=C_LTGRAY, zorder=4)
# ─── COMPLICATION BOX ─────────────────────────────────────────────────────────
cx_comp = 16.0
comp_bg = FancyBboxPatch((10.8, 12.0), 10.7, 2.55,
boxstyle="round,pad=0.08",
facecolor="#1A0A0A", edgecolor="#B03030", linewidth=1.2, zorder=3)
ax.add_patch(comp_bg)
ax.text(cx_comp, 14.35, "WATCH FOR COMPLICATIONS", ha='center', va='center',
fontsize=9, color="#FF8080", fontweight='bold', zorder=4)
comp_items = [
"Pulp necrosis / abscess (darkening of crown)",
"Pathological external root resorption",
"Ankylosis (over-rigid / prolonged splinting)",
"Developmental disturbance to permanent tooth",
"Enamel hypoplasia of successor (Turner tooth)",
"Failure of splint / loss of retention",
]
for i, item in enumerate(comp_items):
ax.text(11.1, 14.0 - i * 0.35, f"⚠ {item}", ha='left', va='center',
fontsize=7.8, color="#FFB0B0", zorder=4)
# ─── KEY PRINCIPLES BOX ───────────────────────────────────────────────────────
kp_bg = FancyBboxPatch((0.5, 10.0), 21, 1.75,
boxstyle="round,pad=0.1",
facecolor="#0A1E14", edgecolor="#1A7A4A", linewidth=1.5, zorder=3)
ax.add_patch(kp_bg)
ax.text(11, 11.57, "KEY PRINCIPLES FOR SPLINTING PRIMARY TEETH",
ha='center', va='center', fontsize=9.5, color="#70E090", fontweight='bold', zorder=4)
principles = [
"1 Use FLEXIBLE splints when splinting is indicated in primary dentition (IADT 2020)",
"2 Cap splints (rigid) are acceptable ONLY for alveolar fractures or complex multi-segment injuries",
"3 AVOID rigid splinting for pure luxation injuries — increases ankylosis + permanent tooth germ risk",
"4 PRIMARY teeth are NOT reimplanted after avulsion",
"5 Shorter splinting duration in children (2-4 wks) vs adults — rapid healing + TMJ ankylosis risk",
"6 Protect permanent tooth bud — this is the PRIMARY GOAL in all primary dentition trauma management",
]
for i, p in enumerate(principles[:3]):
ax.text(0.8, 11.22 - i*0.32, p, ha='left', va='center', fontsize=7.5, color=C_LTGRAY, zorder=4)
for i, p in enumerate(principles[3:]):
ax.text(0.8, 10.25 - i*0.32 + 0.32, p, ha='left', va='center', fontsize=7.5, color=C_LTGRAY, zorder=4)
# ─── REFERENCES ───────────────────────────────────────────────────────────────
ref_bg = FancyBboxPatch((0.5, 8.35), 21, 1.45,
boxstyle="round,pad=0.08",
facecolor="#0D1B2A", edgecolor="#304A6A", linewidth=1, zorder=3)
ax.add_patch(ref_bg)
ax.text(11, 9.6, "KEY REFERENCES", ha='center', va='center',
fontsize=8.5, color=C_GOLD, fontweight='bold', zorder=4)
refs = [
"1. Malmgren B et al. IADT Guidelines — Injuries in the Primary Dentition. Dental Traumatology 2020;36(4):343-359. doi:10.1111/edt.12576",
"2. Fernandez MDS et al. Splinting in the management of dental trauma in the primary dentition: systematic review. Eur Arch Paediatr Dent 2023. PMID 36930443",
"3. Deery C. Should we splint traumatised primary teeth? Evid Based Dent 2023;24(3):118-119. PMID 37433924",
"4. Adverse effects of splinting of luxated primary teeth: SR. PMC12094451 | 5. Das S et al. Management of Laterally Luxated Primary Teeth. Cureus 2023. PMID 36968882",
]
for i, r in enumerate(refs):
ax.text(0.8, 9.35 - i*0.26, r, ha='left', va='center', fontsize=7, color="#A0B8CC", zorder=4)
# ─── LEGEND ───────────────────────────────────────────────────────────────────
legend_items = [
(C_DIAMOND, "Decision point"),
(C_ACTION, "Clinical action"),
(C_SPLINT, "Splinting indicated"),
(C_OBSERVE, "Observe / no splint"),
(C_EXTRACT, "Extract tooth"),
("#6A3A9C", "Cap splint (rigid)"),
]
lx, ly = 0.7, 7.85
ax.text(lx, ly, "LEGEND:", ha='left', va='center', fontsize=8, color=C_GOLD, fontweight='bold', zorder=4)
for i, (color, label) in enumerate(legend_items):
bx = lx + 1.5 + i * 3.2
rect = FancyBboxPatch((bx, ly - 0.2), 0.45, 0.38,
boxstyle="round,pad=0.04",
facecolor=color, edgecolor="none", zorder=3)
ax.add_patch(rect)
ax.text(bx + 0.6, ly - 0.01, label, ha='left', va='center',
fontsize=8, color=C_WHITE, zorder=4)
# ─── ASTERISK NOTE ────────────────────────────────────────────────────────────
ax.text(0.7, 7.3,
"* Cap splint acceptable for alveolar fractures. CMW = Circummandibular Wiring. "
"GIC = Glass Ionomer Cement. IADT = International Association of Dental Traumatology.",
ha='left', va='center', fontsize=7.5, color="#88A0B8",
style='italic', zorder=4)
# ─── BORDER ───────────────────────────────────────────────────────────────────
border = FancyBboxPatch((0.05, 0.05), 21.9, 33.9,
boxstyle="round,pad=0.1",
facecolor="none", edgecolor=C_AMBER, linewidth=2.5, zorder=1)
ax.add_patch(border)
plt.tight_layout(pad=0)
plt.savefig("/home/daytona/workspace/cap-splint-flowchart/primary_dentition_splinting_flowchart.png",
dpi=180, bbox_inches='tight', facecolor=C_BG)
print("Saved successfully.")
cd /home/daytona/workspace/cap-splint-flowchart && python flowchart.py 2>&1
ls -lh /home/daytona/workspace/cap-splint-flowchart/
primary dentition splinting flowchart
Image · PNG
| Branch | Key Decision | Outcome |
|---|---|---|
| Concussion | No displacement | Observe - no splint |
| Subluxation | Increased mobility only | Observe - no splint |
| Extrusive Luxation | >3mm? → Extract; unstable after reposition? | Flexible splint 2-3 wks |
| Lateral Luxation | Occlusal interference? → Reposition → still unstable? | Flexible splint 4 wks |
| Intrusive Luxation | Apex toward tooth bud? | Extract or observe |
| Root Fracture | Coronal fragment mobile? → Apical stable? | Flexible splint 4 wks |
| Alveolar Fracture | Segment displaced? → Reposition → Cap splint available? | Cap splint + CMW accepted |