convert this matter into flow chart for methodology and 3 slides for my presentation ;A total of 100 intact human mandibular first molars extracted for periodontal reasons were used for this study. All teeth were free from caries, defects, restoration and cracks and were used in compliance with ethical guidelines of Gazi University Faculty of Dentistry Clinical Research Ethics Committee (ethical protocol no. 2021.19/6). Plaque, attached periodontal tissues and calculus deposits were removed by hand-scaling and then stored in 0.1% thymol solution until use. The bucco-lingual and mesio-distal dimensions of the teeth were measured using a digital caliper (Insize 1112 − 150, Insize, Jiangsu, China). The teeth were divided into five groups so that there was no difference in the oneway analysis of variance (ANOVA) test between buccolingual and mesio-distal widths (p > 0.05) [32, 33]. The materials used in the study and their contents are listed in Table 1. Before preparing the cavities in the teeth, the distance between the cusps was measured using the digital caliper. To prepare a conservative access cavity, digital radiography was used to determine the borders of the access cavity according to the dimensions of the teeth. Then, the canal entrances were confirmed by considering the length of the periodontal probe according to the notches of the periodontal probe on the radiograph. The gingival step of the cavity Table 1 The composition of the materials used in the study Material (CEJ). The conservative mesio-occlusal (MO) endodontic access cavity was applied to all teeth except the control group (intact teeth) using a straight fissure carbide bur (Hicare Medical Co. Ltd., Guangzhou, China) using a highspeed handpiece under water cooling and all Cavo surface margins prepared at 90° with internal line angles rounded. The bur was changed after every five cavity preparations, and cavity dimensions were measured during the preparation using a digital caliper to ensure standardization. Following the endodontic access cavity, the working length was determined using #10 K-files (Shenzhen Perfect Medical Instruments Co. Ltd., Shenzhen, China), and the root canals were instrumented using ProTaper rotary files (Endoart, İstanbul, Turkey) up to sizes F3 with the crowndown method. During instrumentation, the root canals were irrigated with 1 mL of 2.5% NaOCl before each file was introduced into the canal and finally with distilled water. The canals were dried with paper points (Diadent Group International, Almere, the Netherlands) and obturated with gutta-percha cones and an AH Plus sealer (Dentsply De Trey, Konstanz, Germany) using the single cone technique. Excess gutta-percha cones were cut 1 mm apically from the canal orifices with a gutta cutter (C-Blade, Coxo, Guangdong Province, China) and covered with resin-modified glass ionomer cement (Ketac Cem Plus, 3 M, St. Paul, MN, USA). All teeth were examined after root canal treatment using periapical radiography to ensure accurate root canal treatment.To simulate the clinical conditions, each specimen was embedded in a block of self-curing acrylic cylinders at a level of 2.0 mm below the CEJ. The periodontal ligaments were simulated using a base plate wax at a 0.3 mm (Efes Dental, Bursa, Turkey). The distal cavity was determined and standardized according to the distal marginal ridge ness and periapical radiography. On the mesial side, the distance between the gingival margin and the CEJ was prepared at 1 mm. Care was taken to ensure a thickness of approximately 2 mm between the buccal and lingual walls and the interproximal cavity walls using the digital caliper. The buccolingual size of the cavity was 4 mm, and this width was measured above the cavities [34]. Clearfil S3 Bond Universal (Kuraray, Osaka, Japan) was applied using total etch mode with 35% orthophosphoric acid gel (Scotchbond Universal Etchant, 3 M ESPE, St. Paul, MN, USA). Acid gel was applied and left on enamel for 30 s and on dentin for 15 s, before being rinsed with water and gently dried with air to create a moist dentin surface. Clearfil S3 Bond Universal (Kuraray, Osaka, Japan) was applied using a micro-brush for 20 s and light-cured for 10 s with an LED light curing unit (D-Light Pro, GC, Leuven, Belgium). Upon completion of root canal treatment, the restorative steps for each group were as follows (Figs. 1 and 2): ● Group 1 (positive control group): Intact teeth without any cavity preparation were used as the positive control. ● Group 2 (negative control group): The mesial endodontic access was prepared, and coronal restoration was not applied. ● Group 3: A 4 mm glass fiber post (Cytec Blanco, Hannerkratt, Germany) was cut with a diamond fissure bur. The post was then fixed to the buccal and lingual walls of the cavity with a flowable resin composite (Filtek Ultimate Flowable, 3 M Espe, St. Paul, MN, USA). For this purpose, a flowable resin composite was applied to both ends of the post and adapted to the buccal and lingual cavity walls in the middle one-third of the cavity. The overflowing flowable resin composite was removed using a sond. Then, the flowable resin composite was polymerized at the connection points of the post with the cavity using an LED light device for 20 s. Then, bulk-fill resin composite (Filtek One Bulk Fill Restorative, FOB; 3 M ESPE, St. Paul, MN, USA) was applied in 4-mm layers for the restoration of the entire cavity and polymerized on the occlusal, buccal and lingual sides for 10 s using an LED Light Device. ● Group 4: A 4-mm thick fiber-reinforced composite (EverX Posterior, EXP; GC, Tokyo, Japan) was applied to the first half of the cavity and polymerized with an LED light device for 20 s. Then, a 4-mm thick bulk-fill resin composite (Filtek One Bulk Fill Restorative, FOB; 3 M ESPE, St. Paul, MN, USA) was applied to the upper part of EverX Posterior, and the restoration was completed by polymerizing the occlusal, buccal and lingual sides for 10 s using an LED Light Device from. ● Group 5: Coronal restoration completed with FOB using the bulk technique. The preparation and restoration of all specimens were performed by the same operator. Teeth were stored in distilled water for 24 h at 37 °C to prevent dehydration of the teeth and complete the post polymerization. They were then thermocycled at 5 °C and 55 °C for 10,000 cycles with a 30-s dwell time (MTE-101, MOD Dental, Ankara, Turkey).To determine fracture resistance, a 5 mm stainless steel spherical tip mounted on a universal testing machine (Shimadzu IG-IS, Tokyo, Japan) and a 45° oblique compressive load were applied to the central fossa of the teeth at a crosshead speed of 1 mm/min until a fracture occurred. The maximum load before fracture was recorded in Newtons (N). The fractured specimens were examined by two different operators, indicating the fracture mode as restorable (fracture above the CEJ or within 1 mm apical to the CEJ
ls /home/daytona/workspace/ 2>/dev/null || mkdir -p /home/daytona/workspace/
mkdir -p /home/daytona/workspace/molar-study-pptx
~/molar-study-pptx/build.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Fracture Resistance of Mandibular Molars – Methodology";
// ─────────────────────────────────────────────────────────────────────────────
// COLOUR PALETTE
// Primary dark navy: 0D1B2A
// Mid blue: 1B4F72
// Accent teal: 1A8C8C
// Light silver: E8EEF4
// White: FFFFFF
// Warm accent: E67E22
// ─────────────────────────────────────────────────────────────────────────────
const NAVY = "0D1B2A";
const BLUE = "1B4F72";
const TEAL = "1A8C8C";
const SILVER = "E8EEF4";
const WHITE = "FFFFFF";
const ORANGE = "E67E22";
const LGRAY = "B0BEC5";
// ─────────────────────────────────────────────────────────────────────────────
// HELPER: draw a flowchart box with centred text + downward arrow beneath
// ─────────────────────────────────────────────────────────────────────────────
function addBox(slide, text, x, y, w, h, opts = {}) {
const fill = opts.fill || TEAL;
const color = opts.color || WHITE;
const fSize = opts.fSize || 10;
const bold = opts.bold !== undefined ? opts.bold : false;
const shape = opts.shape || "rect";
slide.addShape(pres.ShapeType[shape] || pres.ShapeType.rect, {
x, y, w, h,
fill: { color: fill },
line: { color: WHITE, width: 0.5 },
shadow: { type: "outer", blur: 3, offset: 1, angle: 45, color: "000000", opacity: 0.2 }
});
slide.addText(text, {
x, y, w, h,
fontSize: fSize, color, bold,
align: "center", valign: "middle",
wrap: true, margin: 4
});
}
function addArrow(slide, x, y, len) {
slide.addShape(pres.ShapeType.line, {
x: x, y: y, w: 0.001, h: len,
line: { color: ORANGE, width: 1.5, endArrowType: "triangle" }
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 1 – METHODOLOGY FLOWCHART
// ─────────────────────────────────────────────────────────────────────────────
{
const sl = pres.addSlide();
// Background
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: NAVY } });
// Title bar
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.55, fill: { color: BLUE } });
sl.addText("METHODOLOGY FLOWCHART", {
x: 0, y: 0, w: 10, h: 0.55,
fontSize: 16, bold: true, color: WHITE, align: "center", valign: "middle", charSpacing: 3
});
// Layout: single central column of boxes
// Boxes are 3.6" wide, centred at x=3.2, stepping down
const bx = 3.2;
const bw = 3.6;
const bh = 0.42;
const gap = 0.13; // arrow gap
const step = bh + gap + 0.13; // total step
const steps = [
{ text: "100 Intact Human Mandibular First Molars\n(Extracted for periodontal reasons)", fill: "1B4F72", fSize: 9, bold: true, h: 0.52 },
{ text: "Cleaning: Hand-scaling → 0.1% thymol storage", fSize: 9 },
{ text: "Tooth Measurement & ANOVA-based Group Assignment (n=5 groups)", fSize: 9 },
{ text: "Conservative MO Endodontic Access Cavity\n(Digital radiography + straight fissure carbide bur)", fSize: 9, h: 0.52 },
{ text: "Root Canal Treatment\n(ProTaper F3, crown-down | NaOCl irrigation | Gutta-percha + AH Plus)", fSize: 9, h: 0.52 },
{ text: "Specimen Mounting\n(Acrylic cylinder, 2 mm below CEJ; wax PDL simulation 0.3 mm)", fSize: 9, h: 0.52 },
{ text: "Restorative Protocol per Group (Groups 1–5)", fill: ORANGE, fSize: 9, bold: true, color: NAVY },
{ text: "Thermocycling: 10,000 cycles | 5 °C ↔ 55 °C | 37 °C / 24 h storage", fSize: 9 },
{ text: "Fracture Resistance Test\n(45° oblique load, 1 mm/min, Universal Testing Machine)", fSize: 9, h: 0.52, fill: "1B4F72", bold: true },
{ text: "Fracture Mode Classification\n(Restorable vs. Non-restorable)", fSize: 9 },
];
let cy = 0.65;
steps.forEach((s, i) => {
const bH = s.h || bh;
addBox(sl, s.text, bx, cy, bw, bH, {
fill: s.fill || TEAL,
color: s.color || WHITE,
fSize: s.fSize || 10,
bold: s.bold || false
});
cy += bH;
if (i < steps.length - 1) {
addArrow(sl, bx + bw / 2, cy, gap + 0.06);
cy += gap + 0.13;
}
});
// Side label: Groups
const groupY = 0.65 + (bh+gap+0.13)*6 + 0.05;
const groups = [
{ label: "Gp 1", desc: "Positive control (intact)" },
{ label: "Gp 2", desc: "Negative control (no restoration)" },
{ label: "Gp 3", desc: "Glass fiber post + FOB" },
{ label: "Gp 4", desc: "EverX Posterior + FOB" },
{ label: "Gp 5", desc: "FOB bulk technique" },
];
// Left side panel
sl.addShape(pres.ShapeType.rect, { x: 0.08, y: groupY - 0.05, w: 2.9, h: 1.8, fill: { color: "0A2A3A" }, line: { color: TEAL, width: 0.8 } });
sl.addText("STUDY GROUPS", { x: 0.08, y: groupY - 0.05, w: 2.9, h: 0.28, fontSize: 8, bold: true, color: ORANGE, align: "center", valign: "middle" });
groups.forEach((g, i) => {
sl.addShape(pres.ShapeType.rect, { x: 0.15, y: groupY + 0.26 + i * 0.28, w: 0.44, h: 0.22, fill: { color: TEAL } });
sl.addText(g.label, { x: 0.15, y: groupY + 0.26 + i * 0.28, w: 0.44, h: 0.22, fontSize: 7.5, bold: true, color: WHITE, align: "center", valign: "middle" });
sl.addText(g.desc, { x: 0.64, y: groupY + 0.26 + i * 0.28, w: 2.25, h: 0.22, fontSize: 7.5, color: SILVER, valign: "middle" });
});
// Connector line from Gp box to main flow
sl.addShape(pres.ShapeType.line, {
x: 3.2, y: groupY + 0.4, w: -0.22, h: 0,
line: { color: ORANGE, width: 0.8, dashType: "dash" }
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 2 – STUDY DESIGN & SPECIMEN PREPARATION
// ─────────────────────────────────────────────────────────────────────────────
{
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: NAVY } });
// Top accent bar
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.08, fill: { color: ORANGE } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0.08, w: 10, h: 0.52, fill: { color: BLUE } });
sl.addText("STUDY DESIGN & SPECIMEN PREPARATION", {
x: 0, y: 0.08, w: 10, h: 0.52,
fontSize: 17, bold: true, color: WHITE, align: "center", valign: "middle", charSpacing: 2
});
// Slide number
sl.addText("02", { x: 9.5, y: 0.1, w: 0.45, h: 0.3, fontSize: 9, color: ORANGE, bold: true, align: "right" });
// ── Left column: Sample & Ethics card ──
const cards = [
{
title: "Sample",
icon: "🦷",
items: [
"n = 100 mandibular first molars",
"Extracted for periodontal reasons",
"Caries-free, no restorations or cracks",
"Ethics: Gazi University CREC #2021.19/6",
]
},
{
title: "Cleaning & Storage",
icon: "🧼",
items: [
"Hand-scaling: plaque, calculus, periodontal tissue removed",
"Stored in 0.1% thymol solution",
"Bucco-lingual & mesio-distal dimensions measured (digital caliper)",
"Groups balanced by ANOVA (p > 0.05)",
]
},
{
title: "Cavity Preparation",
icon: "🔬",
items: [
"Digital radiography to define access cavity borders",
"Conservative MO endodontic access cavity",
"Straight fissure carbide bur, high-speed, water cooling",
"Cavo-surface margins at 90°; bur changed every 5 preps",
]
},
];
const cardW = 2.95;
const cardH = 2.05;
const cardY = 0.75;
cards.forEach((c, i) => {
const cx = 0.15 + i * (cardW + 0.1);
// Card bg
sl.addShape(pres.ShapeType.rect, { x: cx, y: cardY, w: cardW, h: cardH, fill: { color: BLUE }, line: { color: TEAL, width: 0.6 }, rounding: 0.08 });
// Title strip
sl.addShape(pres.ShapeType.rect, { x: cx, y: cardY, w: cardW, h: 0.34, fill: { color: TEAL }, rounding: 0.08 });
sl.addText(`${c.icon} ${c.title}`, { x: cx, y: cardY, w: cardW, h: 0.34, fontSize: 10, bold: true, color: WHITE, align: "center", valign: "middle" });
// Bullets
const bulletItems = c.items.map((t, j) => ({
text: t,
options: { bullet: { code: "2022" }, color: SILVER, fontSize: 8.5, breakLine: j < c.items.length - 1 }
}));
sl.addText(bulletItems, { x: cx + 0.1, y: cardY + 0.38, w: cardW - 0.2, h: cardH - 0.44, valign: "top", wrap: true });
});
// ── Bottom row: Root Canal Treatment ──
const rctY = 2.95;
sl.addShape(pres.ShapeType.rect, { x: 0.15, y: rctY, w: 9.7, h: 0.3, fill: { color: TEAL } });
sl.addText("ROOT CANAL TREATMENT", { x: 0.15, y: rctY, w: 9.7, h: 0.3, fontSize: 10, bold: true, color: WHITE, align: "center", valign: "middle", charSpacing: 1 });
const rctItems = [
{ icon: "📏", text: "WL: #10 K-files" },
{ icon: "🔩", text: "ProTaper F3\nCrown-down" },
{ icon: "💧", text: "1 mL 2.5% NaOCl\n+ distilled water" },
{ icon: "🧻", text: "Paper point\ndrying" },
{ icon: "📌", text: "Gutta-percha\n+ AH Plus sealer" },
{ icon: "🪨", text: "RMGIC (Ketac Cem)\nover orifices" },
{ icon: "📷", text: "Periapical X-ray\nverification" },
];
const iw = 9.7 / rctItems.length;
rctItems.forEach((item, i) => {
const ix = 0.15 + i * iw;
sl.addShape(pres.ShapeType.rect, { x: ix, y: rctY + 0.3, w: iw, h: 0.88, fill: { color: i % 2 === 0 ? "0A2A3A" : "0E3349" } });
sl.addText(item.icon, { x: ix, y: rctY + 0.34, w: iw, h: 0.28, fontSize: 14, align: "center" });
sl.addText(item.text, { x: ix, y: rctY + 0.62, w: iw, h: 0.52, fontSize: 7.5, color: SILVER, align: "center", valign: "top", wrap: true });
});
// Specimen mounting
sl.addShape(pres.ShapeType.rect, { x: 0.15, y: rctY + 1.25, w: 9.7, h: 0.98, fill: { color: "0A2A3A" }, line: { color: ORANGE, width: 0.6 } });
sl.addText("SPECIMEN MOUNTING & SIMULATION", { x: 0.15, y: rctY + 1.25, w: 9.7, h: 0.28, fontSize: 10, bold: true, color: ORANGE, align: "center", valign: "middle" });
const mountItems = [
"Self-curing acrylic cylinders | 2 mm below CEJ",
"Periodontal ligament simulated with base-plate wax (0.3 mm)",
"Distal cavity standardised per marginal ridge & radiography",
"Mesial gingival margin 1 mm from CEJ | Buccolingual cavity width: 4 mm",
];
sl.addText(
mountItems.map((t, i) => ({ text: t, options: { bullet: { code: "25B8" }, color: SILVER, fontSize: 8.5, breakLine: i < mountItems.length - 1 } })),
{ x: 0.35, y: rctY + 1.55, w: 9.4, h: 0.6, valign: "top", wrap: true }
);
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 3 – RESTORATIVE GROUPS
// ─────────────────────────────────────────────────────────────────────────────
{
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: NAVY } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.08, fill: { color: TEAL } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0.08, w: 10, h: 0.52, fill: { color: BLUE } });
sl.addText("RESTORATIVE GROUPS & BONDING PROTOCOL", {
x: 0, y: 0.08, w: 10, h: 0.52,
fontSize: 17, bold: true, color: WHITE, align: "center", valign: "middle", charSpacing: 2
});
sl.addText("03", { x: 9.5, y: 0.1, w: 0.45, h: 0.3, fontSize: 9, color: TEAL, bold: true, align: "right" });
// Bonding strip
sl.addShape(pres.ShapeType.rect, { x: 0.15, y: 0.72, w: 9.7, h: 0.62, fill: { color: "0A2A3A" }, line: { color: ORANGE, width: 0.6 } });
sl.addText("BONDING PROTOCOL (All restored groups)", { x: 0.15, y: 0.72, w: 9.7, h: 0.22, fontSize: 9, bold: true, color: ORANGE, align: "center", valign: "middle" });
const bondingSteps = "35% H₃PO₄ etch (enamel 30 s / dentin 15 s) → Rinse & moist dentin → Clearfil S3 Bond Universal (micro-brush 20 s) → LED cure 10 s";
sl.addText(bondingSteps, { x: 0.3, y: 0.94, w: 9.4, h: 0.34, fontSize: 8.5, color: SILVER, align: "center", valign: "middle" });
// Group cards
const groups = [
{
num: "1",
tag: "Positive Control",
color: "2E7D32",
desc: "Intact teeth — no cavity, no restoration.\nBaseline fracture strength reference."
},
{
num: "2",
tag: "Negative Control",
color: "C62828",
desc: "MO endodontic access cavity.\nNo coronal restoration applied."
},
{
num: "3",
tag: "Glass Fiber Post + FOB",
color: TEAL,
desc: "4 mm glass fiber post fixed with flowable resin composite to buccal/lingual walls (middle ⅓).\nCavity restored with Filtek One Bulk Fill (4 mm layers, 10 s LED cure)."
},
{
num: "4",
tag: "EverX Posterior + FOB",
color: ORANGE,
desc: "4 mm EverX Posterior FRC base (LED 20 s).\nTop layer: 4 mm Filtek One Bulk Fill (LED 10 s occlusal/buccal/lingual)."
},
{
num: "5",
tag: "FOB Bulk Technique",
color: BLUE,
desc: "Entire cavity restored with Filtek One Bulk Fill Restorative using bulk technique.\nPolymerised occlusal, buccal and lingual surfaces (10 s each)."
},
];
const gw = 1.85;
const gh = 2.95;
const gy = 1.42;
groups.forEach((g, i) => {
const gx = 0.15 + i * (gw + 0.08);
sl.addShape(pres.ShapeType.rect, { x: gx, y: gy, w: gw, h: gh, fill: { color: "0D2237" }, line: { color: g.color, width: 1.2 } });
// Coloured header
sl.addShape(pres.ShapeType.rect, { x: gx, y: gy, w: gw, h: 0.52, fill: { color: g.color } });
sl.addText(`GROUP ${g.num}`, { x: gx, y: gy, w: gw, h: 0.26, fontSize: 11, bold: true, color: WHITE, align: "center", valign: "middle" });
sl.addText(g.tag, { x: gx, y: gy + 0.26, w: gw, h: 0.26, fontSize: 8, color: WHITE, align: "center", valign: "middle", italic: true });
// Description
sl.addText(g.desc, { x: gx + 0.08, y: gy + 0.58, w: gw - 0.16, h: gh - 0.68, fontSize: 8, color: SILVER, valign: "top", wrap: true });
});
// Bottom footnote
sl.addShape(pres.ShapeType.rect, { x: 0, y: 5.32, w: 10, h: 0.3, fill: { color: "060F18" } });
sl.addText("Storage: 37 °C distilled water 24 h | Thermocycling: 10,000 cycles (5 °C ↔ 55 °C, 30 s dwell) | Same operator for all preparations", {
x: 0, y: 5.32, w: 10, h: 0.3, fontSize: 7.5, color: LGRAY, align: "center", valign: "middle"
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 4 – FRACTURE RESISTANCE TESTING
// ─────────────────────────────────────────────────────────────────────────────
{
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: NAVY } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.08, fill: { color: ORANGE } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0.08, w: 10, h: 0.52, fill: { color: BLUE } });
sl.addText("FRACTURE RESISTANCE TESTING & OUTCOME MEASURES", {
x: 0, y: 0.08, w: 10, h: 0.52,
fontSize: 15, bold: true, color: WHITE, align: "center", valign: "middle", charSpacing: 2
});
sl.addText("04", { x: 9.5, y: 0.1, w: 0.45, h: 0.3, fontSize: 9, color: ORANGE, bold: true, align: "right" });
// Testing setup card
sl.addShape(pres.ShapeType.rect, { x: 0.15, y: 0.75, w: 4.6, h: 2.4, fill: { color: BLUE }, line: { color: TEAL, width: 0.8 } });
sl.addShape(pres.ShapeType.rect, { x: 0.15, y: 0.75, w: 4.6, h: 0.32, fill: { color: TEAL } });
sl.addText("⚙️ TESTING SETUP", { x: 0.15, y: 0.75, w: 4.6, h: 0.32, fontSize: 10, bold: true, color: WHITE, align: "center", valign: "middle" });
const setupItems = [
"Universal Testing Machine: Shimadzu IG-IS (Tokyo, Japan)",
"Indenter: 5 mm stainless steel spherical tip",
"Load direction: 45° oblique compressive load",
"Application site: central fossa of each tooth",
"Crosshead speed: 1 mm / min",
"Endpoint: fracture occurrence",
"Recorded value: maximum load in Newtons (N)",
];
sl.addText(
setupItems.map((t, i) => ({ text: t, options: { bullet: { code: "25CF" }, color: SILVER, fontSize: 8.5, breakLine: i < setupItems.length - 1 } })),
{ x: 0.3, y: 1.12, w: 4.3, h: 1.95, valign: "top", wrap: true }
);
// Fracture classification card
sl.addShape(pres.ShapeType.rect, { x: 5.1, y: 0.75, w: 4.75, h: 2.4, fill: { color: BLUE }, line: { color: ORANGE, width: 0.8 } });
sl.addShape(pres.ShapeType.rect, { x: 5.1, y: 0.75, w: 4.75, h: 0.32, fill: { color: ORANGE } });
sl.addText("🔍 FRACTURE CLASSIFICATION", { x: 5.1, y: 0.75, w: 4.75, h: 0.32, fontSize: 10, bold: true, color: NAVY, align: "center", valign: "middle" });
// Restorable box
sl.addShape(pres.ShapeType.rect, { x: 5.25, y: 1.15, w: 2.0, h: 0.82, fill: { color: "1A5C1A" }, line: { color: "2ECC71", width: 0.6 } });
sl.addText("✅ RESTORABLE", { x: 5.25, y: 1.15, w: 2.0, h: 0.28, fontSize: 8.5, bold: true, color: "2ECC71", align: "center", valign: "middle" });
sl.addText("Fracture at or above CEJ\nor ≤1 mm apical to CEJ", { x: 5.25, y: 1.43, w: 2.0, h: 0.52, fontSize: 7.5, color: SILVER, align: "center", valign: "top", wrap: true });
// Non-restorable box
sl.addShape(pres.ShapeType.rect, { x: 7.55, y: 1.15, w: 2.15, h: 0.82, fill: { color: "5C1A1A" }, line: { color: "E74C3C", width: 0.6 } });
sl.addText("❌ NON-RESTORABLE", { x: 7.55, y: 1.15, w: 2.15, h: 0.28, fontSize: 8.5, bold: true, color: "E74C3C", align: "center", valign: "middle" });
sl.addText("Fracture >1 mm apical\nto CEJ", { x: 7.55, y: 1.43, w: 2.15, h: 0.52, fontSize: 7.5, color: SILVER, align: "center", valign: "top", wrap: true });
sl.addText("Evaluated independently by TWO operators", {
x: 5.25, y: 2.05, w: 4.45, h: 0.3, fontSize: 8, color: LGRAY, align: "center", valign: "middle", italic: true
});
sl.addText("Fracture modes recorded and cross-verified for consistency", {
x: 5.25, y: 2.35, w: 4.45, h: 0.3, fontSize: 8, color: LGRAY, align: "center", valign: "middle", italic: true
});
// Statistical flow box
sl.addShape(pres.ShapeType.rect, { x: 0.15, y: 3.28, w: 9.7, h: 1.6, fill: { color: "0A2A3A" }, line: { color: TEAL, width: 0.8 } });
sl.addShape(pres.ShapeType.rect, { x: 0.15, y: 3.28, w: 9.7, h: 0.3, fill: { color: TEAL } });
sl.addText("📊 STATISTICAL ANALYSIS PIPELINE", { x: 0.15, y: 3.28, w: 9.7, h: 0.3, fontSize: 10, bold: true, color: WHITE, align: "center", valign: "middle" });
const statBoxes = [
{ label: "Normality\nCheck", sub: "Shapiro-Wilk" },
{ label: "Homogeneity\nof Variance", sub: "Levene's Test" },
{ label: "Group\nComparison", sub: "One-way ANOVA" },
{ label: "Post-hoc\nPairwise", sub: "Tukey HSD" },
{ label: "Fracture Mode\nAssociation", sub: "Chi-square Test" },
];
const sbw = 1.7;
const sbh = 0.92;
const sby = 3.65;
statBoxes.forEach((sb, i) => {
const sbx = 0.28 + i * (sbw + 0.2);
sl.addShape(pres.ShapeType.rect, { x: sbx, y: sby, w: sbw, h: sbh, fill: { color: BLUE }, line: { color: TEAL, width: 0.5 } });
sl.addText(sb.label, { x: sbx, y: sby + 0.06, w: sbw, h: 0.44, fontSize: 8.5, bold: true, color: WHITE, align: "center", valign: "middle", wrap: true });
sl.addText(sb.sub, { x: sbx, y: sby + 0.52, w: sbw, h: 0.32, fontSize: 7.5, color: ORANGE, align: "center", valign: "middle", italic: true });
if (i < statBoxes.length - 1) {
sl.addShape(pres.ShapeType.line, {
x: sbx + sbw, y: sby + sbh / 2, w: 0.2, h: 0,
line: { color: ORANGE, width: 1, endArrowType: "triangle" }
});
}
});
// Footnote
sl.addShape(pres.ShapeType.rect, { x: 0, y: 5.32, w: 10, h: 0.3, fill: { color: "060F18" } });
sl.addText("Significance level: p < 0.05 for all tests | All procedures by the same trained operator", {
x: 0, y: 5.32, w: 10, h: 0.3, fontSize: 7.5, color: LGRAY, align: "center", valign: "middle"
});
}
// ─────────────────────────────────────────────────────────────────────────────
// WRITE FILE
// ─────────────────────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/molar-study-pptx/Methodology_Presentation.pptx" })
.then(() => console.log("DONE"))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/molar-study-pptx && node build.js 2>&1
ls -lh /home/daytona/workspace/molar-study-pptx/
Methodology Presentation
Presentation · PPTX
Add clinical images or reference images to the methodology slides
mandibular first molar endodontic access cavity preparation clinical photo
ProTaper rotary file root canal instrumentation clinical image
bulk fill composite resin restoration molar clinical photograph
universal testing machine tooth fracture resistance dental research
gutta percha single cone obturation root canal filling clinical
mkdir -p /home/daytona/workspace/molar-study-pptx/images && cd /home/daytona/workspace/molar-study-pptx/images # Image 1: mandibular molar access cavity (ResearchGate) curl -sL "https://www.researchgate.net/publication/303669086/figure/fig2/AS:411363479441409@1475088104326/a-Clinical-view-of-the-access-cavity-preparation-showing-seven-distinct-root-canal.png" -o access_cavity.png && echo "access_cavity: $(file access_cavity.png | head -c80)" # Image 2: Access cavity designs multi-tooth curl -sL "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-37k6PbiDmiEdAA2llBCj5ROywSHRZ35_OYQc3mjFbw3KYADOjXPVbRHmsYen0bgEwiN3itjopdxZ-8_hfFHSLxisRp-TUHgsfGlsV997_4qHWhekRuJTnOINzovR4KUMCoxsgcS_W1gVTKe0avRs7sPdTbTRtmBUsGHwfoZNRu-wkD2bnQ_QPwgrxcFu/s883/access-cavity-designs-different-teeth-endodontics.webp" -o access_designs.webp && echo "access_designs: $(file access_designs.webp | head -c80)" # Image 3: ProTaper files curl -sL "https://www.endoruddle.com/img/f/960/540/files/inventions/PTG-SeriesImage.jpg" -o protaper_files.jpg && echo "protaper: $(file protaper_files.jpg | head -c80)" # Image 4: Bulk-fill restoration molar curl -sL "https://www.researchgate.net/publication/385211971/figure/fig4/AS:11431281285985323@1729822461914/A-representative-case-showing-lower-first-molar-restored-with-Bulk-Fill-Resin-Composite_Q320.jpg" -o bulkfill_molar.jpg && echo "bulkfill: $(file bulkfill_molar.jpg | head -c80)" # Image 5: UTM fracture resistance test curl -sL "https://www.researchgate.net/publication/392156649/figure/fig3/AS:11431281470474689@1748425651439/Fracture-resistance-test-on-a-universal-testing-machine_Q320.jpg" -o utm_test.jpg && echo "utm: $(file utm_test.jpg | head -c80)" # Image 6: Gutta percha obturation curl -sL "https://www.dentaltix.com/en/sites/default/files/process-of-obturation-gutta-percha.jpg" -o guttapercha.jpg && echo "guttapercha: $(file guttapercha.jpg | head -c80)" # Image 7: Filtek One product shot curl -sL "https://assets.solventum.com/is/image/mmmspinco/filtek-one-bulk-fill-restorative-pdp-module-3-2-ds-rps" -o filtek_one.jpg && echo "filtek: $(file filtek_one.jpg | head -c80)" ls -lh
cd /home/daytona/workspace/molar-study-pptx/images # Convert webp to jpg convert access_designs.webp access_designs.jpg 2>/dev/null && echo "converted webp ok" || echo "convert failed" # Try alternate UTM image (semanticscholar) curl -sL "https://figures.semanticscholar.org/b4320241b6f5929e631684a37b11cb8d4e7f08dc/2-Figure2-1.png" -o utm_test2.png && echo "utm2: $(file utm_test2.png | head -c60)" # Try alternate access cavity from semanticscholar curl -sL "https://figures.semanticscholar.org/505377600ca8aac9129558df9b3090337cfca60a/3-Figure3-1.png" -o access_cavity2.png && echo "access2: $(file access_cavity2.png | head -c60)" # Try alternate bulk fill from springer nature curl -sL "https://media.springernature.com/lw1200/springer-static/image/art%3A10.1038%2Fs41598-022-07965-z/MediaObjects/41598_2022_7965_Fig1_HTML.jpg" -o bulkfill2.jpg && echo "bulkfill2: $(file bulkfill2.jpg | head -c60)" # Try gutta percha from mdpi (open access) curl -sL "https://www.mdpi.com/dentistry/dentistry-11-00200/article_deploy/html/images/dentistry-11-00200-g003-550.jpg" -o guttapercha2.jpg && echo "gp2: $(file guttapercha2.jpg | head -c60)" # Try UTM from nature.com open access figure curl -sL "https://media.springernature.com/lw685/springer-static/image/art%3A10.1038%2Fs41598-025-17036-8/MediaObjects/41598_2025_17036_Fig3_HTML.png" -o utm_nature.png && echo "utm_nature: $(file utm_nature.png | head -c60)" ls -lh
cd /home/daytona/workspace/molar-study-pptx/images # Convert webp using Python Pillow python3 -c " from PIL import Image img = Image.open('access_designs.webp') img.save('access_designs.jpg', 'JPEG', quality=85) print('webp->jpg ok, size:', img.size) " # Try gutta-percha from deardoctor (open) curl -sL "https://www.deardoctor.com/images/pages/root-canal-treatment/filling.jpg" -o guttapercha3.jpg && echo "gp3: $(file guttapercha3.jpg | head -c60)" # Try a gutta percha from mdpi (medicina journal, open access) curl -sL "https://www.mdpi.com/medicina/medicina-61-00465/article_deploy/html/images/medicina-61-00465-g002.png" -o guttapercha_mdpi.png && echo "gpmdpi: $(file guttapercha_mdpi.png | head -c60)" ls -lh *.jpg *.png 2>/dev/null | grep -v "17 Jun\|118 Jun\|505 Jun\|17 Jun"
node /home/daytona/skills/shared/scripts/fetch_images.js \ "file:///home/daytona/workspace/molar-study-pptx/images/access_designs.jpg" \ "file:///home/daytona/workspace/molar-study-pptx/images/access_cavity2.png" \ "file:///home/daytona/workspace/molar-study-pptx/images/protaper_files.jpg" \ "file:///home/daytona/workspace/molar-study-pptx/images/guttapercha3.jpg" \ "file:///home/daytona/workspace/molar-study-pptx/images/bulkfill2.jpg" \ "file:///home/daytona/workspace/molar-study-pptx/images/filtek_one.jpg" \ "file:///home/daytona/workspace/molar-study-pptx/images/utm_nature.png" \ 2>&1 | head -5 # Just check if script handles file:// or needs http
~/molar-study-pptx/build_with_images.js
const pptxgen = require("pptxgenjs");
const fs = require("fs");
const path = require("path");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Fracture Resistance of Mandibular Molars – Methodology";
// ─── COLOURS ───────────────────────────────────────────────────────────────
const NAVY = "0D1B2A";
const BLUE = "1B4F72";
const TEAL = "1A8C8C";
const SILVER = "E8EEF4";
const WHITE = "FFFFFF";
const ORANGE = "E67E22";
const LGRAY = "B0BEC5";
// ─── IMAGE LOADER ──────────────────────────────────────────────────────────
const IMGDIR = "/home/daytona/workspace/molar-study-pptx/images";
function loadImg(filename) {
const p = path.join(IMGDIR, filename);
if (!fs.existsSync(p)) return null;
const ext = path.extname(filename).toLowerCase().replace(".", "");
const mimeMap = { jpg: "image/jpeg", jpeg: "image/jpeg", png: "image/png", webp: "image/webp" };
const mime = mimeMap[ext] || "image/jpeg";
const data = fs.readFileSync(p).toString("base64");
return `${mime};base64,${data}`;
}
const IMG = {
accessDesigns: loadImg("access_designs.jpg"), // access cavity designs
accessCavity: loadImg("access_cavity2.png"), // clinical access cavity photo
protaper: loadImg("protaper_files.jpg"), // ProTaper file set
guttapercha: loadImg("guttapercha3.jpg"), // gutta-percha obturation
bulkfill: loadImg("bulkfill2.jpg"), // bulk-fill restoration
filtekOne: loadImg("filtek_one.jpg"), // Filtek One product
utmTest: loadImg("utm_nature.png"), // UTM fracture testing
};
// ─── HELPERS ───────────────────────────────────────────────────────────────
function addBox(slide, text, x, y, w, h, opts = {}) {
const fill = opts.fill || TEAL;
const color = opts.color || WHITE;
const fSize = opts.fSize || 10;
const bold = opts.bold !== undefined ? opts.bold : false;
slide.addShape(pres.ShapeType.rect, {
x, y, w, h,
fill: { color: fill },
line: { color: WHITE, width: 0.5 },
shadow: { type: "outer", blur: 3, offset: 1, angle: 45, color: "000000", opacity: 0.2 }
});
slide.addText(text, { x, y, w, h, fontSize: fSize, color, bold, align: "center", valign: "middle", wrap: true, margin: 4 });
}
function addArrow(slide, x, y, len) {
slide.addShape(pres.ShapeType.line, {
x, y, w: 0.001, h: len,
line: { color: ORANGE, width: 1.5, endArrowType: "triangle" }
});
}
function addImgBox(slide, imgData, x, y, w, h, caption) {
if (!imgData) return;
// White-bordered frame
slide.addShape(pres.ShapeType.rect, { x: x - 0.04, y: y - 0.04, w: w + 0.08, h: h + 0.28, fill: { color: "0A2A3A" }, line: { color: TEAL, width: 0.8 } });
slide.addImage({ data: imgData, x, y, w, h, sizing: { type: "contain", w, h } });
if (caption) {
slide.addText(caption, {
x: x - 0.04, y: y + h, w: w + 0.08, h: 0.22,
fontSize: 6.5, color: LGRAY, align: "center", valign: "middle", italic: true
});
}
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 1 – METHODOLOGY FLOWCHART
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: NAVY } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.55, fill: { color: BLUE } });
sl.addText("METHODOLOGY FLOWCHART", {
x: 0, y: 0, w: 10, h: 0.55, fontSize: 16, bold: true, color: WHITE, align: "center", valign: "middle", charSpacing: 3
});
// ── Central flowchart column (narrowed to leave room for images)
const bx = 2.9, bw = 3.8, bh = 0.415, gap = 0.105;
const step = bh + gap + 0.1;
const steps = [
{ text: "100 Intact Mandibular First Molars\n(Extracted for periodontal reasons)", fill: "1B4F72", fSize: 8.5, bold: true, h: 0.5 },
{ text: "Cleaning: Hand-scaling → 0.1% thymol storage", fSize: 8.5 },
{ text: "Dimension Measurement & ANOVA-based Group Assignment", fSize: 8.5 },
{ text: "Conservative MO Endodontic Access Cavity\n(Digital XR + fissure carbide bur, 90° margins)", fSize: 8.5, h: 0.5 },
{ text: "Root Canal Treatment\n(ProTaper F3 crown-down | NaOCl | GP + AH Plus sealer)", fSize: 8.5, h: 0.5 },
{ text: "Specimen Mounting\n(Acrylic cylinder 2 mm below CEJ | Wax PDL 0.3 mm)", fSize: 8.5, h: 0.5 },
{ text: "Restorative Protocol — Groups 1–5", fill: ORANGE, fSize: 8.5, bold: true, color: NAVY },
{ text: "Storage 37 °C / 24 h + Thermocycling 10,000 cycles", fSize: 8.5 },
{ text: "Fracture Resistance Test\n(45° oblique | UTM | 1 mm/min)", fSize: 8.5, h: 0.5, fill: "1B4F72", bold: true },
{ text: "Fracture Mode Classification\n(Restorable vs. Non-restorable)", fSize: 8.5, h: 0.5 },
];
let cy = 0.65;
steps.forEach((s, i) => {
const bH = s.h || bh;
addBox(sl, s.text, bx, cy, bw, bH, { fill: s.fill || TEAL, color: s.color || WHITE, fSize: s.fSize || 10, bold: s.bold || false });
cy += bH;
if (i < steps.length - 1) { addArrow(sl, bx + bw / 2, cy, gap + 0.03); cy += gap + 0.1; }
});
// ── Left image column ──────────────────────────────────────────────────
// Image 1: access cavity designs aligned with step 4 (cavity prep)
if (IMG.accessDesigns) {
// Step 4 starts at: 0.65 + 3*step (approx)
const imgY = 0.65 + (0.5+gap+0.1)*3 + (bh+gap+0.1)*0;
addImgBox(sl, IMG.accessDesigns, 0.1, 0.68, 2.65, 2.1, "Access cavity design reference");
}
// Image 2: access cavity clinical photo aligned with root canal area
if (IMG.accessCavity) {
addImgBox(sl, IMG.accessCavity, 0.1, 2.95, 2.65, 2.26, "Clinical access cavity – mandibular molar");
}
// ── Right image column ─────────────────────────────────────────────────
// ProTaper files
if (IMG.protaper) {
addImgBox(sl, IMG.protaper, 6.82, 0.68, 3.1, 1.7, "ProTaper rotary file system");
}
// Gutta-percha obturation
if (IMG.guttapercha) {
addImgBox(sl, IMG.guttapercha, 6.82, 2.55, 3.1, 1.65, "Gutta-percha single-cone obturation");
}
// Groups side legend
const groups = [
{ label: "Gp 1", desc: "Positive control (intact)", color: "2E7D32" },
{ label: "Gp 2", desc: "Negative control (no restoration)", color: "C62828" },
{ label: "Gp 3", desc: "Glass fiber post + FOB", color: TEAL },
{ label: "Gp 4", desc: "EverX Posterior + FOB", color: ORANGE },
{ label: "Gp 5", desc: "FOB bulk technique", color: BLUE },
];
const groupY = 4.32;
sl.addShape(pres.ShapeType.rect, { x: 0.1, y: groupY, w: 9.8, h: 1.22, fill: { color: "080F16" }, line: { color: TEAL, width: 0.7 } });
sl.addText("STUDY GROUPS", { x: 0.1, y: groupY, w: 9.8, h: 0.24, fontSize: 8, bold: true, color: ORANGE, align: "center", valign: "middle" });
const gw = 9.8 / 5;
groups.forEach((g, i) => {
const gx = 0.1 + i * gw;
sl.addShape(pres.ShapeType.rect, { x: gx, y: groupY + 0.24, w: gw, h: 0.98, fill: { color: "0D1E2E" }, line: { color: g.color, width: 0.8 } });
sl.addShape(pres.ShapeType.rect, { x: gx, y: groupY + 0.24, w: gw, h: 0.28, fill: { color: g.color } });
sl.addText(g.label, { x: gx, y: groupY + 0.24, w: gw, h: 0.28, fontSize: 9, bold: true, color: WHITE, align: "center", valign: "middle" });
sl.addText(g.desc, { x: gx, y: groupY + 0.52, w: gw, h: 0.7, fontSize: 7.5, color: SILVER, align: "center", valign: "middle", wrap: true });
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 2 – STUDY DESIGN & SPECIMEN PREPARATION
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: NAVY } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.08, fill: { color: ORANGE } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0.08, w: 10, h: 0.52, fill: { color: BLUE } });
sl.addText("STUDY DESIGN & SPECIMEN PREPARATION", {
x: 0, y: 0.08, w: 10, h: 0.52, fontSize: 17, bold: true, color: WHITE, align: "center", valign: "middle", charSpacing: 2
});
sl.addText("02", { x: 9.5, y: 0.1, w: 0.45, h: 0.3, fontSize: 9, color: ORANGE, bold: true, align: "right" });
// ── Left: info cards ────────────────────────────────────────────────────
const cards = [
{ title: "Sample & Ethics", icon: "🦷", items: [
"n = 100 mandibular first molars",
"Extracted for periodontal reasons",
"Caries-free, intact, no restorations",
"Ethics: Gazi Univ. CREC #2021.19/6",
]},
{ title: "Cleaning & Storage", icon: "🧼", items: [
"Hand-scaling: plaque, calculus & PDL removed",
"Stored in 0.1% thymol solution",
"BL & MD dimensions measured (digital caliper)",
"5 groups balanced by one-way ANOVA (p > 0.05)",
]},
{ title: "Cavity Preparation", icon: "🔬", items: [
"Digital radiography for access cavity borders",
"Conservative MO endodontic access cavity",
"Straight fissure carbide bur, high-speed, water-cooled",
"90° cavo-surface margins; bur changed every 5 preps",
]},
];
const cardW = 4.5, cardH = 1.85, cardY = 0.72;
cards.forEach((c, i) => {
const cx = 0.12 + i * (cardW / 3 + 0.04); // stack in left 4.5" column, 3 cards
const cw = cardW / 3 - 0.04;
sl.addShape(pres.ShapeType.rect, { x: cx, y: cardY, w: cw, h: cardH, fill: { color: BLUE }, line: { color: TEAL, width: 0.6 } });
sl.addShape(pres.ShapeType.rect, { x: cx, y: cardY, w: cw, h: 0.32, fill: { color: TEAL } });
sl.addText(`${c.icon} ${c.title}`, { x: cx, y: cardY, w: cw, h: 0.32, fontSize: 8.5, bold: true, color: WHITE, align: "center", valign: "middle" });
sl.addText(
c.items.map((t, j) => ({ text: t, options: { bullet: { code: "2022" }, color: SILVER, fontSize: 7.5, breakLine: j < c.items.length - 1 } })),
{ x: cx + 0.08, y: cardY + 0.36, w: cw - 0.16, h: cardH - 0.42, valign: "top", wrap: true }
);
});
// ── Right: access cavity images ─────────────────────────────────────────
if (IMG.accessDesigns) {
addImgBox(sl, IMG.accessDesigns, 4.68, 0.72, 2.58, 1.82, "Access cavity designs (endodontics)");
}
if (IMG.accessCavity) {
addImgBox(sl, IMG.accessCavity, 7.34, 0.72, 2.58, 1.82, "Clinical view – mandibular molar access");
}
// ── Root Canal Treatment row ─────────────────────────────────────────────
const rctY = 2.7;
sl.addShape(pres.ShapeType.rect, { x: 0.12, y: rctY, w: 9.76, h: 0.28, fill: { color: TEAL } });
sl.addText("ROOT CANAL TREATMENT", { x: 0.12, y: rctY, w: 9.76, h: 0.28, fontSize: 9.5, bold: true, color: WHITE, align: "center", valign: "middle", charSpacing: 1 });
const rctItems = [
{ icon: "📏", text: "WL:\n#10 K-files" },
{ icon: "🔩", text: "ProTaper F3\nCrown-down" },
{ icon: "💧", text: "2.5% NaOCl\n+ distilled H₂O" },
{ icon: "🧻", text: "Paper point\ndrying" },
{ icon: "📌", text: "GP cone +\nAH Plus sealer" },
{ icon: "🪨", text: "RMGIC over\norifices" },
{ icon: "📷", text: "Periapical\nX-ray check" },
];
const iw = 9.76 / rctItems.length;
rctItems.forEach((item, i) => {
const ix = 0.12 + i * iw;
sl.addShape(pres.ShapeType.rect, { x: ix, y: rctY + 0.28, w: iw, h: 0.82, fill: { color: i % 2 === 0 ? "0A2A3A" : "0E3349" } });
sl.addText(item.icon, { x: ix, y: rctY + 0.3, w: iw, h: 0.26, fontSize: 13, align: "center" });
sl.addText(item.text, { x: ix, y: rctY + 0.56, w: iw, h: 0.52, fontSize: 7.5, color: SILVER, align: "center", valign: "top", wrap: true });
});
// ── Protaper image ────────────────────────────────────────────────────────
// The row ends at rctY + 0.28 + 0.82 = rctY + 1.1
// Use remaining space alongside specimen mounting info
const botY = rctY + 1.18;
// Left: specimen mounting text
sl.addShape(pres.ShapeType.rect, { x: 0.12, y: botY, w: 6.1, h: 1.2, fill: { color: "0A2A3A" }, line: { color: ORANGE, width: 0.6 } });
sl.addText("SPECIMEN MOUNTING & SIMULATION", { x: 0.12, y: botY, w: 6.1, h: 0.26, fontSize: 8.5, bold: true, color: ORANGE, align: "center", valign: "middle" });
const mountItems = [
"Self-curing acrylic cylinders | 2 mm below CEJ",
"PDL simulated with base-plate wax (0.3 mm)",
"Mesial gingival margin 1 mm from CEJ | BL cavity width: 4 mm",
"Distal cavity standardised per marginal ridge & periapical XR",
];
sl.addText(
mountItems.map((t, i) => ({ text: t, options: { bullet: { code: "25B8" }, color: SILVER, fontSize: 7.5, breakLine: i < mountItems.length - 1 } })),
{ x: 0.28, y: botY + 0.28, w: 5.85, h: 0.88, valign: "top", wrap: true }
);
// Right: ProTaper + guttapercha images
if (IMG.protaper) {
addImgBox(sl, IMG.protaper, 6.3, botY - 0.04, 1.78, 0.96, "ProTaper F3");
}
if (IMG.guttapercha) {
addImgBox(sl, IMG.guttapercha, 8.16, botY - 0.04, 1.78, 0.96, "GP obturation");
}
// Footnote
sl.addShape(pres.ShapeType.rect, { x: 0, y: 5.32, w: 10, h: 0.3, fill: { color: "060F18" } });
sl.addText("All specimens prepared by the same operator | Digital caliper used throughout for standardisation", {
x: 0, y: 5.32, w: 10, h: 0.3, fontSize: 7.5, color: LGRAY, align: "center", valign: "middle"
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 3 – RESTORATIVE GROUPS
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: NAVY } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.08, fill: { color: TEAL } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0.08, w: 10, h: 0.52, fill: { color: BLUE } });
sl.addText("RESTORATIVE GROUPS & BONDING PROTOCOL", {
x: 0, y: 0.08, w: 10, h: 0.52, fontSize: 17, bold: true, color: WHITE, align: "center", valign: "middle", charSpacing: 2
});
sl.addText("03", { x: 9.5, y: 0.1, w: 0.45, h: 0.3, fontSize: 9, color: TEAL, bold: true, align: "right" });
// Bonding strip
sl.addShape(pres.ShapeType.rect, { x: 0.12, y: 0.7, w: 7.0, h: 0.62, fill: { color: "0A2A3A" }, line: { color: ORANGE, width: 0.6 } });
sl.addText("BONDING PROTOCOL (All restored groups)", { x: 0.12, y: 0.7, w: 7.0, h: 0.22, fontSize: 8.5, bold: true, color: ORANGE, align: "center", valign: "middle" });
sl.addText("35% H₃PO₄ etch (enamel 30 s / dentin 15 s) → Rinse & moist dentin → Clearfil S3 Bond Universal micro-brush 20 s → LED cure 10 s", {
x: 0.22, y: 0.92, w: 6.8, h: 0.36, fontSize: 8, color: SILVER, align: "center", valign: "middle"
});
// Bulk-fill image next to bonding strip
if (IMG.bulkfill) {
addImgBox(sl, IMG.bulkfill, 7.22, 0.7, 2.68, 1.62, "Bulk-fill molar restoration (clinical)");
}
// Group cards
const groupDefs = [
{ num: "1", tag: "Positive Control", color: "2E7D32", desc: "Intact teeth — no cavity, no restoration.\nBaseline fracture strength reference." },
{ num: "2", tag: "Negative Control", color: "C62828", desc: "MO endodontic access prepared.\nNo coronal restoration applied." },
{ num: "3", tag: "Glass Fiber Post + FOB", color: TEAL, desc: "4 mm glass fiber post secured with flowable RC to buccal/lingual walls (middle ⅓). Cavity restored with Filtek One Bulk Fill (4 mm | LED 10 s)." },
{ num: "4", tag: "EverX Posterior + FOB", color: ORANGE, desc: "4 mm EverX Posterior FRC base (LED 20 s). 4 mm Filtek One Bulk Fill on top (LED 10 s — occlusal/buccal/lingual)." },
{ num: "5", tag: "FOB Bulk Technique", color: BLUE, desc: "Entire cavity restored with Filtek One Bulk Fill (bulk technique). Polymerised from occlusal, buccal and lingual (10 s each side)." },
];
const gw = 1.37, gh = 2.85, gy = 1.48;
groupDefs.forEach((g, i) => {
const gx = 0.12 + i * (gw + 0.06);
sl.addShape(pres.ShapeType.rect, { x: gx, y: gy, w: gw, h: gh, fill: { color: "0D2237" }, line: { color: g.color, width: 1.2 } });
sl.addShape(pres.ShapeType.rect, { x: gx, y: gy, w: gw, h: 0.5, fill: { color: g.color } });
sl.addText(`GROUP ${g.num}`, { x: gx, y: gy, w: gw, h: 0.26, fontSize: 10, bold: true, color: WHITE, align: "center", valign: "middle" });
sl.addText(g.tag, { x: gx, y: gy + 0.26, w: gw, h: 0.24, fontSize: 7, color: WHITE, align: "center", valign: "middle", italic: true });
sl.addText(g.desc, { x: gx + 0.06, y: gy + 0.54, w: gw - 0.12, h: gh - 0.62, fontSize: 7.5, color: SILVER, valign: "top", wrap: true });
});
// Filtek One product image
if (IMG.filtekOne) {
addImgBox(sl, IMG.filtekOne, 7.22, 1.48, 2.68, 2.34, "Filtek One Bulk Fill Restorative (3M ESPE)");
}
// Footnote
sl.addShape(pres.ShapeType.rect, { x: 0, y: 5.32, w: 10, h: 0.3, fill: { color: "060F18" } });
sl.addText("Storage: 37 °C distilled water 24 h | Thermocycling: 10,000 cycles (5 °C ↔ 55 °C, 30 s dwell) | Same operator for all preparations", {
x: 0, y: 5.32, w: 10, h: 0.3, fontSize: 7.5, color: LGRAY, align: "center", valign: "middle"
});
}
// ═══════════════════════════════════════════════════════════════════════════
// SLIDE 4 – FRACTURE RESISTANCE TESTING
// ═══════════════════════════════════════════════════════════════════════════
{
const sl = pres.addSlide();
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: NAVY } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.08, fill: { color: ORANGE } });
sl.addShape(pres.ShapeType.rect, { x: 0, y: 0.08, w: 10, h: 0.52, fill: { color: BLUE } });
sl.addText("FRACTURE RESISTANCE TESTING & OUTCOME MEASURES", {
x: 0, y: 0.08, w: 10, h: 0.52, fontSize: 15, bold: true, color: WHITE, align: "center", valign: "middle", charSpacing: 2
});
sl.addText("04", { x: 9.5, y: 0.1, w: 0.45, h: 0.3, fontSize: 9, color: ORANGE, bold: true, align: "right" });
// ── Left: Testing Setup card ─────────────────────────────────────────────
sl.addShape(pres.ShapeType.rect, { x: 0.12, y: 0.72, w: 4.2, h: 2.5, fill: { color: BLUE }, line: { color: TEAL, width: 0.8 } });
sl.addShape(pres.ShapeType.rect, { x: 0.12, y: 0.72, w: 4.2, h: 0.3, fill: { color: TEAL } });
sl.addText("⚙️ TESTING SETUP", { x: 0.12, y: 0.72, w: 4.2, h: 0.3, fontSize: 9.5, bold: true, color: WHITE, align: "center", valign: "middle" });
const setupItems = [
"Universal Testing Machine: Shimadzu IG-IS, Tokyo, Japan",
"Indenter: 5 mm stainless steel spherical tip",
"Load: 45° oblique compressive — central fossa",
"Crosshead speed: 1 mm / min",
"Endpoint: fracture occurrence",
"Recorded: maximum load in Newtons (N)",
];
sl.addText(
setupItems.map((t, i) => ({ text: t, options: { bullet: { code: "25CF" }, color: SILVER, fontSize: 8.5, breakLine: i < setupItems.length - 1 } })),
{ x: 0.26, y: 1.06, w: 3.96, h: 2.1, valign: "top", wrap: true }
);
// ── Right: UTM image ─────────────────────────────────────────────────────
if (IMG.utmTest) {
addImgBox(sl, IMG.utmTest, 4.45, 0.72, 5.45, 2.48, "Fracture resistance test – Universal Testing Machine (45° oblique load)");
}
// ── Fracture classification ──────────────────────────────────────────────
const fcY = 3.32;
sl.addShape(pres.ShapeType.rect, { x: 0.12, y: fcY, w: 4.68, h: 1.58, fill: { color: "0A2A3A" }, line: { color: ORANGE, width: 0.8 } });
sl.addShape(pres.ShapeType.rect, { x: 0.12, y: fcY, w: 4.68, h: 0.3, fill: { color: ORANGE } });
sl.addText("🔍 FRACTURE CLASSIFICATION", { x: 0.12, y: fcY, w: 4.68, h: 0.3, fontSize: 9.5, bold: true, color: NAVY, align: "center", valign: "middle" });
sl.addShape(pres.ShapeType.rect, { x: 0.22, y: fcY + 0.36, w: 2.1, h: 0.9, fill: { color: "1A5C1A" }, line: { color: "2ECC71", width: 0.6 } });
sl.addText("✅ RESTORABLE", { x: 0.22, y: fcY + 0.36, w: 2.1, h: 0.28, fontSize: 8, bold: true, color: "2ECC71", align: "center", valign: "middle" });
sl.addText("Fracture at or above CEJ\nor ≤1 mm apical to CEJ", { x: 0.22, y: fcY + 0.64, w: 2.1, h: 0.58, fontSize: 7.5, color: SILVER, align: "center", valign: "top", wrap: true });
sl.addShape(pres.ShapeType.rect, { x: 2.56, y: fcY + 0.36, w: 2.14, h: 0.9, fill: { color: "5C1A1A" }, line: { color: "E74C3C", width: 0.6 } });
sl.addText("❌ NON-RESTORABLE", { x: 2.56, y: fcY + 0.36, w: 2.14, h: 0.28, fontSize: 8, bold: true, color: "E74C3C", align: "center", valign: "middle" });
sl.addText("Fracture >1 mm apical\nto CEJ", { x: 2.56, y: fcY + 0.64, w: 2.14, h: 0.58, fontSize: 7.5, color: SILVER, align: "center", valign: "top", wrap: true });
sl.addText("Evaluated independently by two operators", { x: 0.22, y: fcY + 1.3, w: 4.48, h: 0.22, fontSize: 7.5, color: LGRAY, align: "center", valign: "middle", italic: true });
// ── Statistics pipeline ──────────────────────────────────────────────────
sl.addShape(pres.ShapeType.rect, { x: 4.92, y: fcY, w: 5.0, h: 1.58, fill: { color: "0A2A3A" }, line: { color: TEAL, width: 0.8 } });
sl.addShape(pres.ShapeType.rect, { x: 4.92, y: fcY, w: 5.0, h: 0.3, fill: { color: TEAL } });
sl.addText("📊 STATISTICAL ANALYSIS PIPELINE", { x: 4.92, y: fcY, w: 5.0, h: 0.3, fontSize: 9, bold: true, color: WHITE, align: "center", valign: "middle" });
const statBoxes = [
{ label: "Normality", sub: "Shapiro-Wilk" },
{ label: "Homogeneity", sub: "Levene's Test" },
{ label: "Comparison", sub: "One-way ANOVA" },
{ label: "Post-hoc", sub: "Tukey HSD" },
{ label: "Fracture Mode", sub: "Chi-square" },
];
const sbw = 0.86, sbh = 0.86, sby = fcY + 0.38;
statBoxes.forEach((sb, i) => {
const sbx = 4.98 + i * (sbw + 0.1);
sl.addShape(pres.ShapeType.rect, { x: sbx, y: sby, w: sbw, h: sbh, fill: { color: BLUE }, line: { color: TEAL, width: 0.5 } });
sl.addText(sb.label, { x: sbx, y: sby + 0.05, w: sbw, h: 0.4, fontSize: 8, bold: true, color: WHITE, align: "center", valign: "middle", wrap: true });
sl.addText(sb.sub, { x: sbx, y: sby + 0.46, w: sbw, h: 0.32, fontSize: 7, color: ORANGE, align: "center", valign: "middle", italic: true });
if (i < statBoxes.length - 1) {
sl.addShape(pres.ShapeType.line, { x: sbx + sbw, y: sby + sbh / 2, w: 0.1, h: 0, line: { color: ORANGE, width: 1, endArrowType: "triangle" } });
}
});
// Footnote
sl.addShape(pres.ShapeType.rect, { x: 0, y: 5.32, w: 10, h: 0.3, fill: { color: "060F18" } });
sl.addText("Significance level: p < 0.05 | All procedures performed by the same trained operator", {
x: 0, y: 5.32, w: 10, h: 0.3, fontSize: 7.5, color: LGRAY, align: "center", valign: "middle"
});
}
// ─── Write file ─────────────────────────────────────────────────────────────
const OUT = "/home/daytona/workspace/molar-study-pptx/Methodology_Presentation_v2.pptx";
pres.writeFile({ fileName: OUT })
.then(() => console.log("DONE:", OUT))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/molar-study-pptx && node build_with_images.js 2>&1
ls -lh /home/daytona/workspace/molar-study-pptx/Methodology_Presentation_v2.pptx
Methodology Presentation v2
Presentation · PPTX
give me 3 slides for my presentation