Dental CAD Knowledge Base

Expert Insights for Digital Dentistry

Practical guides, workflow breakdowns, and clinical perspectives from our CAD design team — written for dentists, labs, and specialists worldwide.

The Future of Dental CAD: AI-Assisted Design and What It Means for Labs
Technology 10 min read

The Future of Dental CAD: AI-Assisted Design and What It Means for Labs

AI is entering the dental CAD workflow — from automated margin detection to AI-generated tooth morphology proposals. Here's what's real today, what's coming, and how forward-thinking labs should prepare.

Submitting Perfect Scan Files: The Ultimate STL QA Checklist
Workflow 7 min read

Submitting Perfect Scan Files: The Ultimate STL QA Checklist

Poor scans are the #1 cause of case delays and revision requests. Use this 12-point checklist before sending any scan to ensure clean margins, full coverage, and no mesh errors that derail design.

24-Hour Turnaround: How Remote CAD Studios Hit Tight Deadlines
Workflow 8 min read

24-Hour Turnaround: How Remote CAD Studios Hit Tight Deadlines

Fast delivery without quality compromise is our promise. Here's a transparent look at how we organize our workflow across time zones to deliver cases within 24 hours — and what you can do to help us help you.

Exocad vs. 3Shape: Which Platform Produces Better Restorations?
Technology 12 min read

Exocad vs. 3Shape: Which Platform Produces Better Restorations?

We use both platforms daily. Here's an honest, feature-by-feature comparison of Exocad DentalCAD and 3Shape Dental System for crown, implant, full-arch, and smile design workflows.

The Business Case for Outsourcing Dental CAD: ROI for Labs
Business 11 min read

The Business Case for Outsourcing Dental CAD: ROI for Labs

Is in-house CAD worth the investment? We break down the real cost of an in-house operator vs. remote outsourcing — including software, hardware, time, and revision rates — with a practical ROI calculator.

Zirconia vs. PMMA vs. Wax: Material Selection in Remote CAD
Design Tips 8 min read

Zirconia vs. PMMA vs. Wax: Material Selection in Remote CAD

The material you mill determines how we design the restoration. Understanding the mechanical properties and design tolerances of each material helps us deliver files that mill perfectly the first time.

1 2
(function() { 'use strict'; if (window.__CHAT_WIDGET_INITIALIZED__) return; window.__CHAT_WIDGET_INITIALIZED__ = true; const widget = $('#chatWidget'); if (!widget) return; const toggle = $('#chatToggle'), panel = $('#chatPanel'), initForm = $('#chatInitForm'), chatMain = $('#chatMain'), chatName = $('#chatName'), chatEmail = $('#chatEmail'), chatInitMsg = $('#chatInitMsg'), chatMessages = $('#chatMessages'), chatForm = $('#chatForm'), chatInput = $('#chatInput'), chatUserLabel = $('#chatUserLabel'), chatReset = $('#chatReset'), closeBtn = $('.chat-close'), minBtn = $('.chat-min'), liveDot = $('.chat-live-dot'); let chatSession = null, isInitialized = false, pollInterval = null; function showInitForm() { panel.classList.remove('is-chatting'); initForm.hidden = false; chatMain.hidden = true; chatInitMsg.textContent = ''; chatName.focus(); } function showChatMain() { panel.classList.add('is-chatting'); initForm.hidden = true; chatMain.hidden = false; liveDot.hidden = false; chatInput.focus(); } function showInitError(message) { chatInitMsg.textContent = message; chatInitMsg.style.color = '#b33'; } function addMessage(text, sender, senderName) { const msg = document.createElement('div'); msg.className = `chat-msg ${sender}`; if (senderName) { const senderEl = document.createElement('div'); senderEl.className = 'msg-sender'; senderEl.textContent = senderName; msg.appendChild(senderEl); } const body = document.createElement('div'); body.className = 'msg-body'; const content = document.createElement('div'); content.className = 'msg-content'; content.textContent = text; body.appendChild(content); const time = document.createElement('div'); time.className = 'msg-time'; time.textContent = new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); body.appendChild(time); msg.appendChild(body); chatMessages.appendChild(msg); chatMessages.scrollTop = chatMessages.scrollHeight; } function startPolling() { if (pollInterval) clearInterval(pollInterval); pollInterval = setInterval(async () => { if (!chatSession) return; try { const response = await fetch((window.APP_BASE_URL || '/') + 'actions/chat_poll.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ session_id: chatSession, _csrf: window.CSRF_TOKEN }) }); const result = await response.json(); if (result.success && result.messages) { result.messages.forEach(msg => { addMessage(msg.message, 'support', 'iDentCAD Support'); }); } } catch (error) { console.error('Poll error:', error); } }, 3000); } function endSession() { if (chatSession) { navigator.sendBeacon((window.APP_BASE_URL || '/') + 'actions/chat_end.php', JSON.stringify({ session_id: chatSession, _csrf: window.CSRF_TOKEN })); } if (pollInterval) clearInterval(pollInterval); pollInterval = null; chatSession = null; isInitialized = false; chatMessages.innerHTML = ''; liveDot.hidden = true; showInitForm(); } function saveCustomerInfo(name, email) { try { localStorage.setItem('identcad_chat_customer', JSON.stringify({ name, email })); } catch (e) { console.warn('Could not save customer info.', e); } } function loadCustomerInfo() { try { const storedInfo = localStorage.getItem('identcad_chat_customer'); if (storedInfo) { const customer = JSON.parse(storedInfo); chatName.value = customer.name || ''; chatEmail.value = customer.email || ''; } } catch (e) { console.warn('Could not load customer info.', e); } } on(toggle, 'click', (e) => { e.stopPropagation(); const isOpening = panel.hidden; panel.hidden = !isOpening; toggle.setAttribute('aria-expanded', String(isOpening)); if (isOpening) { const waPanel = $('#whatsappPanel'); if (waPanel) waPanel.hidden = true; loadCustomerInfo(); if (!isInitialized) showInitForm(); } }); on(closeBtn, 'click', () => { panel.hidden = true; toggle.setAttribute('aria-expanded', 'false'); }); on(minBtn, 'click', () => { panel.hidden = true; toggle.setAttribute('aria-expanded', 'false'); }); on(initForm, 'submit', async (e) => { e.preventDefault(); const name = chatName.value.trim(), email = chatEmail.value.trim(); if (!name) { showInitError('Please enter your name'); return; } if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { showInitError('Please enter a valid email'); return; } const submitBtn = initForm.querySelector('button'); submitBtn.disabled = true; submitBtn.textContent = 'Starting...'; chatInitMsg.textContent = 'Connecting...'; chatInitMsg.style.color = '#555'; try { saveCustomerInfo(name, email); const response = await fetch((window.APP_BASE_URL || '/') + 'actions/chat_start.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, email, _csrf: window.CSRF_TOKEN }) }); const result = await response.json(); if (result.success) { chatSession = result.session_id; isInitialized = true; chatUserLabel.textContent = `${name}`; showChatMain(); addMessage('Welcome! How can we help you today?', 'support', 'iDentCAD Support'); startPolling(); } else { throw new Error(result.error || 'Failed to start chat'); } } catch (error) { console.error('Chat init error:', error); showInitError(error.message || 'Connection failed.'); } finally { submitBtn.disabled = false; submitBtn.textContent = 'Start Chat'; } }); on(chatForm, 'submit', async (e) => { e.preventDefault(); const message = chatInput.value.trim(); if (!message || !chatSession) return; addMessage(message, 'user', chatName.value); chatInput.value = ''; try { await fetch((window.APP_BASE_URL || '/') + 'actions/chat_send.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ session_id: chatSession, message, _csrf: window.CSRF_TOKEN }) }); } catch (error) { console.error('Send message error:', error); addMessage('Failed to send message.', 'system-error'); } }); on(chatReset, 'click', () => { if (confirm('Are you sure you want to end this chat session?')) endSession(); }); })();