Casting procedure from philips dental materials
| Defect | Cause |
|---|---|
| Porosity (localized shrinkage) | Insufficient sprue diameter; premature solidification of sprue |
| Porosity (gas) | Overheating; improper torch technique; occluded gases in alloy |
| Short casting (incomplete fill) | Insufficient casting pressure; premature solidification; wax residue |
| Fins/flash | Cracks in investment from rapid heating or improper handling |
| Rough surface | Improper water-powder ratio; air bubbles in investment |
| Distorted casting | Distortion of wax pattern; improper burnout |
| Discoloration/oxidation | Overheating; contamination |
Make a image of this
A detailed educational flowchart diagram showing the dental casting procedure steps from Phillips' Dental Materials. The diagram shows sequential numbered steps connected by arrows: 1) Wax Pattern Fabrication (with spruing), 2) Investing the Wax Pattern (mixing investment, pouring into casting ring with liner), 3) Wax Elimination/Burnout (furnace with ring inside, temperature 482-537°C), 4) Melting and Casting (centrifugal casting machine, molten metal, torch), 5) Devesting/Removing the Casting (breaking investment, ultrasonic cleaning), 6) Finishing and Polishing (pickling, trimming sprue, polishing sequence). Each step has a small illustration icon and brief bullet point notes. Clean white background, medical/dental textbook style, blue and gold color scheme, professional and clear labels.

Create a detailed PDF reference guide on casting defects and troubleshooting
mkdir -p /tmp/workspace/casting-defects && ls /tmp/workspace/casting-defects/
~/casting-defects/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.platypus.flowables import HRFlowable
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.graphics.shapes import Drawing, Rect, String, Line, Circle
from reportlab.graphics import renderPDF
import datetime
OUTPUT_PATH = "/tmp/workspace/casting-defects/Dental_Casting_Defects_Reference_Guide.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
NAVY = colors.HexColor("#1A2E5A")
GOLD = colors.HexColor("#C8A84B")
LIGHT_BG = colors.HexColor("#F4F6FB")
RED_LIGHT = colors.HexColor("#FDECEA")
RED_DARK = colors.HexColor("#C0392B")
GREEN_BG = colors.HexColor("#EAF7EF")
GREEN_DK = colors.HexColor("#1E8449")
BLUE_BG = colors.HexColor("#EAF0FB")
BLUE_DK = colors.HexColor("#2471A3")
ORANGE_BG = colors.HexColor("#FEF5E4")
ORANGE_DK = colors.HexColor("#D35400")
GREY_LINE = colors.HexColor("#CBD5E0")
WHITE = colors.white
TEXT_DARK = colors.HexColor("#1C1C2E")
# ── Document setup ───────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT_PATH,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.5*cm, bottomMargin=2.2*cm,
title="Dental Casting Defects & Troubleshooting",
author="Phillips' Science of Dental Materials",
)
styles = getSampleStyleSheet()
W = A4[0] - 4*cm # usable width
# ── Custom paragraph styles ──────────────────────────────────────────────────
def S(name, **kw):
return ParagraphStyle(name, **kw)
sTitle = S("sTitle",
fontName="Helvetica-Bold", fontSize=26, textColor=WHITE,
alignment=TA_CENTER, spaceAfter=4)
sSubtitle = S("sSubtitle",
fontName="Helvetica", fontSize=13, textColor=GOLD,
alignment=TA_CENTER, spaceAfter=6)
sAuthor = S("sAuthor",
fontName="Helvetica-Oblique", fontSize=10, textColor=colors.HexColor("#BDC8E0"),
alignment=TA_CENTER, spaceAfter=2)
sH1 = S("sH1",
fontName="Helvetica-Bold", fontSize=15, textColor=WHITE,
spaceBefore=14, spaceAfter=6, leftIndent=0)
sH2 = S("sH2",
fontName="Helvetica-Bold", fontSize=12, textColor=NAVY,
spaceBefore=10, spaceAfter=4)
sH3 = S("sH3",
fontName="Helvetica-Bold", fontSize=10.5, textColor=BLUE_DK,
spaceBefore=7, spaceAfter=3)
sBody = S("sBody",
fontName="Helvetica", fontSize=9.5, textColor=TEXT_DARK,
leading=14, spaceAfter=4, alignment=TA_JUSTIFY)
sBullet = S("sBullet",
fontName="Helvetica", fontSize=9.5, textColor=TEXT_DARK,
leading=13, spaceAfter=2, leftIndent=14, bulletIndent=4)
sNote = S("sNote",
fontName="Helvetica-Oblique", fontSize=8.5, textColor=colors.HexColor("#555577"),
leading=12, spaceAfter=3, leftIndent=10)
sTableHdr = S("sTableHdr",
fontName="Helvetica-Bold", fontSize=9, textColor=WHITE,
alignment=TA_CENTER, leading=12)
sTableCell = S("sTableCell",
fontName="Helvetica", fontSize=8.8, textColor=TEXT_DARK,
leading=12, alignment=TA_LEFT)
sTableCellC = S("sTableCellC",
fontName="Helvetica", fontSize=8.8, textColor=TEXT_DARK,
leading=12, alignment=TA_CENTER)
sCaution = S("sCaution",
fontName="Helvetica-Bold", fontSize=9, textColor=RED_DARK,
leading=12, spaceAfter=2, leftIndent=10)
sTip = S("sTip",
fontName="Helvetica-Bold", fontSize=9, textColor=GREEN_DK,
leading=12, spaceAfter=2, leftIndent=10)
# ── Helper builders ──────────────────────────────────────────────────────────
def section_header(text):
"""Blue banner for major section headings."""
tbl = Table([[Paragraph(text, sH1)]], colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("ROUNDEDCORNERS", [4]),
]))
return tbl
def colored_box(content_rows, bg=LIGHT_BG, border=GREY_LINE):
tbl = Table(content_rows, colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 0.8, border),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
return tbl
def defect_table(headers, rows, col_widths=None):
if col_widths is None:
n = len(headers)
col_widths = [W/n]*n
data = [[Paragraph(h, sTableHdr) for h in headers]]
for row in rows:
data.append([Paragraph(cell, sTableCell) for cell in row])
tbl = Table(data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), NAVY),
("BACKGROUND", (0,1), (-1,-1), LIGHT_BG),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LIGHT_BG]),
("GRID", (0,0), (-1,-1), 0.4, GREY_LINE),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "TOP"),
]
tbl.setStyle(TableStyle(style))
return tbl
def bullet(text):
return Paragraph(f"• {text}", sBullet)
def caution(text):
return colored_box([[Paragraph(f"⚠ CAUTION: {text}", sCaution)]], bg=RED_LIGHT, border=RED_DARK)
def tip(text):
return colored_box([[Paragraph(f"✔ TIP: {text}", sTip)]], bg=GREEN_BG, border=GREEN_DK)
def note(text):
return colored_box([[Paragraph(f"ℹ NOTE: {text}", sNote)]], bg=BLUE_BG, border=BLUE_DK)
def sp(h=6):
return Spacer(1, h)
# ── Cover page ───────────────────────────────────────────────────────────────
def cover():
elems = []
# Banner
banner_data = [[
Paragraph("DENTAL CASTING DEFECTS", sTitle),
Paragraph("& TROUBLESHOOTING", sTitle),
Paragraph("Reference Guide", sSubtitle),
Paragraph("Based on Phillips' Science of Dental Materials", sAuthor),
Paragraph(f"Generated {datetime.date.today().strftime('%B %d, %Y')}", sAuthor),
]]
# Use a single cell with all content stacked
cover_inner = [
Paragraph("DENTAL CASTING DEFECTS & TROUBLESHOOTING", sTitle),
Paragraph("Reference Guide", sSubtitle),
Spacer(1, 8),
Paragraph("Based on Phillips' Science of Dental Materials", sAuthor),
Paragraph(f"Generated {datetime.date.today().strftime('%B %d, %Y')}", sAuthor),
]
banner = Table([[item] for item in cover_inner], colWidths=[W])
banner.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 20),
("RIGHTPADDING", (0,0), (-1,-1), 20),
]))
elems.append(banner)
elems.append(sp(20))
# Quick overview box
elems.append(Paragraph("GUIDE OVERVIEW", sH2))
elems.append(HRFlowable(width=W, thickness=1.5, color=GOLD, spaceAfter=6))
elems.append(Paragraph(
"This reference guide provides a complete, clinically oriented classification of dental "
"casting defects with their causes, mechanisms, and step-by-step corrective actions. "
"It covers all major defect categories encountered in the lost-wax casting technique for "
"metal dental restorations (inlays, onlays, crowns, and bridges). Use this guide at "
"chairside or in the laboratory to diagnose defects and implement targeted solutions.",
sBody))
elems.append(sp(10))
# Table of contents
elems.append(Paragraph("CONTENTS", sH2))
elems.append(HRFlowable(width=W, thickness=1.5, color=GOLD, spaceAfter=6))
toc_data = [
["Section", "Topic"],
["1", "Classification of Casting Defects"],
["2", "Porosity Defects (Detailed)"],
["3", "Incomplete Casting Defects"],
["4", "Dimensional Inaccuracies"],
["5", "Surface Defects"],
["6", "Discoloration and Contamination"],
["7", "Distortion Defects"],
["8", "Troubleshooting Quick-Reference Table"],
["9", "Prevention Checklist"],
["10", "Key Points Summary"],
]
toc = Table(toc_data, colWidths=[1.5*cm, W-1.5*cm])
toc.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_BG]),
("GRID", (0,0), (-1,-1), 0.3, GREY_LINE),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("ALIGN", (0,0), (0,-1), "CENTER"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1), (0,-1), NAVY),
]))
elems.append(toc)
elems.append(PageBreak())
return elems
# ── Section 1: Classification ────────────────────────────────────────────────
def section1():
elems = []
elems.append(section_header("SECTION 1: Classification of Casting Defects"))
elems.append(sp(8))
elems.append(Paragraph(
"Casting defects in the lost-wax dental casting technique can be systematically classified "
"into six major categories based on their etiology and appearance:", sBody))
elems.append(sp(6))
class_data = [
["Category", "Description", "Primary Stage of Origin"],
["1. Porosity", "Voids within the casting (internal or surface)", "Melting / Solidification"],
["2. Incomplete Castings", "Partial fills or missing portions", "Casting / Burnout"],
["3. Dimensional Inaccuracies", "Over- or undersized restorations", "Investment / Wax handling"],
["4. Surface Defects", "Rough, pitted, or irregular surfaces", "Investing / Investment mixing"],
["5. Discoloration & Contamination", "Altered surface color or composition", "Melting / Pickling"],
["6. Distortion", "Warped or misshapen castings", "Wax pattern / Burnout"],
]
elems.append(defect_table(
class_data[0], class_data[1:],
col_widths=[3.5*cm, 8*cm, W-11.5*cm]
))
elems.append(sp(10))
elems.append(note(
"Most casting defects are preventable. A systematic approach to diagnosis — identifying "
"WHERE the defect appears and WHEN in the process it originated — is the key to effective troubleshooting."
))
elems.append(PageBreak())
return elems
# ── Section 2: Porosity ───────────────────────────────────────────────────────
def section2():
elems = []
elems.append(section_header("SECTION 2: Porosity Defects"))
elems.append(sp(8))
elems.append(Paragraph(
"Porosity is the most common casting defect. It refers to voids (pores) within the metal "
"casting. Porosity weakens the restoration, compromises marginal fit, and increases susceptibility "
"to corrosion. There are five distinct types:", sBody))
elems.append(sp(8))
# 2.1 Shrinkage porosity
elems.append(Paragraph("2.1 Localized Shrinkage Porosity", sH2))
elems.append(HRFlowable(width=W, thickness=1, color=GOLD, spaceAfter=5))
elems.append(Paragraph(
"<b>Appearance:</b> Irregular, ragged voids located near the sprue-casting junction or at the "
"thickest areas of the casting. Often visible on the intaglio (fitting) surface.", sBody))
elems.append(Paragraph("<b>Cause / Mechanism:</b>", sH3))
for b in [
"Alloy contracts ~1.5–2.5% on solidification (casting solidification shrinkage).",
"If the sprue solidifies before the bulk of the casting, liquid metal cannot feed back into the shrinking area.",
"Results in a localized void at the last-to-solidify region.",
]:
elems.append(bullet(b))
elems.append(sp(4))
elems.append(Paragraph("<b>Corrective Actions:</b>", sH3))
for b in [
"Increase sprue diameter (min 2.5 mm, ideally matching the thickest part of the pattern).",
"Use a reservoir or anti-shrink sprue attached proximal to the pattern.",
"Position the sprue at the thickest area so it solidifies last.",
"Ensure the crucible and sprue remain molten longer than the pattern.",
"Use a button of adequate size (acts as a reservoir of liquid metal).",
]:
elems.append(bullet(b))
elems.append(sp(4))
elems.append(caution("Never use a sprue diameter smaller than the thickest dimension of the wax pattern."))
elems.append(sp(8))
# 2.2 Microporosity
elems.append(Paragraph("2.2 Microporosity (Micro-shrinkage)", sH2))
elems.append(HRFlowable(width=W, thickness=1, color=GOLD, spaceAfter=5))
elems.append(Paragraph(
"<b>Appearance:</b> Tiny, evenly distributed pores throughout the casting. "
"Often detected only on sectioning or under magnification.", sBody))
elems.append(Paragraph("<b>Cause / Mechanism:</b>", sH3))
for b in [
"Rapid, simultaneous solidification throughout the casting.",
"Occurs when the mold temperature is too high relative to the alloy melting point, causing uniform cooling without directional solidification.",
"Also caused by casting with insufficient metal volume.",
]:
elems.append(bullet(b))
elems.append(Paragraph("<b>Corrective Actions:</b>", sH3))
for b in [
"Reduce mold (ring) temperature at the time of casting.",
"Ensure adequate metal volume — use recommended amount of alloy.",
"Cast in the direction from thin to thick sections.",
]:
elems.append(bullet(b))
elems.append(sp(8))
# 2.3 Gas porosity
elems.append(Paragraph("2.3 Gas Porosity (Occluded Gas Porosity)", sH2))
elems.append(HRFlowable(width=W, thickness=1, color=GOLD, spaceAfter=5))
elems.append(Paragraph(
"<b>Appearance:</b> Spherical, smooth-walled voids scattered within the casting or on cut surfaces. "
"May appear near the surface or throughout.", sBody))
elems.append(Paragraph("<b>Cause / Mechanism:</b>", sH3))
for b in [
"Gases (O₂, CO, CO₂, N₂, H₂) dissolve in molten metal at high temperature.",
"On solidification, gas solubility drops rapidly, and the trapped gas forms bubbles.",
"Sources: flame combustion products, contaminated alloy, or wet investment.",
]:
elems.append(bullet(b))
elems.append(Paragraph("<b>Corrective Actions:</b>", sH3))
for b in [
"Avoid overheating the alloy — cast as soon as the alloy reaches casting temperature.",
"Use a reducing (slightly fuel-rich) torch flame to minimize oxidation.",
"Use fresh, uncontaminated alloy (avoid excessive reuse of sprues/buttons).",
"Ensure investment is completely dry before burnout.",
"Use vacuum casting or pressure casting to suppress gas entrapment.",
]:
elems.append(bullet(b))
elems.append(sp(4))
elems.append(caution("Overheating the alloy is the single most common cause of gas porosity. Watch for a sparkling, boiling appearance in the molten alloy — this indicates overheating."))
elems.append(sp(8))
# 2.4 Back-pressure porosity
elems.append(Paragraph("2.4 Back-Pressure Porosity", sH2))
elems.append(HRFlowable(width=W, thickness=1, color=GOLD, spaceAfter=5))
elems.append(Paragraph(
"<b>Appearance:</b> Rounded, irregular surface pitting or voids, typically on the surface of "
"the casting opposite the sprue entry. Pattern resembles a cauliflower or pock-marked surface.", sBody))
elems.append(Paragraph("<b>Cause / Mechanism:</b>", sH3))
for b in [
"Air trapped in the mold cavity cannot escape fast enough as molten metal advances.",
"The compressed air resists complete fill, creating voids at the farthest point from the sprue.",
"Common with low-permeability investment or too-thick investment walls.",
]:
elems.append(bullet(b))
elems.append(Paragraph("<b>Corrective Actions:</b>", sH3))
for b in [
"Use investment with adequate porosity/permeability.",
"Do not allow investment to overflow the ring top (leave a vent).",
"Maintain correct water-to-powder ratio — a thick mix reduces permeability.",
"Use a vented sprue base or vacuum casting.",
"Ensure the burnout is complete so no wax residue blocks vent paths.",
]:
elems.append(bullet(b))
elems.append(sp(8))
# 2.5 Pinhole porosity
elems.append(Paragraph("2.5 Pinhole Porosity (Subsurface Pinhole)", sH2))
elems.append(HRFlowable(width=W, thickness=1, color=GOLD, spaceAfter=5))
elems.append(Paragraph(
"<b>Appearance:</b> Tiny round holes just below or at the casting surface, often in a pattern "
"matching the wax pattern surface.", sBody))
elems.append(Paragraph("<b>Cause / Mechanism:</b>", sH3))
for b in [
"Hydrogen gas dissolved in base metal alloys (especially nickel-chromium).",
"Hydrogen is absorbed from moisture, flux, or organic residues.",
"Released during solidification just below the surface.",
]:
elems.append(bullet(b))
elems.append(Paragraph("<b>Corrective Actions:</b>", sH3))
for b in [
"Use clean, dry alloy and clean crucible.",
"Avoid flux when possible with induction or resistance melting.",
"Ensure complete burnout and a dry mold.",
"Use argon-shielded melting environments for sensitive base metal alloys.",
]:
elems.append(bullet(b))
elems.append(PageBreak())
return elems
# ── Section 3: Incomplete Casting ─────────────────────────────────────────────
def section3():
elems = []
elems.append(section_header("SECTION 3: Incomplete Casting Defects"))
elems.append(sp(8))
elems.append(Paragraph(
"An incomplete casting (also called a short casting or misrun) occurs when molten metal "
"fails to completely fill the mold cavity. Parts of the restoration are missing or thin.", sBody))
elems.append(sp(8))
elems.append(Paragraph("3.1 Short or Incomplete Castings", sH2))
elems.append(HRFlowable(width=W, thickness=1, color=GOLD, spaceAfter=5))
elems.append(Paragraph("<b>Appearance:</b> Missing cusp tips, thin margins, or entire sections absent from the casting.", sBody))
rows = [
["Cause", "Mechanism", "Correction"],
["Insufficient alloy volume",
"Not enough metal to fill the entire mold cavity",
"Weigh and use the correct amount of alloy per manufacturer specs + 10% excess"],
["Premature solidification",
"Metal cools before filling fine details; common in thin margins",
"Increase mold temperature slightly; preheat the ring appropriately"],
["Low casting pressure",
"Centrifugal arm not wound enough; gas pressure insufficient",
"Wind centrifugal arm fully; check pressure settings on pneumatic machines"],
["Wax residue / incomplete burnout",
"Residual carbon blocks mold voids",
"Extend burnout time; check final mold temperature (dull red glow)"],
["Air lock in mold",
"Trapped air prevents metal entry",
"Ensure proper investment permeability; use vacuum assist"],
["Sprue too long or too narrow",
"Metal cools in sprue before entering mold",
"Use shorter, wider sprue (2.5–3.5 mm); keep sprue length ≤ 6 mm if possible"],
]
elems.append(defect_table(
rows[0], rows[1:],
col_widths=[4*cm, 6.5*cm, W-10.5*cm]
))
elems.append(sp(8))
elems.append(tip("For thin-margin restorations (e.g., porcelain-fused-to-metal substructures), use a slightly higher ring temperature and ensure maximum casting pressure."))
elems.append(sp(10))
elems.append(Paragraph("3.2 Fins and Flash", sH2))
elems.append(HRFlowable(width=W, thickness=1, color=GOLD, spaceAfter=5))
elems.append(Paragraph(
"<b>Appearance:</b> Thin metallic projections, sheets, or fins extending from the casting surface, "
"often at the margin area. Metal has entered investment cracks.", sBody))
elems.append(Paragraph("<b>Causes:</b>", sH3))
for b in [
"Cracks in the investment from too-rapid heating during burnout.",
"Improper water-to-powder ratio (too much water = weak investment).",
"Inadequate bench set time before placing ring in furnace.",
"Thermal shock from placing a cold ring into a very hot furnace.",
]:
elems.append(bullet(b))
elems.append(Paragraph("<b>Corrections:</b>", sH3))
for b in [
"Use a two-stage burnout: low temperature (250°C) for 30 min, then ramp to final temp.",
"Follow manufacturer water-to-powder ratio precisely.",
"Allow minimum 45–60 minutes bench set before burnout.",
"Place ring in a cold or pre-warmed (200°C) furnace and ramp up gradually.",
]:
elems.append(bullet(b))
elems.append(PageBreak())
return elems
# ── Section 4: Dimensional Inaccuracies ──────────────────────────────────────
def section4():
elems = []
elems.append(section_header("SECTION 4: Dimensional Inaccuracies"))
elems.append(sp(8))
elems.append(Paragraph(
"The final casting must compensate for the solidification shrinkage of the alloy (~1.5–2.5%) "
"through the expansion of the investment material. When this balance is disrupted, "
"the restoration will not fit the prepared tooth accurately.", sBody))
elems.append(sp(8))
elems.append(Paragraph("Expansion Balance Concept", sH2))
elems.append(HRFlowable(width=W, thickness=1, color=GOLD, spaceAfter=5))
elems.append(colored_box([[Paragraph(
"Total Investment Expansion = Setting Expansion + Thermal (Burnout) Expansion<br/>"
"This must equal Alloy Solidification Shrinkage for an accurate fit.<br/><br/>"
"• Gypsum-bonded investment: total expansion ~1.2–2.2% (for Type III/IV gold)<br/>"
"• Phosphate-bonded investment: total expansion ~1.4–2.8% (for base metal/ceramic alloys)",
sBody
)]], bg=BLUE_BG, border=BLUE_DK))
elems.append(sp(8))
rows = [
["Problem", "Cause", "Effect on Fit", "Correction"],
["Casting too large",
"Excessive investment expansion (too much silica liquid; too low W/P ratio)",
"Crown will not seat; must be ground significantly",
"Use correct W/P ratio; replace silica liquid with distilled water partially"],
["Casting too small",
"Insufficient expansion; alloy shrinkage exceeds investment expansion",
"Crown is loose; gaps at margins",
"Check W/P ratio; ensure complete thermal expansion by using correct burnout temp"],
["Casting too small",
"Wax pattern distorted before investing",
"Misfit in all dimensions",
"Store patterns at room temp; invest promptly after fabrication"],
["Casting too large",
"Hygroscopic expansion uncontrolled",
"Oversized in specific dimension",
"Follow hygroscopic technique precisely; control water bath temperature"],
["Uneven fit",
"Investment expansion non-uniform due to air bubbles or improper liner",
"Rocking or tilted seating",
"Vacuum mix investment; use proper ring liner width and moisture"],
]
elems.append(defect_table(
rows[0], rows[1:],
col_widths=[3.5*cm, 5*cm, 4*cm, W-12.5*cm]
))
elems.append(sp(8))
elems.append(note(
"Phosphate-bonded investments expand more than gypsum-bonded types. "
"Never substitute one investment type for another without recalculating expansion requirements."
))
elems.append(PageBreak())
return elems
# ── Section 5: Surface Defects ───────────────────────────────────────────────
def section5():
elems = []
elems.append(section_header("SECTION 5: Surface Defects"))
elems.append(sp(8))
defects = [
("5.1 Rough or Irregular Casting Surface", [
("Appearance", "Grainy, rough surface; may show pitting or orange-peel texture."),
("Causes",
"• Air bubbles trapped against wax pattern during investing\n"
"• Insufficient wetting of wax pattern by investment\n"
"• Too-rapid pouring of investment\n"
"• Incorrect W/P ratio (too thick)\n"
"• Delayed painting of pattern"),
("Corrections",
"• Paint wax pattern with a thin layer of investment before pouring\n"
"• Use a wetting agent/debubblizer on the wax pattern\n"
"• Pour investment slowly down the side of the ring while vibrating\n"
"• Use vacuum investing equipment\n"
"• Invest within 30 min of wax pattern fabrication"),
]),
("5.2 Nodules on the Casting Surface", [
("Appearance", "Small, round bumps or protuberances on the fitting surface of the casting."),
("Causes",
"• Air bubbles in the investment settled on the wax pattern surface\n"
"• These bubbles form spherical voids in the set investment\n"
"• Molten metal fills these voids, creating nodules"),
("Corrections",
"• Vacuum mixing is essential — eliminates almost all air bubbles\n"
"• Apply debubblizer to wax pattern before investing\n"
"• Paint investment onto pattern first; pour remainder without vibrating directly on pattern"),
]),
("5.3 Veins and Fins on Surface", [
("Appearance", "Thin, raised lines or ridges following surface cracks in the investment."),
("Causes",
"• Investment cracked due to thermal shock during burnout\n"
"• Excessive expansion of investment cracked the mold\n"
"• Weak investment (too much water)"),
("Corrections",
"• Gradual burnout heating; start at low temperature\n"
"• Use correct W/P ratio\n"
"• Adequate bench setting before burnout"),
]),
("5.4 Investment Inclusions", [
("Appearance", "Fragments of investment embedded in the casting surface, appearing as hard white specks."),
("Causes",
"• Pieces of investment dislodged from mold walls during casting\n"
"• Weak investment formula\n"
"• High casting pressure fracturing investment"),
("Corrections",
"• Use investment with adequate strength\n"
"• Avoid excessive casting pressure\n"
"• Inspect and carefully clean devested castings before fitting"),
]),
]
for title, items in defects:
elems.append(Paragraph(title, sH2))
elems.append(HRFlowable(width=W, thickness=1, color=GOLD, spaceAfter=4))
for label, content in items:
elems.append(Paragraph(f"<b>{label}:</b>", sH3))
for line in content.split("\n"):
line = line.strip()
if line.startswith("•"):
elems.append(bullet(line[1:].strip()))
else:
elems.append(Paragraph(line, sBody))
elems.append(sp(10))
elems.append(tip("Vacuum investing is the single most effective step to prevent both rough surfaces and nodule formation. Always use a vacuum mixer when available."))
elems.append(PageBreak())
return elems
# ── Section 6: Discoloration ─────────────────────────────────────────────────
def section6():
elems = []
elems.append(section_header("SECTION 6: Discoloration and Contamination"))
elems.append(sp(8))
rows = [
["Defect", "Appearance", "Cause", "Correction"],
["Surface oxidation",
"Blue-black, greenish, or dark coating on surface",
"Overheating the alloy; oxidizing torch flame; base metal alloys without shielding",
"Cast with reducing flame; do not overheat; use flux for gold alloys"],
["Copper deposition (gold alloys)",
"Pink/reddish coating on gold casting after pickling",
"Steel tweezers used in pickle solution; galvanic reaction deposits copper onto casting",
"ALWAYS use copper, plastic, or wood tongs in pickling solution — NEVER steel"],
["Green/blue staining",
"Greenish surface stain",
"Verdigris — copper oxide from contaminated old alloy; atmospheric moisture",
"Use fresh alloy; store alloy in dry container; clean crucible before each use"],
["Dull/matte surface",
"Loss of bright metallic luster post-pickle",
"Incomplete pickling; surface oxides remain",
"Use fresh pickle solution; heat the pickle solution to 60–70°C for gold alloys"],
["Carbon inclusions",
"Dark grey specks embedded in surface",
"Incomplete burnout; residual carbon from investment or wax",
"Extend burnout time; confirm mold is bright white/cream before casting"],
]
elems.append(defect_table(
rows[0], rows[1:],
col_widths=[3.5*cm, 4*cm, 5*cm, W-12.5*cm]
))
elems.append(sp(8))
elems.append(caution(
"Copper deposition on gold alloy castings is the most common avoidable contamination error. "
"Post a reminder at the pickling station: NO STEEL INSTRUMENTS IN PICKLE."
))
elems.append(sp(6))
elems.append(Paragraph("Pickling Solution Guidance", sH2))
elems.append(HRFlowable(width=W, thickness=1, color=GOLD, spaceAfter=5))
for b in [
"10% hydrochloric acid (HCl) solution or commercial pickle (e.g., Sparex No. 2) are commonly used.",
"Always add acid to water — never water to acid.",
"Replace pickle when it becomes saturated (turns deep blue-green for copper alloys).",
"After pickling, rinse thoroughly under running water for 30 seconds minimum.",
"Do not place wet castings into the pickle — moisture dilutes the solution progressively.",
]:
elems.append(bullet(b))
elems.append(PageBreak())
return elems
# ── Section 7: Distortion ─────────────────────────────────────────────────────
def section7():
elems = []
elems.append(section_header("SECTION 7: Distortion Defects"))
elems.append(sp(8))
elems.append(Paragraph(
"Distortion means the casting has the correct volume and surface but the wrong shape — "
"it does not match the original wax pattern geometry.", sBody))
elems.append(sp(6))
rows = [
["Cause", "Stage", "Mechanism", "Prevention"],
["Wax pattern distortion",
"Wax fabrication",
"Thermal stress relaxation in wax on cooling from body/mouth temperature; "
"improper storage (>25°C); handling stress during removal from die",
"Invest within 30 min of fabrication; store patterns in cool (<22°C) environment; "
"chill pattern on die before removal"],
["Investing too hot",
"Investing",
"Warm investment (>40°C) softens the wax, causing it to flow and distort before setting",
"Use cool (18–21°C) water for gypsum-bonded investment mix; avoid mixing in warm environment"],
["Uneven investment setting",
"Setting",
"Non-uniform expansion stresses distort the embedded wax pattern",
"Ensure uniform ring liner coverage; vibrate gently during pour; avoid jarring the ring after investing"],
["Incomplete burnout",
"Burnout",
"Residual wax in the mold partially blocks or deforms mold cavity on casting",
"Invert ring at start of burnout; ensure complete burnout to dull red with no carbon"],
["Non-uniform ring temperature",
"Burnout",
"One side hotter than the other causes asymmetric expansion of investment",
"Allow ring to equilibrate in furnace; do not cast immediately after removing from furnace — cast within 10 min"],
]
elems.append(defect_table(
rows[0], rows[1:],
col_widths=[4*cm, 2.5*cm, 5.5*cm, W-12*cm]
))
elems.append(sp(8))
elems.append(tip(
"The wax pattern is the most vulnerable component in the entire casting sequence. "
"Handle patterns with minimum touch; use tweezers rather than fingers; "
"never leave a pattern in direct sunlight or near heat sources."
))
elems.append(PageBreak())
return elems
# ── Section 8: Quick Reference Table ─────────────────────────────────────────
def section8():
elems = []
elems.append(section_header("SECTION 8: Troubleshooting Quick-Reference Table"))
elems.append(sp(8))
elems.append(Paragraph(
"Use this table at the bench. Identify the defect you observe, find the likely cause, "
"and apply the recommended fix.", sBody))
elems.append(sp(6))
rows = [
["Observed Defect", "Most Likely Cause", "Immediate Fix"],
["Localized void near sprue junction", "Shrinkage porosity — sprue too small", "Use larger sprue (≥2.5 mm); add reservoir"],
["Spherical voids throughout casting", "Gas porosity — overheating", "Cast sooner; use reducing flame"],
["Rounded pits on surface opposite sprue", "Back-pressure porosity", "Improve investment permeability; use vacuum"],
["Casting incomplete at margins", "Premature solidification / short casting", "Increase ring temp; wind centrifuge fully; use more alloy"],
["Fins and thin metal projections", "Investment cracked during burnout", "Gradual burnout; correct W/P ratio"],
["Rough, grainy surface", "Air bubbles during investing", "Vacuum invest; debubblize wax pattern; paint first"],
["Round nodules on fitting surface", "Air bubbles on pattern surface", "Vacuum mix; apply wetting agent to wax"],
["Casting too large — won't seat", "Excessive investment expansion", "Adjust W/P ratio; check silica liquid dilution"],
["Casting too small — loose fit", "Insufficient expansion", "Verify correct burnout temperature; check W/P ratio"],
["Pink/red copper deposit on gold casting", "Steel forceps used in pickle", "Replace with copper/plastic tongs; re-pickle"],
["Dark oxide coating on casting", "Overheated alloy / oxidizing flame", "Use reducing flame; cast at correct temperature"],
["Carbon specks in surface", "Incomplete burnout", "Extend burnout; verify mold is white/cream colored"],
["Casting distorted / wrong shape", "Wax pattern distorted before investing", "Invest promptly; cool pattern before removal from die"],
["Warped casting after devesting", "Non-uniform investment expansion", "Use proper ring liner; ensure uniform temperature"],
]
elems.append(defect_table(
rows[0], rows[1:],
col_widths=[5*cm, 5.5*cm, W-10.5*cm]
))
elems.append(PageBreak())
return elems
# ── Section 9: Prevention Checklist ──────────────────────────────────────────
def section9():
elems = []
elems.append(section_header("SECTION 9: Prevention Checklist"))
elems.append(sp(8))
elems.append(Paragraph(
"Follow this sequential checklist for every casting to minimise defect incidence:", sBody))
elems.append(sp(6))
phases = [
("WAX PATTERN STAGE", NAVY, [
"Wax pattern uniform thickness; no voids or bubbles in wax",
"Margins are sharp, intact, and fully adapted to die",
"Sprue diameter matches or exceeds thickest area of pattern (min 2.5 mm)",
"Sprue attached at thickest point, angled 45° away from thin margins",
"Pattern stored at room temperature (<22°C); invested within 30 min of fabrication",
"Debubblizer/wetting agent applied to wax pattern surface",
]),
("INVESTING STAGE", BLUE_DK, [
"Ring liner moistened and positioned correctly (not covering ring ends)",
"Investment powder and water (or silica liquid) weighed accurately",
"Mixed under vacuum for 60–90 seconds",
"Investment painted onto wax pattern first before pouring ring",
"Investment poured slowly down ring wall with vibration",
"Ring set undisturbed for ≥ 45 minutes (gypsum) or per manufacturer (phosphate)",
]),
("BURNOUT STAGE", ORANGE_DK, [
"Ring placed in furnace sprue-hole down initially",
"Furnace ramped slowly: start at 250°C for 30 min, then to final temp",
"Final burnout temperature confirmed (482–537°C gold; 700–900°C base metal)",
"Mold appears dull red; interior is white/cream with no dark spots",
"Ring kept at burnout temp for ≥ 30 min after reaching final temperature",
"Ring transferred to casting machine within 10 minutes of removal from furnace",
]),
("MELTING & CASTING STAGE", RED_DARK, [
"Correct weight of alloy used (calculated + 10% excess for button)",
"Crucible is clean and dry; flux applied only if indicated",
"Torch flame adjusted to reducing (slightly fuel-rich) setting",
"Alloy heated to just past liquidus — bright liquid ball, no sparkling/boiling",
"Centrifuge arm fully wound before placing ring",
"Casting initiated immediately once alloy is fluid",
"Ring allowed to bench-cool 3–5 min before quenching (for gold alloys)",
]),
("FINISHING STAGE", GREEN_DK, [
"Investment broken away gently; ultrasonic cleaning to remove residues",
"Copper or plastic tongs used in pickle — NO steel instruments",
"Pickle solution is fresh and heated (for gold alloys)",
"Casting rinsed thoroughly after pickling",
"Sprue cut close and smoothed; no sharp steps at junction",
"Casting seated on die and checked for nodules, fins, or misfit before polishing",
]),
]
for phase_name, color, items in phases:
# Phase header
hdr = Table([[Paragraph(phase_name, ParagraphStyle(
"phasehdr", fontName="Helvetica-Bold", fontSize=10,
textColor=WHITE, alignment=TA_LEFT
))]], colWidths=[W])
hdr.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), color),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0),(-1,-1), 10),
]))
elems.append(hdr)
for i, item in enumerate(items):
row_bg = WHITE if i % 2 == 0 else LIGHT_BG
chk = Table([[
Paragraph("□", ParagraphStyle("chk", fontName="Helvetica", fontSize=11,
textColor=color, alignment=TA_CENTER)),
Paragraph(item, sTableCell)
]], colWidths=[1*cm, W-1*cm])
chk.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), row_bg),
("GRID",(0,0),(-1,-1), 0.3, GREY_LINE),
("TOPPADDING",(0,0),(-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING",(0,0),(-1,-1), 6),
("VALIGN",(0,0),(-1,-1), "MIDDLE"),
]))
elems.append(chk)
elems.append(sp(8))
elems.append(PageBreak())
return elems
# ── Section 10: Key Points Summary ───────────────────────────────────────────
def section10():
elems = []
elems.append(section_header("SECTION 10: Key Points Summary"))
elems.append(sp(8))
key_points = [
("Porosity is multifactorial",
"Different types of porosity (shrinkage, gas, back-pressure) have different causes and require "
"different solutions. Identify the type first, then correct the specific cause."),
("Sprue design is critical",
"The sprue must be large enough (≥2.5 mm) and positioned at the thickest area of the pattern. "
"It must solidify last to act as a reservoir of molten metal feeding shrinkage."),
("Overheating is the enemy",
"Overheating the alloy is the most common technical error. It causes gas porosity, "
"surface oxidation, and alloy degradation. Cast at the minimum effective temperature."),
("Investment expansion must match alloy shrinkage",
"Too much expansion → oversized casting; too little → undersized. "
"Always use the correct water-to-powder ratio and burnout temperature for your specific investment."),
("Vacuum investing prevents surface defects",
"Air bubbles in investment are the primary cause of rough surfaces and nodules. "
"Vacuum mixing eliminates >95% of air bubbles."),
("Wax patterns are fragile",
"Invest immediately (within 30 min), handle minimally, and store at cool temperature. "
"Pattern distortion translates directly into casting distortion."),
("Never use steel in pickle solution",
"Galvanic corrosion between steel and gold/copper-containing alloys deposits copper onto the "
"casting surface. Use only copper, plastic, or wooden instruments near pickle."),
("Burnout must be complete",
"Any residual wax, carbon, or moisture in the mold causes incomplete castings, "
"rough surfaces, and porosity. Confirm by visual inspection of mold color (white/cream)."),
("Gradual heating prevents investment cracking",
"Rapid temperature increases crack gypsum-bonded investment, causing fins on the casting. "
"Always use a two-stage or gradual ramp burnout protocol."),
("Base metal alloys need phosphate investment",
"Never use gypsum-bonded investment for Ni-Cr or Co-Cr alloys — the high casting temperatures "
"will decompose gypsum. Use phosphate-bonded investment and follow manufacturer protocols."),
]
for i, (title, text) in enumerate(key_points, 1):
row_bg = LIGHT_BG if i % 2 == 0 else WHITE
kp = Table([[
Paragraph(f"{i}", ParagraphStyle("kpnum", fontName="Helvetica-Bold", fontSize=14,
textColor=GOLD, alignment=TA_CENTER)),
[Paragraph(title, sH3), Paragraph(text, sBody)]
]], colWidths=[1.2*cm, W-1.2*cm])
kp.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), row_bg),
("BOX",(0,0),(-1,-1), 0.5, GREY_LINE),
("TOPPADDING",(0,0),(-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1), 6),
("LEFTPADDING",(0,0),(-1,-1), 8),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
elems.append(kp)
elems.append(sp(3))
elems.append(sp(12))
elems.append(HRFlowable(width=W, thickness=1.5, color=GOLD, spaceAfter=8))
elems.append(Paragraph(
"Reference: Phillips' Science of Dental Materials, 12th Edition. "
"Anusavice KJ, Shen C, Rawls HR (Eds). Elsevier Saunders.",
sNote))
return elems
# ── Assemble and build ────────────────────────────────────────────────────────
story = []
story += cover()
story += section1()
story += section2()
story += section3()
story += section4()
story += section5()
story += section6()
story += section7()
story += section8()
story += section9()
story += section10()
# Page numbering
def add_page_number(canvas, doc):
canvas.saveState()
canvas.setFont("Helvetica", 8)
canvas.setFillColor(colors.HexColor("#888888"))
page_num = canvas.getPageNumber()
text = f"Dental Casting Defects Reference Guide | Page {page_num}"
canvas.drawCentredString(A4[0]/2, 1.2*cm, text)
# Gold rule
canvas.setStrokeColor(GOLD)
canvas.setLineWidth(1)
canvas.line(2*cm, 1.5*cm, A4[0]-2*cm, 1.5*cm)
canvas.restoreState()
doc.build(story, onFirstPage=add_page_number, onLaterPages=add_page_number)
print(f"PDF generated: {OUTPUT_PATH}")
cd /tmp/workspace/casting-defects && python generate_pdf.py 2>&1
ls -lh /tmp/workspace/casting-defects/Dental_Casting_Defects_Reference_Guide.pdf
Dental Casting Defects Reference Guide
PDF Document · PDF
| Section | Content |
|---|---|
| 1 | Classification of all 6 defect categories with stages of origin |
| 2 | Porosity defects in full detail — localized shrinkage, microporosity, gas, back-pressure, and pinhole porosity |
| 3 | Incomplete castings (short castings) and fins/flash with cause tables |
| 4 | Dimensional inaccuracies — expansion balance concept, oversized vs. undersized casting |
| 5 | Surface defects — rough surfaces, nodules, veins, investment inclusions |
| 6 | Discoloration and contamination — oxidation, copper deposition, pickling guidance |
| 7 | Distortion defects — wax pattern and investment causes |
| 8 | Troubleshooting Quick-Reference Table — 15 defects mapped to causes and immediate fixes |
| 9 | 5-phase Prevention Checklist with checkboxes for each casting step |
| 10 | 10 Key Points Summary with reference citation |