{"id":4276,"date":"2020-09-14T09:19:39","date_gmt":"2020-09-14T01:19:39","guid":{"rendered":"https:\/\/plasticmoulds.net\/?page_id=4276"},"modified":"2026-07-26T20:31:43","modified_gmt":"2026-07-26T12:31:43","slug":"processo-de-concecao-de-pecas-de-plastico","status":"publish","type":"page","link":"https:\/\/www.plasticmoulds.net\/pt\/plastic-parts-design-process","title":{"rendered":"O processo completo para o desenho de pe\u00e7as pl\u00e1sticas"},"content":{"rendered":"<article class=\"tw-article-template\"><nav class=\"wp-block-stackable-table-of-contents stk-block-table-of-contents stk-block stk-9233d81\" data-block-id=\"9233d81\"><p class=\"stk-table-of-contents__title\">Table of Contents<\/p><ul class=\"stk-table-of-contents__table\"><li><a href=\"#undefined\">1. Defining Requirements<\/a><\/li><li><a href=\"#undefined\">2. Create a Preliminary Concept Sketch<\/a><\/li><li><a href=\"#undefined\">3. Initial Materials Selection<\/a><\/li><li><a href=\"#undefined\">4. Design Parts<\/a><\/li><li><a href=\"#undefined\">5. Structural Analysis<\/a><\/li><li><a href=\"#undefined\">6. Final Materials Selection<\/a><\/li><li><a href=\"#undefined\">7. Modify the Design for Manufacturing (DFM)<\/a><\/li><li><a href=\"#undefined\">8. Prototyping<\/a><\/li><li><a href=\"#undefined\">9. Tooling<\/a><\/li><li><a href=\"#undefined\">10. Production<\/a><\/li><\/ul><\/nav><figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2026\/07\/product-development.webp\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2026\/07\/product-development-1024x576.webp\" alt=\"Plastic part design process steps\" class=\"wp-image-18932\" srcset=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2026\/07\/product-development-1024x576.webp 1024w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2026\/07\/product-development-300x169.webp 300w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2026\/07\/product-development-768x432.webp 768w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2026\/07\/product-development-1536x864.webp 1536w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2026\/07\/product-development-18x10.webp 18w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2026\/07\/product-development.webp 1672w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><h1 class=\"wp-block-heading\">The Ultimate Guide to Simplifying the Design Process for New Product Developers<\/h1><p class=\"wp-block-paragraph\">Creating a new product is both an exciting and daunting task. Whether you\u2019re a seasoned designer or a new product developer, the journey from concept to production requires precision and a well-organized approach. The <a href=\"https:\/\/www.plasticmoulds.net\/an-overview-of-the-design-process.html\">design process<\/a> can be broken down into 10 key steps, each integral to ensuring your product is both functional and manufacturable. By understanding and following these steps, you can streamline your workflow and avoid costly mistakes along the way. Let\u2019s explore these steps in detail.<\/p><div class=\"pdw\" id=\"pdw391092\" data-cur=\"0\"><div class=\"pdw-head\"><span class=\"pdw-eyebrow\">From concept to production<\/span><h3 class=\"pdw-heading\">10-Step Product Development Workflow<\/h3><\/div><div class=\"pdw-rail\" role=\"tablist\" aria-label=\"Workflow steps\"><button type=\"button\" class=\"pdw-node is-active\" data-i=\"0\" role=\"tab\" aria-selected=\"true\" title=\"1. Defining Requirements\"><span class=\"pdw-node-num\">1<\/span><\/button><button type=\"button\" class=\"pdw-node\" data-i=\"1\" role=\"tab\" aria-selected=\"false\" title=\"2. Preliminary Concept Sketch\"><span class=\"pdw-node-num\">2<\/span><\/button><button type=\"button\" class=\"pdw-node\" data-i=\"2\" role=\"tab\" aria-selected=\"false\" title=\"3. Initial Materials Selection\"><span class=\"pdw-node-num\">3<\/span><\/button><button type=\"button\" class=\"pdw-node\" data-i=\"3\" role=\"tab\" aria-selected=\"false\" title=\"4. Design Parts\"><span class=\"pdw-node-num\">4<\/span><\/button><button type=\"button\" class=\"pdw-node\" data-i=\"4\" role=\"tab\" aria-selected=\"false\" title=\"5. Structural Analysis\"><span class=\"pdw-node-num\">5<\/span><\/button><button type=\"button\" class=\"pdw-node\" data-i=\"5\" role=\"tab\" aria-selected=\"false\" title=\"6. Final Materials Selection\"><span class=\"pdw-node-num\">6<\/span><\/button><button type=\"button\" class=\"pdw-node\" data-i=\"6\" role=\"tab\" aria-selected=\"false\" title=\"7. Design for Manufacturing (DFM)\"><span class=\"pdw-node-num\">7<\/span><\/button><button type=\"button\" class=\"pdw-node\" data-i=\"7\" role=\"tab\" aria-selected=\"false\" title=\"8. Prototyping\"><span class=\"pdw-node-num\">8<\/span><\/button><button type=\"button\" class=\"pdw-node\" data-i=\"8\" role=\"tab\" aria-selected=\"false\" title=\"9. Tooling\"><span class=\"pdw-node-num\">9<\/span><\/button><button type=\"button\" class=\"pdw-node\" data-i=\"9\" role=\"tab\" aria-selected=\"false\" title=\"10. Production\"><span class=\"pdw-node-num\">10<\/span><\/button><\/div><div class=\"pdw-card\"><div class=\"pdw-media\"><img class=\"pdw-img\" src=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2026\/07\/pd-step-1.webp\" alt=\"Defining Requirements\" loading=\"lazy\" decoding=\"async\" onerror=\"this.style.opacity=0;\"><\/div><div class=\"pdw-body\"><span class=\"pdw-phase\">Concept &amp; Definition<\/span><div class=\"pdw-steplabel\">Step <b class=\"pdw-cur\">1<\/b><i>\/ 10<\/i><\/div><h4 class=\"pdw-steptitle\">Defining Requirements<\/h4><p class=\"pdw-stepdesc\">Pin down function, load cases, operating environment, regulatory targets, volume and the cost ceiling before anything is drawn. Vague specs here turn into expensive rework at the tooling stage.<\/p><\/div><\/div><div class=\"pdw-foot\"><button type=\"button\" class=\"pdw-btn pdw-prev\" disabled aria-label=\"Previous step\">&larr; Prev<\/button><input type=\"range\" class=\"pdw-slider\" min=\"1\" max=\"10\" value=\"1\" aria-label=\"Slide through workflow steps\"><button type=\"button\" class=\"pdw-btn pdw-next\" aria-label=\"Next step\">Next &rarr;<\/button><\/div><\/div><style> #pdw391092{--pdw-navy:#12305a;--pdw-navy2:#1c437a;--pdw-orange:#ef6c1a;--pdw-ink:#1f2a37;--pdw-muted:#657084;--pdw-line:#e4e8ef;--pdw-bg:#ffffff;--pdw-soft:#e0e0e0;max-width:860px;margin:1.6em auto;color:var(--pdw-ink);font-family:inherit;-webkit-font-smoothing:antialiased;} #pdw391092 *{box-sizing:border-box;} #pdw391092 .pdw-head{text-align:center;margin-bottom:1.1em;} #pdw391092 .pdw-eyebrow{display:inline-block;font-size:.72rem;letter-spacing:.14em;text-transform:uppercase;font-weight:700;color:var(--pdw-orange);margin-bottom:.35em;} #pdw391092 .pdw-heading{margin:0;font-size:1.5rem;line-height:1.2;font-weight:800;color:var(--pdw-navy);} #pdw391092 .pdw-rail{position:relative;display:flex;justify-content:space-between;align-items:center;gap:4px;margin:0 4px 1.15em;padding:2px 0;} #pdw391092 .pdw-rail:before{content:\"\";position:absolute;left:14px;right:14px;top:50%;height:3px;transform:translateY(-50%);background:var(--pdw-line);border-radius:2px;z-index:0;} #pdw391092 .pdw-node{position:relative;z-index:1;width:30px;height:30px;flex:0 0 auto;border-radius:50%;border:2px solid var(--pdw-line);background:var(--pdw-bg);color:var(--pdw-muted);font-weight:700;font-size:.8rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;transition:transform .18s ease, background .18s ease, border-color .18s ease, color .18s ease;} #pdw391092 .pdw-node:hover{border-color:var(--pdw-navy2);color:var(--pdw-navy);} #pdw391092 .pdw-node.is-done{background:var(--pdw-navy);border-color:var(--pdw-navy);color:#fff;} #pdw391092 .pdw-node.is-active{background:var(--pdw-orange);border-color:var(--pdw-orange);color:#fff;transform:scale(1.18);box-shadow:0 4px 12px rgba(239,108,26,.35);} #pdw391092 .pdw-card{display:flex;gap:0;background:var(--pdw-bg);border:1px solid var(--pdw-line);border-radius:16px;overflow:hidden;box-shadow:0 10px 30px rgba(18,48,90,.07);} #pdw391092 .pdw-media{flex:0 0 42%;background:var(--pdw-soft);display:flex;align-items:center;justify-content:center;padding:12px;border-right:1px solid var(--pdw-line);min-height:220px;} #pdw391092 .pdw-img{max-width:100%;max-height:280px;width:auto;height:auto;object-fit:contain;transition:opacity .28s ease;display:block;border-radius:8px;} #pdw391092 .pdw-img.pdw-fade{opacity:0;} #pdw391092 .pdw-body{flex:1 1 auto;padding:26px 28px;display:flex;flex-direction:column;justify-content:center;} #pdw391092 .pdw-phase{display:inline-block;align-self:flex-start;font-size:.68rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--pdw-navy);background:rgba(18,48,90,.08);padding:.28em .7em;border-radius:999px;margin-bottom:.7em;} #pdw391092 .pdw-steplabel{font-size:.82rem;color:var(--pdw-muted);font-weight:600;margin-bottom:.15em;} #pdw391092 .pdw-steplabel b{color:var(--pdw-orange);font-size:1rem;} #pdw391092 .pdw-steplabel i{font-style:normal;} #pdw391092 .pdw-steptitle{margin:.05em 0 .5em;font-size:1.4rem;line-height:1.22;font-weight:800;color:var(--pdw-navy);} #pdw391092 .pdw-stepdesc{margin:0;font-size:.97rem;line-height:1.6;color:var(--pdw-ink);} #pdw391092 .pdw-cta{align-self:flex-start;margin-top:1.1em;font-weight:700;font-size:.9rem;color:var(--pdw-orange);text-decoration:none;border-bottom:2px solid transparent;transition:border-color .18s;} #pdw391092 .pdw-cta:hover{border-color:var(--pdw-orange);} #pdw391092 .pdw-foot{display:flex;align-items:center;gap:14px;margin-top:1.15em;} #pdw391092 .pdw-btn{flex:0 0 auto;border:0;cursor:pointer;font-weight:700;font-size:.9rem;padding:.62em 1.25em;border-radius:10px;background:var(--pdw-navy);color:#fff;transition:background .18s ease, transform .12s ease, opacity .18s ease;} #pdw391092 .pdw-btn:hover:not(:disabled){background:var(--pdw-navy2);transform:translateY(-1px);} #pdw391092 .pdw-btn:disabled{opacity:.35;cursor:not-allowed;} #pdw391092 .pdw-next{background:var(--pdw-orange);} #pdw391092 .pdw-next:hover:not(:disabled){background:#d95c11;} #pdw391092 .pdw-slider{flex:1 1 auto;-webkit-appearance:none;appearance:none;height:7px;border-radius:6px;outline:none;cursor:pointer;background:linear-gradient(to right, var(--pdw-orange) 0%, var(--pdw-orange) 0%, var(--pdw-line) 0%, var(--pdw-line) 100%);} #pdw391092 .pdw-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:18px;height:18px;border-radius:50%;background:var(--pdw-orange);border:2px solid #fff;box-shadow:0 2px 6px rgba(239,108,26,.4);cursor:grab;transition:transform .15s;} #pdw391092 .pdw-slider::-webkit-slider-thumb:active{cursor:grabbing;transform:scale(1.2);} #pdw391092 .pdw-slider::-moz-range-thumb{width:18px;height:18px;border-radius:50%;background:var(--pdw-orange);border:2px solid #fff;box-shadow:0 2px 6px rgba(239,108,26,.4);cursor:grab;transition:transform .15s;} #pdw391092 .pdw-slider::-moz-range-track{background:transparent;} @media (max-width:640px){#pdw391092 .pdw-card{flex-direction:column;} #pdw391092 .pdw-media{flex:none;width:100%;border-right:0;border-bottom:1px solid var(--pdw-line);min-height:0;padding:14px;} #pdw391092 .pdw-img{max-height:190px;} #pdw391092 .pdw-body{padding:20px;} #pdw391092 .pdw-steptitle{font-size:1.2rem;} #pdw391092 .pdw-heading{font-size:1.25rem;} #pdw391092 .pdw-rail{overflow-x:auto;justify-content:flex-start;gap:10px;padding-bottom:6px;} #pdw391092 .pdw-rail:before{display:none;} #pdw391092 .pdw-node{width:34px;height:34px;} } <\/style><script> \/* PDW interactive stepper \u2014 self-contained IIFE, LiteSpeed-safe (block comments only) *\/ (function(){ var ROOT = document.getElementById('pdw391092'); if(!ROOT || ROOT.dataset.pdwInit) return; ROOT.dataset.pdwInit = '1'; var DATA = [{\"n\":1,\"phase\":\"Concept & Definition\",\"title\":\"Defining Requirements\",\"desc\":\"Pin down function, load cases, operating environment, regulatory targets, volume and the cost ceiling before anything is drawn. Vague specs here turn into expensive rework at the tooling stage.\",\"img\":\"https:\\\/\\\/www.plasticmoulds.net\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pd-step-1.webp\"},{\"n\":2,\"phase\":\"Concept & Definition\",\"title\":\"Preliminary Concept Sketch\",\"desc\":\"Rough out geometry, parting direction and how the part mounts and assembles. Cheap sketches let you kill weak concepts before they cost real money.\",\"img\":\"https:\\\/\\\/www.plasticmoulds.net\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pd-step-2.webp\"},{\"n\":3,\"phase\":\"Concept & Definition\",\"title\":\"Initial Materials Selection\",\"desc\":\"Shortlist resins against mechanical, thermal and chemical demands \\u2014 PA, PC, PPS, PEEK and the rest. The early candidate drives wall thickness, shrinkage and gate strategy.\",\"img\":\"https:\\\/\\\/www.plasticmoulds.net\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pd-step-3.webp\"},{\"n\":4,\"phase\":\"Design & Engineering\",\"title\":\"Design Parts\",\"desc\":\"Build the 3D model with uniform walls, ribs, bosses and draft designed in from the start \\u2014 not bolted on after the fact.\",\"img\":\"https:\\\/\\\/www.plasticmoulds.net\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pd-step-4.webp\"},{\"n\":5,\"phase\":\"Design & Engineering\",\"title\":\"Structural Analysis\",\"desc\":\"Run FEA for stress, deflection and fatigue under real loads. Catch thin sections and stress risers on screen, not in the field.\",\"img\":\"https:\\\/\\\/www.plasticmoulds.net\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pd-step-5.webp\"},{\"n\":6,\"phase\":\"Design & Engineering\",\"title\":\"Final Materials Selection\",\"desc\":\"Lock the exact grade after analysis \\u2014 filler content, flow, UL flammability and supply. This freezes your shrinkage and tolerance assumptions.\",\"img\":\"https:\\\/\\\/www.plasticmoulds.net\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pd-step-6.webp\"},{\"n\":7,\"phase\":\"Optimization & Validation\",\"title\":\"Design for Manufacturing (DFM)\",\"desc\":\"Tune for moldability: draft angles, consistent walls, gate and ejector locations, undercuts and realistic tolerances. A moldmaker&rsquo;s input here saves weeks later.\",\"img\":\"https:\\\/\\\/www.plasticmoulds.net\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pd-step-7.webp\"},{\"n\":8,\"phase\":\"Optimization & Validation\",\"title\":\"Prototyping\",\"desc\":\"Validate fit, form and function with 3D-printed or short-run parts before cutting steel. Test assembly and gather user feedback while changes are still cheap.\",\"img\":\"https:\\\/\\\/www.plasticmoulds.net\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pd-step-8.webp\"},{\"n\":9,\"phase\":\"Manufacturing\",\"title\":\"Tooling\",\"desc\":\"Cut the injection mold \\u2014 steel grade, cavitation, cooling, gating and ejection. The most expensive and least reversible step, so everything above has to be right first.\",\"img\":\"https:\\\/\\\/www.plasticmoulds.net\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pd-step-9.webp\"},{\"n\":10,\"phase\":\"Manufacturing\",\"title\":\"Production\",\"desc\":\"Run, monitor and refine \\u2014 process window, cycle time, SPC and quality gates that deliver consistent parts at volume.\",\"img\":\"https:\\\/\\\/www.plasticmoulds.net\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pd-step-10.webp\"}]; var TOTAL = DATA.length; var cur = 0; var img = ROOT.querySelector('.pdw-img'); var phase = ROOT.querySelector('.pdw-phase'); var curEl = ROOT.querySelector('.pdw-cur'); var title = ROOT.querySelector('.pdw-steptitle'); var desc = ROOT.querySelector('.pdw-stepdesc'); var slider = ROOT.querySelector('.pdw-slider'); var nodes = ROOT.querySelectorAll('.pdw-node'); var prev = ROOT.querySelector('.pdw-prev'); var next = ROOT.querySelector('.pdw-next'); \/* preload every image so navigation is instant *\/ var pre = []; for(var p=0; p<TOTAL; p++){ var im = new Image(); im.src = DATA[p].img; pre.push(im); } function render(i){ var d = DATA[i]; img.classList.add('pdw-fade'); window.setTimeout(function(){ img.src = d.img; img.alt = d.title; img.style.opacity = ''; img.classList.remove('pdw-fade'); }, 160); phase.textContent = d.phase; curEl.textContent = d.n; title.textContent = d.title; desc.innerHTML = d.desc; \/* Update slider visual progress *\/ if(slider){ slider.value = i + 1; var pct = TOTAL > 1 ? (i \/ (TOTAL - 1)) * 100 : 100; slider.style.background = 'linear-gradient(to right, var(--pdw-orange) 0%, var(--pdw-orange) ' + pct + '%, var(--pdw-line) ' + pct + '%, var(--pdw-line) 100%)'; } for(var k=0; k<nodes.length; k++){ nodes[k].classList.remove('is-active','is-done'); nodes[k].setAttribute('aria-selected','false'); if(k < i){ nodes[k].classList.add('is-done'); } if(k === i){ nodes[k].classList.add('is-active'); nodes[k].setAttribute('aria-selected','true'); } } prev.disabled = (i === 0); next.disabled = (i === TOTAL - 1); ROOT.setAttribute('data-cur', i); \/* keep active node visible on mobile *\/ if(window.matchMedia && window.matchMedia('(max-width:640px)').matches && nodes[i].scrollIntoView){ nodes[i].scrollIntoView({behavior:'smooth', inline:'center', block:'nearest'}); } } function go(i){ if(i < 0){ i = 0; } if(i > TOTAL - 1){ i = TOTAL - 1; } cur = i; render(cur); } prev.addEventListener('click', function(){ go(cur - 1); }); next.addEventListener('click', function(){ go(cur + 1); }); if(slider){ slider.addEventListener('input', function(){ go(parseInt(this.value, 10) - 1); }); } for(var n=0; n<nodes.length; n++){ (function(idx){ nodes[idx].addEventListener('click', function(){ go(idx); }); })(n); } \/* keyboard arrows when focus is inside the widget *\/ ROOT.addEventListener('keydown', function(e){ if(e.key === 'ArrowRight'){ e.preventDefault(); go(cur + 1); } if(e.key === 'ArrowLeft'){ e.preventDefault(); go(cur - 1); } }); \/* touch swipe on the card *\/ var card = ROOT.querySelector('.pdw-card'); var sx = 0, sy = 0; card.addEventListener('touchstart', function(e){ sx = e.touches[0].clientX; sy = e.touches[0].clientY; }, {passive:true}); card.addEventListener('touchend', function(e){ var dx = e.changedTouches[0].clientX - sx; var dy = e.changedTouches[0].clientY - sy; if(Math.abs(dx) > 45 && Math.abs(dx) > Math.abs(dy)){ go(cur + (dx < 0 ? 1 : -1)); } }, {passive:true}); render(0); })(); <\/script><h2 class=\"wp-block-heading\">1. Defining Requirements<\/h2><p class=\"wp-block-paragraph\">The first and most crucial step in any design project is defining the requirements. This stage involves determining the product\u2019s primary function, target market, and user needs. A detailed set of requirements guides the design process and keeps everyone on the same page.<\/p><p class=\"wp-block-paragraph\">For example, when designing a new consumer electronics product, you might consider factors such as size, weight, and battery life. The more specific you are, the easier it will be to align your design decisions with the goals of the product. It\u2019s important to keep an open line of communication with all stakeholders, as their feedback can help refine the product vision and define features that will differentiate the product in the market. Many developers refer to a <a href=\"https:\/\/www.plasticmoulds.net\/report-investment-process-for-new-plastic-molded-part-development.html\">report investment process<\/a> to better manage early-stage expectations.<\/p><h2 class=\"wp-block-heading\">2. Create a Preliminary Concept Sketch<\/h2><figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/hand-drawing.webp\"><img loading=\"lazy\" decoding=\"async\" width=\"683\" height=\"1024\" src=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/hand-drawing-683x1024.webp\" alt=\"Preliminary concept sketch for design\" class=\"wp-image-14495\" srcset=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/hand-drawing-683x1024.webp 683w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/hand-drawing-200x300.webp 200w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/hand-drawing-768x1152.webp 768w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/hand-drawing-8x12.webp 8w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/hand-drawing.webp 1024w\" sizes=\"auto, (max-width: 683px) 100vw, 683px\" \/><\/a><\/figure><p class=\"wp-block-paragraph\">Once you\u2019ve defined the product requirements, it\u2019s time to start thinking visually. Creating a preliminary concept sketch is often the first step in the design phase. At this stage, your sketch doesn\u2019t need to be precise\u2014just a rough representation that helps communicate your vision. This sketch acts as a tool for identifying potential issues early on. For deeper insights into the ideation stage, check out our guide on <a href=\"https:\/\/www.plasticmoulds.net\/from-concept-to-mass-production-a-step-by-step-guide-for-engineers-designers.html\">concept to mass production<\/a>.<\/p><p class=\"wp-block-paragraph\">For example, if you\u2019re designing a housing unit for an electronic device, a rough sketch can highlight whether the internal components will fit together and whether there\u2019s sufficient space for heat dissipation. The sketch helps you catch problems that might not be obvious in abstract descriptions. Once the concept is solid, it can lead to more detailed designs and 3D modeling.<\/p><h2 class=\"wp-block-heading\">3. Initial Materials Selection<\/h2><p class=\"wp-block-paragraph\">At this stage, you need to consider the materials you\u2019ll use in the final product. Materials selection is essential not only for functionality and durability but also for manufacturability. Different materials offer various benefits, such as strength, flexibility, resistance to heat, and ease of molding. You can learn more about <a href=\"https:\/\/en.wikipedia.org\/wiki\/Thermoplastic\" target=\"_blank\" rel=\"nofollow noopener\">thermoplastic properties<\/a> from authority resources like Wikipedia.<\/p><p class=\"wp-block-paragraph\">If you\u2019re designing a product with a plastic casing, for instance, you\u2019ll likely use injection-moldable thermoplastics like ABS (Acrylonitrile Butadiene Styrene) or polycarbonate. ABS is often chosen for its strength, impact resistance, and ease of injection molding, which makes it ideal for consumer electronics housings. Understanding material properties helps inform your design decisions\u2014how thick should walls be? Will the material be able to withstand repeated use? These questions guide your decisions early in the design process.<\/p><div class=\"wp-block-stackable-columns stk-block-columns stk-block stk-a721083\" data-block-id=\"a721083\"><div class=\"stk-row stk-inner-blocks stk-block-content stk-content-align stk-a721083-column\"><div class=\"wp-block-stackable-column stk-block-column stk-column stk-block stk-98e242a\" data-v=\"4\" data-block-id=\"98e242a\"><div class=\"stk-column-wrapper stk-block-column__content stk-container stk-98e242a-container stk--no-background stk--no-padding\"><div class=\"stk-block-content stk-inner-blocks stk-98e242a-inner-blocks\"><style><p> .material-table-compact{<br \/> font-size:12px !important;<br \/> line-height:1.2 !important;<br \/> margin:20px 0;<br \/> }<\/p><p> .material-table-compact table{<br \/> border-collapse:collapse;<br \/> width:100%;<br \/> }<\/p><p> .material-table-compact th,<br \/> .material-table-compact td{<br \/> padding:6px 10px !important;<br \/> border:1px solid #eee;<br \/> text-align:left;<br \/> }<\/p><p> .material-table-compact thead th{<br \/> background-color:#f8f9fa;<br \/> color:#1a1a2e;<br \/> font-weight:700;<br \/> }<\/p><p> .material-table-compact tbody tr:nth-child(even){<br \/> background-color:#fafafa;<br \/> }<br \/><\/style><figure class=\"wp-block-table is-style-stripes material-table-compact\"><table class=\"has-fixed-layout\"><thead><tr><th>Material Name<\/th><th>Abbr.<\/th><th>Common Applications<\/th><\/tr><\/thead><tbody><tr><td>General Purpose Polystyrene<\/td><td>PS<\/td><td>Lampshade, instrument housing, toys, etc.<\/td><\/tr><tr><td>Teflon, PFA<\/td><td>Teflon\/PFA<\/td><td>Chemical fittings, mechanical parts<\/td><\/tr><tr><td>ETFE<\/td><td>ETFE<\/td><td>Chemical fittings, mechanical parts<\/td><\/tr><tr><td>Acrylonitrile Butadiene Styrene<\/td><td>ABS<\/td><td>Instrument housing, House ware, advanced toys<\/td><\/tr><tr><td>Acrylonitrile Styrene<\/td><td>AS(SAN)<\/td><td>Daily transparent containers<\/td><\/tr><tr><td>Acrylonitrile Styrene acrylate<\/td><td>ASA<\/td><td>Outdoor furniture, car outer mirror housing<\/td><\/tr><tr><td>Butadiene Styrene<\/td><td>BS(BDS)<\/td><td>Special packaging, food containers, pen<\/td><\/tr><tr><td>Cellulose Acetate<\/td><td>CA<\/td><td>Tool handles, containers, etc.<\/td><\/tr><tr><td>Cellulose Nitrate<\/td><td>CN<\/td><td>Spectacle frames, toys, etc.<\/td><\/tr><tr><td>Chlorinated Polyethers<\/td><td>PENTON<\/td><td>Substitute for stainless steel<\/td><\/tr><tr><td>Chlorinated Polyethylene<\/td><td>CPE<\/td><td>Building materials, pipe, cable insulation<\/td><\/tr><tr><td>Chlorinated Polypropylene<\/td><td>PPC<\/td><td>Daily necessities, electrical appliances<\/td><\/tr><tr><td>Ethyl Cellulose<\/td><td>EC<\/td><td>Tool handle, sports goods, etc.<\/td><\/tr><tr><td>Ethylene-Propylene Copolymer<\/td><td>FFP<\/td><td>Radar insulation, high frequency instruments<\/td><\/tr><tr><td>Ethylene-Vinyl Acetate<\/td><td>EVA<\/td><td>Soles, film, daily necessities<\/td><\/tr><tr><td>High Density Polyethylene<\/td><td>HDPE<\/td><td>Packaging, buckets, toys<\/td><\/tr><tr><td>High Impact Polystyrene<\/td><td>HIPS<\/td><td>House ware, electrical components<\/td><\/tr><tr><td>Low Density Polyethylene<\/td><td>LDPE<\/td><td>Packaging bags, plastic flowers, wire<\/td><\/tr><tr><td>Methyl Methacrylate-Butadiene<\/td><td>MMB<\/td><td>Machine frame, daily necessities<\/td><\/tr><tr><td>Poly(Butylene Terephthalare)<\/td><td>PBT<\/td><td>Electronic connectors, automotive parts<\/td><\/tr><tr><td>Poly(Ethylene Terephthalare)<\/td><td>PET<\/td><td>Bearings, chains, gears, tapes, etc.<\/td><\/tr><tr><td>Poly(Vinyl Chloride)<\/td><td>PVC<\/td><td>Pipe, wire insulation, sealing, etc.<\/td><\/tr><tr><td>Polyamide-1010<\/td><td>PA-1010<\/td><td>Rope, pipe, gear, mechanical parts<\/td><\/tr><tr><td>Polyamide-6<\/td><td>PA-6<\/td><td>Bearings, gears, tubing, daily necessities<\/td><\/tr><tr><td>Polyamide-66<\/td><td>PA-66<\/td><td>Machinery, automobile, electrical equipment<\/td><\/tr><tr><td>Polyamide-9<\/td><td>PA-9<\/td><td>Mechanical parts, pump, cable jacket<\/td><\/tr><tr><td>Polycarbonate<\/td><td>PC<\/td><td>Transparent parts, resistance to impact parts<\/td><\/tr><tr><td>Polychlorctrifluoreethylene<\/td><td>PCTFE<\/td><td>Transparent mirror, valve fittings<\/td><\/tr><tr><td>Polyethersulfone<\/td><td>PES<\/td><td>Electrical, aircraft and automotive parts<\/td><\/tr><tr><td>Polymethyl Methacrylate<\/td><td>PMMA<\/td><td>Lampshade, windshield, instrument case<\/td><\/tr><tr><td>Polymethyl Methacrylate-Styrene<\/td><td>MMS<\/td><td>Transparent products with heavy loading<\/td><\/tr><tr><td>Polyoxymethylene (POM)<\/td><td>POM<\/td><td>Abrasion resistance, mechanical gear, bearings<\/td><\/tr><tr><td>Polypropylene<\/td><td>PP<\/td><td>Packing bag, packaging, daily necessities<\/td><\/tr><tr><td>Polysulfone<\/td><td>PSU(PSF)<\/td><td>Electrical parts, aircraft parts<\/td><\/tr><tr><td>Polytetrafluoroethylene<\/td><td>PTFE<\/td><td>Radar insulation, high frequency components<\/td><\/tr><\/tbody><\/table><\/figure><\/div><\/div><\/div><\/div><\/div><h2 class=\"wp-block-heading\">4. Design Parts<\/h2><p class=\"wp-block-paragraph\">With your material selection in hand, it\u2019s time to design the parts that will make up your product. This step is crucial because each material behaves differently. The way a thermoplastic like polyethylene expands when heated is quite different from how metals behave. Utilizing a <a href=\"https:\/\/www.plasticmoulds.net\/design-principles-for-plastic-parts.html\">design principles for plastic parts<\/a> framework is highly recommended here.<\/p><figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/injection-molding-design-China.webp\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"682\" src=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/injection-molding-design-China.webp\" alt=\"injection molding design China\" class=\"wp-image-14466\" srcset=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/injection-molding-design-China.webp 1024w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/injection-molding-design-China-300x200.webp 300w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/injection-molding-design-China-768x512.webp 768w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/injection-molding-design-China-18x12.webp 18w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><p class=\"wp-block-paragraph\">In injection molding, for example, the design needs to account for the material\u2019s shrinkage during cooling. If you don\u2019t account for this, you could end up with warped or misshapen parts. A good practice is to include features like draft angles in your design, which help with easy removal of the part from the mold. The more you align the design with the material properties, the easier and more cost-effective the manufacturing process will be.<\/p><h2 class=\"wp-block-heading\">5. Structural Analysis<\/h2><div id=\"twdfm264608\" class=\"twdfm-root\"><header class=\"twdfm-head\"><span class=\"twdfm-eyebrow\">Topworks Plastic Mold &middot; Engineering Guide<\/span><h2 class=\"twdfm-title\">Design for Injection Molding<\/h2><p class=\"twdfm-sub\">Eight checks that decide whether your part molds clean, or fights the tool for its whole life.<\/p><\/header><div class=\"twdfm-shell\"><nav class=\"twdfm-rail\" aria-label=\"Tutorial sections\"><button type=\"button\" class=\"twdfm-tab is-active\" data-go=\"wall\"><i>1<\/i><span>Wall thickness<\/span><\/button><button type=\"button\" class=\"twdfm-tab\" data-go=\"ribs\"><i>2<\/i><span>Ribs<\/span><\/button><button type=\"button\" class=\"twdfm-tab\" data-go=\"draft\"><i>3<\/i><span>Draft angle<\/span><\/button><button type=\"button\" class=\"twdfm-tab\" data-go=\"radii\"><i>4<\/i><span>Corner radii<\/span><\/button><button type=\"button\" class=\"twdfm-tab\" data-go=\"boss\"><i>5<\/i><span>Bosses<\/span><\/button><button type=\"button\" class=\"twdfm-tab\" data-go=\"action\"><i>6<\/i><span>Undercuts<\/span><\/button><button type=\"button\" class=\"twdfm-tab\" data-go=\"gate\"><i>7<\/i><span>Gate &amp; flow<\/span><\/button><button type=\"button\" class=\"twdfm-tab\" data-go=\"tol\"><i>8<\/i><span>Shrink &amp; tolerance<\/span><\/button><button type=\"button\" class=\"twdfm-tab\" data-go=\"quiz\"><i>&#10003;<\/i><span>Self-check<\/span><\/button><\/nav><div class=\"twdfm-panes\"><section class=\"twdfm-pane is-open\" data-pane=\"wall\"><h3 class=\"twdfm-h3\">Wall thickness rules the whole job<\/h3><p>Wall thickness sets cycle time, sink marks, warpage and fill pressure. Cooling time rises with the square of the wall. Double the wall and you roughly quadruple the time the part sits in the tool.<\/p><p>The second rule matters just as much: keep the wall <em>uniform<\/em>. Plastic shrinks as it cools. A thick zone cools last, keeps shrinking after the gate freezes, and pulls the surface in. That is a sink mark. If the skin is stiff enough to resist, the shrinkage tears a void inside instead.<\/p><div class=\"twdfm-callout\"><b>Rule of thumb<\/b><p>Hold the nominal wall within &plusmn;10% across the part. Where a change is unavoidable, keep the step under 25% of the nominal wall and blend it over a length of at least 3&times; wall. Never step the wall with a square shoulder.<\/p><\/div><div class=\"twdfm-lab\"><div class=\"twdfm-controls\"><label class=\"twdfm-field\"><span>Resin<\/span><select data-el=\"wallMat\"><\/select><\/label><label class=\"twdfm-field\"><span>Nominal wall <b data-el=\"wallTOut\">2.3 mm<\/b><\/span><input type=\"range\" data-el=\"wallT\" min=\"0.5\" max=\"6\" step=\"0.1\" value=\"2.3\"><\/label><label class=\"twdfm-field\"><span>Thick zone <b data-el=\"wallKOut\">1.8&times;<\/b><\/span><input type=\"range\" data-el=\"wallK\" min=\"1\" max=\"3\" step=\"0.05\" value=\"1.8\"><\/label><label class=\"twdfm-field\"><span>Longest flow path <b data-el=\"wallLOut\">180 mm<\/b><\/span><input type=\"range\" data-el=\"wallL\" min=\"30\" max=\"600\" step=\"10\" value=\"180\"><\/label><\/div><div class=\"twdfm-stage\"><svg data-el=\"wallSvg\" viewBox=\"0 0 640 300\" role=\"img\" aria-label=\"Wall thickness cross section\"><\/svg><\/div><div class=\"twdfm-readout\" data-el=\"wallCards\"><\/div><\/div><p class=\"twdfm-fine\">Cooling time is a first-order estimate from the one-dimensional plate solution. It ignores gate freeze-off, hot runner effects and mold cooling layout. Treat it as a comparison tool, not a quote.<\/p><\/section><section class=\"twdfm-pane\" data-pane=\"ribs\"><h3 class=\"twdfm-h3\">Stiffness comes from ribs, not from thicker walls<\/h3><p>Bending stiffness scales with height cubed. A rib 3&times; the wall height adds far more stiffness than doubling the wall, and it costs almost nothing in cycle time. This is the single highest-value move in plastic part design.<\/p><p>The catch is the rib root. Where the rib meets the wall, material mass builds up. That local thick spot cools last and pulls a sink mark onto the show surface directly opposite the rib.<\/p><div class=\"twdfm-callout\"><b>Rib geometry<\/b><p>Base thickness 0.5&ndash;0.6&times; wall for amorphous resins, 0.4&ndash;0.5&times; for high-shrink semi-crystallines. Height up to 3&times; wall. Draft 0.5&ndash;1.5&deg; per side. Root radius 0.25&ndash;0.5&times; wall. Spacing at least 2&times; wall so the steel between ribs still cools.<\/p><\/div><div class=\"twdfm-lab\"><div class=\"twdfm-controls\"><label class=\"twdfm-field\"><span>Resin family<\/span><select data-el=\"ribFam\"><option value=\"am\">Amorphous (ABS, PC, PS, PMMA)<\/option><option value=\"sc\">Semi-crystalline (PP, PE, PA, POM)<\/option><\/select><\/label><label class=\"twdfm-field\"><span>Nominal wall <b data-el=\"ribTOut\">2.5 mm<\/b><\/span><input type=\"range\" data-el=\"ribT\" min=\"1\" max=\"5\" step=\"0.1\" value=\"2.5\"><\/label><label class=\"twdfm-field\"><span>Rib base \/ wall <b data-el=\"ribROut\">0.60<\/b><\/span><input type=\"range\" data-el=\"ribR\" min=\"0.25\" max=\"1\" step=\"0.01\" value=\"0.6\"><\/label><label class=\"twdfm-field\"><span>Rib height \/ wall <b data-el=\"ribHOut\">3.0&times;<\/b><\/span><input type=\"range\" data-el=\"ribH\" min=\"0.5\" max=\"6\" step=\"0.1\" value=\"3\"><\/label><label class=\"twdfm-field\"><span>Root radius \/ wall <b data-el=\"ribFOut\">0.30<\/b><\/span><input type=\"range\" data-el=\"ribF\" min=\"0\" max=\"0.8\" step=\"0.01\" value=\"0.3\"><\/label><\/div><div class=\"twdfm-stage\"><svg data-el=\"ribSvg\" viewBox=\"0 0 640 320\" role=\"img\" aria-label=\"Rib cross section\"><\/svg><\/div><div class=\"twdfm-readout\" data-el=\"ribCards\"><\/div><\/div><div class=\"twdfm-callout twdfm-callout--alt\"><b>When the sink still shows<\/b><p>Three fixes, in order of cost: move the rib off the show face, break the opposite face with a texture or a styling groove, or core out the wall behind the rib so the mass balances. Adding hold pressure only hides small sinks and often adds stress instead.<\/p><\/div><\/section><section class=\"twdfm-pane\" data-pane=\"draft\"><h3 class=\"twdfm-h3\">Draft is what lets the part leave the steel<\/h3><p>A molded part shrinks onto the core. Ejector pins then push it off. With no taper, the part drags the full depth of the core and picks up scuff lines, stress whitening or a torn wall. Draft turns that sliding contact into an instant release.<\/p><p>Texture makes it worse. A grained surface is a field of tiny undercuts. Every 0.025&nbsp;mm of texture depth needs roughly 1.5&deg; of extra draft on top of the base requirement.<\/p><div class=\"twdfm-lab\"><div class=\"twdfm-controls\"><label class=\"twdfm-field\"><span>Surface finish<\/span><select data-el=\"drFin\"><\/select><\/label><label class=\"twdfm-field\"><span>Draw depth <b data-el=\"drDOut\">40 mm<\/b><\/span><input type=\"range\" data-el=\"drD\" min=\"5\" max=\"150\" step=\"1\" value=\"40\"><\/label><label class=\"twdfm-field\"><span>Draft per side <b data-el=\"drAOut\">1.0&deg;<\/b><\/span><input type=\"range\" data-el=\"drA\" min=\"0\" max=\"8\" step=\"0.1\" value=\"1\"><\/label><button type=\"button\" class=\"twdfm-btn\" data-el=\"drEject\">Run ejection<\/button><\/div><div class=\"twdfm-stage\"><svg data-el=\"drSvg\" viewBox=\"0 0 640 320\" role=\"img\" aria-label=\"Draft angle and ejection\"><\/svg><\/div><div class=\"twdfm-readout\" data-el=\"drCards\"><\/div><\/div><div class=\"twdfm-callout\"><b>Working numbers<\/b><p>0.5&deg; is the practical floor for a polished vertical face. 1&ndash;2&deg; is the normal default. 3&deg; suits a light grain, 5&deg; and up a coarse one. Deep ribs and tall cores want at least 0.5&deg; per side even when the drawing says the face is critical. Shut-off faces and sealing surfaces are the exception, and they need a written agreement before steel is cut.<\/p><\/div><\/section><section class=\"twdfm-pane\" data-pane=\"radii\"><h3 class=\"twdfm-h3\">Sharp inside corners are stress risers<\/h3><p>A sharp internal corner concentrates stress, blocks flow and creates a local hot spot in the steel. It is also the place parts break first in drop tests. Adding a radius is free at the design stage and expensive after the tool is cut.<\/p><p>The chart below is the classic stress-concentration curve. Below R\/T = 0.3 the factor climbs steeply. Above R\/T = 0.6 you gain almost nothing, and you start adding mass that sinks.<\/p><div class=\"twdfm-lab\"><div class=\"twdfm-controls\"><label class=\"twdfm-field\"><span>Nominal wall <b data-el=\"rdTOut\">2.5 mm<\/b><\/span><input type=\"range\" data-el=\"rdT\" min=\"1\" max=\"5\" step=\"0.1\" value=\"2.5\"><\/label><label class=\"twdfm-field\"><span>Inside radius \/ wall <b data-el=\"rdROut\">0.50<\/b><\/span><input type=\"range\" data-el=\"rdR\" min=\"0.05\" max=\"1\" step=\"0.01\" value=\"0.5\"><\/label><\/div><div class=\"twdfm-stage twdfm-stage--split\"><svg data-el=\"rdSvgA\" viewBox=\"0 0 320 260\" role=\"img\" aria-label=\"Corner geometry\"><\/svg><svg data-el=\"rdSvgB\" viewBox=\"0 0 320 260\" role=\"img\" aria-label=\"Stress concentration chart\"><\/svg><\/div><div class=\"twdfm-readout\" data-el=\"rdCards\"><\/div><\/div><div class=\"twdfm-callout\"><b>Keep the corner wall constant<\/b><p>Outside radius = inside radius + wall thickness. Do that and the material thickness through the corner stays equal to the nominal wall. Use the same inside radius everywhere so the polisher runs one ball cutter, not five.<\/p><\/div><\/section><section class=\"twdfm-pane\" data-pane=\"boss\"><h3 class=\"twdfm-h3\">Bosses: strong enough to hold a screw, thin enough not to sink<\/h3><p>A boss is a rib rolled into a tube. Every rib rule still applies, plus two more. The wall of the boss has to stay thin relative to the nominal wall, and the boss must not sit directly against a side wall, or the two masses merge into one thick lump.<\/p><div class=\"twdfm-lab\"><div class=\"twdfm-controls\"><label class=\"twdfm-field\"><span>Screw<\/span><select data-el=\"bsScrew\"><\/select><\/label><label class=\"twdfm-field\"><span>Fastener type<\/span><select data-el=\"bsType\"><option value=\"tap\">Thread-forming into plastic<\/option><option value=\"insert\">Heat-staked brass insert<\/option><\/select><\/label><label class=\"twdfm-field\"><span>Nominal wall <b data-el=\"bsTOut\">2.5 mm<\/b><\/span><input type=\"range\" data-el=\"bsT\" min=\"1\" max=\"5\" step=\"0.1\" value=\"2.5\"><\/label><label class=\"twdfm-field\"><span>Boss OD \/ screw dia <b data-el=\"bsKOut\">2.20&times;<\/b><\/span><input type=\"range\" data-el=\"bsK\" min=\"1.4\" max=\"3.2\" step=\"0.05\" value=\"2.2\"><\/label><label class=\"twdfm-field\"><span>Boss height <b data-el=\"bsHOut\">12 mm<\/b><\/span><input type=\"range\" data-el=\"bsH\" min=\"3\" max=\"45\" step=\"1\" value=\"12\"><\/label><\/div><div class=\"twdfm-stage\"><svg data-el=\"bsSvg\" viewBox=\"0 0 640 320\" role=\"img\" aria-label=\"Boss cross section\"><\/svg><\/div><div class=\"twdfm-readout\" data-el=\"bsCards\"><\/div><\/div><div class=\"twdfm-callout\"><b>Checklist for every boss<\/b><p>Core the boss from the parting line so the wall stays even. Give the core 0.25&ndash;0.5&deg; draft, or it will not release. Stand the boss off the side wall by at least one wall thickness and tie it back with a gusset. Keep thread engagement at 2&ndash;2.5&times; the screw diameter, and add a counterbore at the mouth so the screw starts straight and the top of the boss does not split.<\/p><\/div><\/section><section class=\"twdfm-pane\" data-pane=\"action\"><h3 class=\"twdfm-h3\">Every undercut buys a moving part in the tool<\/h3><p>The cheapest mold opens in one direction and the part falls out. Anything that traps the part needs a slide, a lifter, a collapsible core or an unscrewing unit. Each one adds cost, adds cycle time, adds a witness line on the part, and adds something that can fail at 200,000 shots.<\/p><p>Pick the features your part actually needs. The panel adds up what they do to the tool.<\/p><div class=\"twdfm-lab\"><div class=\"twdfm-controls twdfm-controls--wide\"><div class=\"twdfm-picks\" data-el=\"acList\"><\/div><\/div><div class=\"twdfm-readout\" data-el=\"acCards\"><\/div><div class=\"twdfm-note\" data-el=\"acNote\"><\/div><\/div><div class=\"twdfm-callout twdfm-callout--alt\"><b>Cheaper ways out<\/b><p>Many undercuts disappear with a small change. Add a pass-through hole in the opposite face so a core pin can form the feature on straight pull. Move the parting line onto a styling break. Split one part into two and weld or clip them. Turn a rigid snap into a shallow bump-off that a flexible resin can strip over. Each of these is worth an hour of CAD work before the RFQ.<\/p><\/div><\/section><section class=\"twdfm-pane\" data-pane=\"gate\"><h3 class=\"twdfm-h3\">The gate decides where the weak lines land<\/h3><p>Melt enters at the gate and races outward. Where two flow fronts meet, they form a weld line. That line can be 20&ndash;60% weaker than the bulk material, and on a glass-filled resin it is worse, because the fibers lie parallel to the line instead of across it.<\/p><p>Click anywhere in the plate to move the gate and watch the fill pattern change. Openings split the flow and put a weld line downstream of every hole.<\/p><div class=\"twdfm-lab\"><div class=\"twdfm-controls\"><label class=\"twdfm-field\"><span>Resin<\/span><select data-el=\"gtMat\"><\/select><\/label><label class=\"twdfm-field\"><span>Wall thickness <b data-el=\"gtTOut\">2.0 mm<\/b><\/span><input type=\"range\" data-el=\"gtT\" min=\"0.6\" max=\"5\" step=\"0.1\" value=\"2\"><\/label><div class=\"twdfm-btnrow\"><button type=\"button\" class=\"twdfm-btn twdfm-btn--sm\" data-gate=\"c\">Center gate<\/button><button type=\"button\" class=\"twdfm-btn twdfm-btn--sm\" data-gate=\"e\">Edge gate<\/button><button type=\"button\" class=\"twdfm-btn twdfm-btn--sm\" data-gate=\"k\">Corner gate<\/button><button type=\"button\" class=\"twdfm-btn twdfm-btn--sm\" data-el=\"gtTwo\">Add 2nd gate<\/button><\/div><\/div><div class=\"twdfm-stage twdfm-stage--canvas\"><canvas data-el=\"gtCanvas\" width=\"720\" height=\"420\" aria-label=\"Fill pattern simulation\"><\/canvas><p class=\"twdfm-hint\">Click the plate to place the gate.<\/p><\/div><div class=\"twdfm-readout\" data-el=\"gtCards\"><\/div><\/div><h4 class=\"twdfm-h4\">Choosing a gate type<\/h4><div class=\"twdfm-table-wrap\"><table class=\"twdfm-table\"><thead><tr><th>Gate<\/th><th>Auto de-gate<\/th><th>Vestige<\/th><th>Best for<\/th><th>Watch out for<\/th><\/tr><\/thead><tbody><tr><td>Edge \/ side<\/td><td>No<\/td><td>Trimmed nub<\/td><td>Flat parts, most tooling<\/td><td>Manual trim adds labor<\/td><\/tr><tr><td>Submarine (tunnel)<\/td><td>Yes<\/td><td>Pin mark, hidden<\/td><td>Small to medium parts<\/td><td>High shear, not for filled or brittle resins<\/td><\/tr><tr><td>Hot tip \/ valve gate<\/td><td>Yes<\/td><td>Small dimple or flat<\/td><td>Cosmetic parts, no runner scrap<\/td><td>Highest tool cost, needs controller<\/td><\/tr><tr><td>Direct sprue<\/td><td>No<\/td><td>Large scar<\/td><td>Thick single-cavity parts<\/td><td>Sink under the gate, long cooling<\/td><\/tr><tr><td>Fan<\/td><td>No<\/td><td>Wide trimmed edge<\/td><td>Wide flat panels, low warp<\/td><td>Needs trim fixture<\/td><\/tr><tr><td>Diaphragm<\/td><td>No<\/td><td>Ring on the bore<\/td><td>Round parts needing concentricity<\/td><td>Secondary machining<\/td><\/tr><\/tbody><\/table><\/div><div class=\"twdfm-callout\"><b>Three questions to settle before steel<\/b><p>Where can a gate vestige be accepted? Which surface is cosmetic, so the weld line must be moved off it? Is the longest flow path within reach for this resin at this wall? Answer those and the filling analysis usually confirms what you already chose.<\/p><\/div><\/section><section class=\"twdfm-pane\" data-pane=\"tol\"><h3 class=\"twdfm-h3\">Shrinkage first, tolerance second<\/h3><p>The cavity is cut larger than the part. How much larger depends on the resin, the wall, the hold pressure and the direction of flow. Semi-crystalline resins shrink two to four times more than amorphous ones, and glass fiber makes shrinkage directional.<\/p><p>That is why a tolerance that is routine in aluminum can be impossible in PP. Ask for tight numbers only where the function needs them, and say which datum they are measured from.<\/p><div class=\"twdfm-lab\"><div class=\"twdfm-controls\"><label class=\"twdfm-field\"><span>Resin<\/span><select data-el=\"tlMat\"><\/select><\/label><label class=\"twdfm-field\"><span>Nominal dimension <b data-el=\"tlLOut\">100.0 mm<\/b><\/span><input type=\"range\" data-el=\"tlL\" min=\"2\" max=\"400\" step=\"1\" value=\"100\"><\/label><label class=\"twdfm-field\"><span>Feature formed by<\/span><select data-el=\"tlSrc\"><option value=\"one\">One mold half (best case)<\/option><option value=\"pl\">Across the parting line<\/option><option value=\"sl\">By a slide or lifter<\/option><\/select><\/label><\/div><div class=\"twdfm-readout\" data-el=\"tlCards\"><\/div><div class=\"twdfm-stage\"><svg data-el=\"tlSvg\" viewBox=\"0 0 640 200\" role=\"img\" aria-label=\"Tolerance band\"><\/svg><\/div><\/div><div class=\"twdfm-callout\"><b>What actually moves a dimension<\/b><p>Hold pressure and hold time change shrinkage more than any other setting. Mold temperature comes next, then wall thickness. A part measured hot off the press is not the part you get 48 hours later, especially in PA and POM. Set your inspection window and write it on the drawing.<\/p><\/div><p class=\"twdfm-fine\">Values shown follow the general shape of the SPI and DIN&nbsp;16742 guidance for standard and fine tolerance grades. Use them to sanity-check a drawing early. A final capability statement comes from the mold flow study and the first-article report.<\/p><\/section><section class=\"twdfm-pane\" data-pane=\"quiz\"><h3 class=\"twdfm-h3\">Self-check<\/h3><p>Eight questions from the sections above. Answers explain themselves as you go.<\/p><div data-el=\"qzWrap\" class=\"twdfm-quiz\"><\/div><div class=\"twdfm-readout\" data-el=\"qzScore\"><\/div><\/section><\/div><\/div><footer class=\"twdfm-foot\"><p><b>Send us the model, not the drawing alone.<\/b> A STEP file plus a note on the cosmetic face and the critical dimensions is enough for a full DFM report. We mark wall variation, draft misses, undercuts and likely weld lines, then send the mold layout with it.<\/p><\/footer><\/div><style> #twdfm264608.twdfm-root{--tw-ink:#11181f;--tw-ink2:#33424f;--tw-mute:#68798a;--tw-line:#dbe3ea;--tw-panel:#f3f6f8;--tw-paper:#ffffff;--tw-steel:#7d94a6;--tw-steel-d:#42576a;--tw-blue:#0f5f8f;--tw-resin:#ea6a17;--tw-resin-l:#fdf0e5;--tw-ok:#0d7a55;--tw-warn:#b06f00;--tw-bad:#bb3325;--tw-mono:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,\"Liberation Mono\",monospace;--tw-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif;font-family:var(--tw-sans);color:var(--tw-ink);line-height:1.65;background:var(--tw-paper);border:1px solid var(--tw-line);border-radius:2px;max-width:1180px;margin:2.2rem auto;overflow:hidden;-webkit-font-smoothing:antialiased;} #twdfm264608 *{box-sizing:border-box;} #twdfm264608 .twdfm-head{padding:2.4rem 2rem 1.9rem;border-bottom:1px solid var(--tw-line);background:repeating-linear-gradient(0deg,rgba(15,95,143,.045) 0 1px,transparent 1px 26px), repeating-linear-gradient(90deg,rgba(15,95,143,.045) 0 1px,transparent 1px 26px), var(--tw-paper);} #twdfm264608 .twdfm-eyebrow{display:inline-block;font-family:var(--tw-mono);font-size:.68rem;letter-spacing:.18em;text-transform:uppercase;color:var(--tw-resin);margin-bottom:.7rem;} #twdfm264608 .twdfm-title{font-size:clamp(1.7rem,3.4vw,2.5rem);line-height:1.1;margin:0 0 .6rem;font-weight:800;letter-spacing:-.02em;color:var(--tw-ink);} #twdfm264608 .twdfm-sub{margin:0;max-width:52ch;color:var(--tw-ink2);font-size:1.02rem;} #twdfm264608 .twdfm-shell{display:flex;align-items:stretch;} #twdfm264608 .twdfm-rail{flex:0 0 218px;border-right:1px solid var(--tw-line);background:var(--tw-panel);padding:1rem .6rem;display:flex;flex-direction:column;gap:.15rem;} #twdfm264608 .twdfm-tab{display:flex;align-items:center;gap:.65rem;width:100%;text-align:left;background:transparent;border:0;border-radius:2px;cursor:pointer;padding:.62rem .6rem;color:var(--tw-ink2);font-family:var(--tw-sans);font-size:.92rem;font-weight:600;line-height:1.25;transition:background .15s,color .15s;} #twdfm264608 .twdfm-tab i{flex:0 0 26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-style:normal;font-family:var(--tw-mono);font-size:.76rem;border:1.5px solid var(--tw-steel);color:var(--tw-steel-d);background:var(--tw-paper);transition:background .15s,border-color .15s,color .15s;} #twdfm264608 .twdfm-tab:hover{background:rgba(15,95,143,.07);color:var(--tw-ink);} #twdfm264608 .twdfm-tab.is-active{background:var(--tw-paper);color:var(--tw-ink);box-shadow:inset 3px 0 0 var(--tw-resin);} #twdfm264608 .twdfm-tab.is-active i{background:var(--tw-resin);border-color:var(--tw-resin);color:#fff;} #twdfm264608 .twdfm-tab:focus-visible{outline:2px solid var(--tw-blue);outline-offset:-2px;} #twdfm264608 .twdfm-panes{flex:1 1 auto;min-width:0;padding:1.9rem 2rem 2.2rem;} #twdfm264608 .twdfm-pane{display:none;} #twdfm264608 .twdfm-pane.is-open{display:block;} #twdfm264608 .twdfm-pane p{margin:0 0 .9rem;max-width:70ch;color:var(--tw-ink2);} #twdfm264608 .twdfm-h3{font-size:1.32rem;font-weight:800;letter-spacing:-.01em;margin:0 0 .9rem;color:var(--tw-ink);} #twdfm264608 .twdfm-h4{font-size:1rem;font-weight:700;margin:1.8rem 0 .7rem;color:var(--tw-ink);font-family:var(--tw-mono);text-transform:uppercase;letter-spacing:.08em;} #twdfm264608 .twdfm-callout{border-left:3px solid var(--tw-resin);background:var(--tw-resin-l);padding:.9rem 1.1rem;margin:1.2rem 0;border-radius:0 2px 2px 0;} #twdfm264608 .twdfm-callout--alt{border-left-color:var(--tw-blue);background:#eef5fa;} #twdfm264608 .twdfm-callout b{display:block;font-family:var(--tw-mono);font-size:.72rem;letter-spacing:.12em;text-transform:uppercase;margin-bottom:.35rem;color:var(--tw-ink);} #twdfm264608 .twdfm-callout p{margin:0;font-size:.95rem;} #twdfm264608 .twdfm-fine{font-size:.83rem;color:var(--tw-mute);max-width:70ch;} #twdfm264608 .twdfm-lab{border:1px solid var(--tw-line);border-radius:2px;margin:1.4rem 0;background:var(--tw-paper);} #twdfm264608 .twdfm-controls{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:1rem 1.4rem;padding:1.1rem 1.2rem;border-bottom:1px solid var(--tw-line);background:var(--tw-panel);} #twdfm264608 .twdfm-controls--wide{grid-template-columns:1fr;} #twdfm264608 .twdfm-field{display:flex;flex-direction:column;gap:.35rem;} #twdfm264608 .twdfm-field > span{font-family:var(--tw-mono);font-size:.72rem;letter-spacing:.06em;text-transform:uppercase;color:var(--tw-mute);display:flex;justify-content:space-between;align-items:baseline;gap:.5rem;} #twdfm264608 .twdfm-field > span b{color:var(--tw-ink);font-size:.86rem;letter-spacing:0;} #twdfm264608 .twdfm-field select{width:100%;padding:.42rem .5rem;border:1px solid var(--tw-line);border-radius:2px;background:var(--tw-paper);font-family:var(--tw-sans);font-size:.88rem;color:var(--tw-ink);} #twdfm264608 .twdfm-field input[type=range]{width:100%;accent-color:#ea6a17;margin:0;} #twdfm264608 .twdfm-btnrow{display:flex;flex-wrap:wrap;gap:.4rem;align-items:flex-end;} #twdfm264608 .twdfm-btn{border:1px solid var(--tw-steel-d);background:var(--tw-paper);color:var(--tw-ink);font-family:var(--tw-mono);font-size:.76rem;letter-spacing:.05em;text-transform:uppercase;padding:.5rem .85rem;border-radius:2px;cursor:pointer;transition:background .15s,color .15s;} #twdfm264608 .twdfm-btn:hover{background:var(--tw-steel-d);color:#fff;} #twdfm264608 .twdfm-btn.is-on{background:var(--tw-resin);border-color:var(--tw-resin);color:#fff;} #twdfm264608 .twdfm-btn--sm{padding:.4rem .65rem;font-size:.7rem;} #twdfm264608 .twdfm-stage{padding:1rem 1.2rem;background:var(--tw-paper);} #twdfm264608 .twdfm-stage svg{width:100%;height:auto;display:block;} #twdfm264608 .twdfm-stage--split{display:grid;grid-template-columns:1fr 1fr;gap:1rem;} #twdfm264608 .twdfm-stage--canvas canvas{width:100%;height:auto;display:block;cursor:crosshair;border:1px solid var(--tw-line);} #twdfm264608 .twdfm-hint{font-family:var(--tw-mono);font-size:.72rem;color:var(--tw-mute);margin:.5rem 0 0 !important;} #twdfm264608 .twdfm-readout{display:grid;grid-template-columns:repeat(auto-fit,minmax(168px,1fr));gap:1px;background:var(--tw-line);border-top:1px solid var(--tw-line);} #twdfm264608 .twdfm-card{background:var(--tw-paper);padding:.85rem 1rem;} #twdfm264608 .twdfm-card em{display:block;font-style:normal;font-family:var(--tw-mono);font-size:.68rem;letter-spacing:.09em;text-transform:uppercase;color:var(--tw-mute);margin-bottom:.28rem;} #twdfm264608 .twdfm-card strong{display:block;font-family:var(--tw-mono);font-size:1.22rem;font-weight:700;line-height:1.2;} #twdfm264608 .twdfm-card small{display:block;font-size:.79rem;color:var(--tw-mute);margin-top:.25rem;line-height:1.45;} #twdfm264608 .twdfm-note{padding:.9rem 1.2rem;border-top:1px solid var(--tw-line);font-size:.9rem;color:var(--tw-ink2);} #twdfm264608 .twdfm-picks{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:.5rem;} #twdfm264608 .twdfm-pick{display:flex;gap:.6rem;align-items:flex-start;padding:.6rem .7rem;cursor:pointer;border:1px solid var(--tw-line);border-radius:2px;background:var(--tw-paper);font-size:.88rem;} #twdfm264608 .twdfm-pick:hover{border-color:var(--tw-steel);} #twdfm264608 .twdfm-pick input{margin-top:.25rem;accent-color:#ea6a17;} #twdfm264608 .twdfm-pick span{display:block;} #twdfm264608 .twdfm-pick span i{display:block;font-style:normal;font-size:.76rem;color:var(--tw-mute);} #twdfm264608 .twdfm-table-wrap{overflow-x:auto;border:1px solid var(--tw-line);border-radius:2px;} #twdfm264608 .twdfm-table{width:100%;border-collapse:collapse;font-size:.87rem;min-width:640px;} #twdfm264608 .twdfm-table th{text-align:left;background:var(--tw-panel);padding:.6rem .75rem;border-bottom:1px solid var(--tw-line);font-family:var(--tw-mono);font-size:.7rem;letter-spacing:.08em;text-transform:uppercase;color:var(--tw-ink2);} #twdfm264608 .twdfm-table td{padding:.6rem .75rem;border-bottom:1px solid var(--tw-line);color:var(--tw-ink2);vertical-align:top;} #twdfm264608 .twdfm-table tr:last-child td{border-bottom:0;} #twdfm264608 .twdfm-quiz{margin:1.2rem 0;} #twdfm264608 .twdfm-q{border:1px solid var(--tw-line);border-radius:2px;padding:1rem 1.1rem;margin-bottom:.8rem;} #twdfm264608 .twdfm-q h5{margin:0 0 .7rem;font-size:.98rem;font-weight:700;color:var(--tw-ink);} #twdfm264608 .twdfm-q h5 b{font-family:var(--tw-mono);color:var(--tw-resin);margin-right:.5rem;font-weight:700;} #twdfm264608 .twdfm-opt{display:block;width:100%;text-align:left;background:var(--tw-paper);cursor:pointer;border:1px solid var(--tw-line);border-radius:2px;padding:.5rem .7rem;margin-bottom:.35rem;font-family:var(--tw-sans);font-size:.9rem;color:var(--tw-ink2);transition:border-color .15s,background .15s;} #twdfm264608 .twdfm-opt:hover{border-color:var(--tw-steel);} #twdfm264608 .twdfm-exp{margin:.6rem 0 0;padding:.6rem .75rem;background:var(--tw-panel);border-radius:2px;font-size:.87rem;color:var(--tw-ink2);display:none;} #twdfm264608 .twdfm-foot{border-top:1px solid var(--tw-line);background:var(--tw-panel);padding:1.3rem 2rem;} #twdfm264608 .twdfm-foot p{margin:0;font-size:.92rem;color:var(--tw-ink2);max-width:78ch;} #twdfm264608 .twdfm-foot b{color:var(--tw-ink);} @media (max-width:900px){#twdfm264608 .twdfm-shell{flex-direction:column;} #twdfm264608 .twdfm-rail{flex:none;width:100%;border-right:0;border-bottom:1px solid var(--tw-line);flex-direction:row;overflow-x:auto;padding:.5rem;gap:.3rem;scrollbar-width:thin;} #twdfm264608 .twdfm-tab{width:auto;white-space:nowrap;flex:0 0 auto;} #twdfm264608 .twdfm-tab.is-active{box-shadow:inset 0 -3px 0 var(--tw-resin);} #twdfm264608 .twdfm-panes{padding:1.3rem 1.1rem 1.7rem;} #twdfm264608 .twdfm-head{padding:1.7rem 1.1rem 1.3rem;} #twdfm264608 .twdfm-foot{padding:1.1rem 1.1rem;} #twdfm264608 .twdfm-stage--split{grid-template-columns:1fr;} } @media (prefers-reduced-motion:reduce){#twdfm264608 *{transition:none !important;animation:none !important;} } <\/style><script> (function(){ \"use strict\"; function boot(){ var ROOT = document.getElementById(\"twdfm264608\"); if(!ROOT || ROOT.getAttribute(\"data-ready\") === \"1\"){ return; } ROOT.setAttribute(\"data-ready\",\"1\"); var NS = \"http:\/\/www.w3.org\/2000\/svg\"; \/* ---------- tiny helpers ---------- *\/ function el(sel){ return ROOT.querySelector('[data-el=\"' + sel + '\"]'); } function all(sel){ return Array.prototype.slice.call(ROOT.querySelectorAll(sel)); } function S(tag, attrs){ var n = document.createElementNS(NS, tag), k; for(k in attrs){ if(Object.prototype.hasOwnProperty.call(attrs,k)){ n.setAttribute(k, attrs[k]); } } return n; } function txt(x, y, s, opt){ opt = opt || {}; var t = S(\"text\", { x:x, y:y, fill: opt.fill || \"#33424f\", \"font-size\": opt.size || 12, \"font-family\": opt.mono ? \"ui-monospace,Menlo,Consolas,monospace\" : \"-apple-system,Segoe UI,Roboto,Arial,sans-serif\", \"font-weight\": opt.weight || 400, \"text-anchor\": opt.anchor || \"start\" }); t.textContent = s; return t; } function clear(node){ while(node.firstChild){ node.removeChild(node.firstChild); } } function card(label, value, note, color){ var d = document.createElement(\"div\"); d.className = \"twdfm-card\"; var e = document.createElement(\"em\"); e.textContent = label; var s = document.createElement(\"strong\"); s.textContent = value; if(color){ s.style.color = color; } d.appendChild(e); d.appendChild(s); if(note){ var n = document.createElement(\"small\"); n.textContent = note; d.appendChild(n); } return d; } function fill(node, cards){ clear(node); for(var i=0;i<cards.length;i++){ node.appendChild(cards[i]); } } var OK = \"#0d7a55\", WARN = \"#b06f00\", BAD = \"#bb3325\"; var STEEL = \"#7d94a6\", STEEL_D = \"#42576a\", RESIN = \"#ea6a17\", INK = \"#11181f\", MUTE = \"#68798a\"; \/* dimension line with end ticks and a label *\/ function dim(g, x1, y1, x2, y2, label, off){ off = off || 0; var dx = x2-x1, dy = y2-y1, L = Math.sqrt(dx*dx+dy*dy) || 1; var nx = -dy\/L, ny = dx\/L; var ax = x1 + nx*off, ay = y1 + ny*off, bx = x2 + nx*off, by = y2 + ny*off; g.appendChild(S(\"line\",{x1:ax,y1:ay,x2:bx,y2:by,stroke:\"#0f5f8f\",\"stroke-width\":1})); g.appendChild(S(\"line\",{x1:ax-nx*4,y1:ay-ny*4,x2:ax+nx*4,y2:ay+ny*4,stroke:\"#0f5f8f\",\"stroke-width\":1})); g.appendChild(S(\"line\",{x1:bx-nx*4,y1:by-ny*4,x2:bx+nx*4,y2:by+ny*4,stroke:\"#0f5f8f\",\"stroke-width\":1})); var t = txt((ax+bx)\/2, (ay+by)\/2 - 5, label, {fill:\"#0f5f8f\", size:11, mono:true, anchor:\"middle\"}); g.appendChild(t); } \/* ===================================================================== * MATERIAL DATA * shrink %, wall min\/max\/typ (mm), L\/T flow ratio, thermal diffusivity * (mm2\/s, effective), melt \/ mold \/ eject temps (C), family * ===================================================================*\/ var MATS = [ {k:\"abs\", n:\"ABS\", sh:[0.4,0.7], w:[1.1,3.5,2.3], lt:175, a:0.090, tm:230, tw:50, te:85, fam:\"am\"}, {k:\"pp\", n:\"PP (homopolymer)\", sh:[1.2,2.0], w:[0.8,3.0,1.6], lt:280, a:0.060, tm:230, tw:30, te:90, fam:\"sc\"}, {k:\"pe\", n:\"HDPE\", sh:[1.5,3.0], w:[0.9,4.0,1.8], lt:250, a:0.070, tm:220, tw:30, te:95, fam:\"sc\"}, {k:\"ps\", n:\"PS \/ HIPS\", sh:[0.4,0.7], w:[0.9,4.0,1.8], lt:250, a:0.090, tm:220, tw:40, te:80, fam:\"am\"}, {k:\"pc\", n:\"PC\", sh:[0.5,0.7], w:[1.0,4.0,2.4], lt:110, a:0.110, tm:300, tw:85, te:130, fam:\"am\"}, {k:\"pcabs\",n:\"PC\/ABS\", sh:[0.5,0.7], w:[1.2,3.5,2.5], lt:150, a:0.100, tm:260, tw:70, te:110, fam:\"am\"}, {k:\"pmma\", n:\"PMMA (acrylic)\", sh:[0.2,0.6], w:[0.8,4.0,2.5], lt:130, a:0.090, tm:240, tw:60, te:95, fam:\"am\"}, {k:\"pa66\", n:\"PA66 unfilled\", sh:[1.0,2.0], w:[0.8,3.0,1.8], lt:200, a:0.100, tm:285, tw:80, te:120, fam:\"sc\"}, {k:\"pa66g\",n:\"PA66-GF30\", sh:[0.3,1.0], w:[1.0,4.0,2.2], lt:130, a:0.130, tm:290, tw:90, te:130, fam:\"sc\"}, {k:\"pom\", n:\"POM (acetal)\", sh:[1.8,2.5], w:[0.8,3.0,1.8], lt:180, a:0.090, tm:205, tw:90, te:130, fam:\"sc\"}, {k:\"tpu\", n:\"TPU\", sh:[0.8,1.6], w:[1.0,3.0,2.0], lt:130, a:0.080, tm:210, tw:30, te:70, fam:\"sc\"}, {k:\"pbt\", n:\"PBT-GF30\", sh:[0.3,0.9], w:[1.0,3.5,2.0], lt:150, a:0.120, tm:255, tw:80, te:120, fam:\"sc\"} ]; function matByKey(k){ for(var i=0;i<MATS.length;i++){ if(MATS[i].k === k){ return MATS[i]; } } return MATS[0]; } function fillMatSelect(node, def){ clear(node); for(var i=0;i<MATS.length;i++){ var o = document.createElement(\"option\"); o.value = MATS[i].k; o.textContent = MATS[i].n; if(MATS[i].k === def){ o.selected = true; } node.appendChild(o); } } function coolTime(s, m){ \/* 1D plate, mean temperature criterion *\/ var r = (8\/(Math.PI*Math.PI)) * (m.tm - m.tw) \/ (m.te - m.tw); if(r < 1.05){ r = 1.05; } return (s*s \/ (Math.PI*Math.PI*m.a)) * Math.log(r); } \/* ===================================================================== * TAB NAVIGATION * ===================================================================*\/ var tabs = all(\".twdfm-tab\"), panes = all(\".twdfm-pane\"); function show(key){ var i; for(i=0;i<tabs.length;i++){ if(tabs[i].getAttribute(\"data-go\") === key){ tabs[i].classList.add(\"is-active\"); } else { tabs[i].classList.remove(\"is-active\"); } } for(i=0;i<panes.length;i++){ if(panes[i].getAttribute(\"data-pane\") === key){ panes[i].classList.add(\"is-open\"); } else { panes[i].classList.remove(\"is-open\"); } } if(key === \"gate\"){ drawGate(); } } tabs.forEach(function(t){ t.addEventListener(\"click\", function(){ show(t.getAttribute(\"data-go\")); }); }); \/* ===================================================================== * 1. WALL THICKNESS * ===================================================================*\/ var wMat = el(\"wallMat\"), wT = el(\"wallT\"), wK = el(\"wallK\"), wL = el(\"wallL\"); fillMatSelect(wMat, \"abs\"); function wallUpdate(){ var m = matByKey(wMat.value); var t = parseFloat(wT.value), k = parseFloat(wK.value), L = parseFloat(wL.value); var tThick = t * k; el(\"wallTOut\").textContent = t.toFixed(1) + \" mm\"; el(\"wallKOut\").textContent = k.toFixed(2) + \"\\u00D7\"; el(\"wallLOut\").textContent = L.toFixed(0) + \" mm\"; var ct = coolTime(t, m), ctThick = coolTime(tThick, m); var shAvg = (m.sh[0] + m.sh[1]) \/ 2; \/* first-order sink estimate. Volumetric shrink is roughly three times linear shrink, and part of it is recovered by hold pressure. *\/ var sink = 2.5 * (shAvg\/100) * (tThick - t) * 1000; \/* microns *\/ var ltNeed = L \/ t, ltHave = m.lt; var wallState = OK, wallNote = \"Inside the normal range for this resin.\"; if(t < m.w[0]){ wallState = BAD; wallNote = \"Thinner than this resin fills reliably. Expect short shots.\"; } else if(t > m.w[1]){ wallState = BAD; wallNote = \"Thicker than recommended. Voids, sink and long cycles.\"; } else if(t > m.w[1]*0.85 || t < m.w[0]*1.2){ wallState = WARN; wallNote = \"Near the edge of the usable range.\"; } var sinkState = OK, sinkNote = \"Not visible on a gloss surface.\"; if(sink > 60){ sinkState = BAD; sinkNote = \"Clearly visible. Core out the thick zone.\"; } else if(sink > 25){ sinkState = WARN; sinkNote = \"Visible on gloss, hidden by a texture.\"; } var flowState = OK, flowNote = \"Fills on one gate with pressure to spare.\"; if(ltNeed > ltHave){ flowState = BAD; flowNote = \"Beyond single-gate reach. Add a gate or thicken the wall.\"; } else if(ltNeed > ltHave*0.8){ flowState = WARN; flowNote = \"Tight. Needs high injection pressure or a hot runner.\"; } fill(el(\"wallCards\"), [ card(\"Cooling time, nominal wall\", ct.toFixed(1) + \" s\", \"Full cycle roughly \" + (ct+4).toFixed(0) + \"\\u2013\" + (ct+7).toFixed(0) + \" s.\", wallState), card(\"Cooling time, thick zone\", ctThick.toFixed(1) + \" s\", \"The thick spot sets the real cycle.\", ctThick > ct*1.8 ? WARN : OK), card(\"Estimated sink depth\", sink < 1 ? \"<1 \\u00B5m\" : sink.toFixed(0) + \" \\u00B5m\", sinkNote, sinkState), card(\"Flow length \/ wall\", ltNeed.toFixed(0) + \" : 1\", \"This resin reaches about \" + ltHave + \" : 1. \" + flowNote, flowState), card(\"Recommended wall\", m.w[0].toFixed(1) + \"\\u2013\" + m.w[1].toFixed(1) + \" mm\", wallNote + \" Typical \" + m.w[2].toFixed(1) + \" mm.\", wallState), card(\"Shrinkage\", m.sh[0].toFixed(1) + \"\\u2013\" + m.sh[1].toFixed(1) + \" %\", m.fam === \"sc\" ? \"Semi-crystalline. Shrinks more, warps more.\" : \"Amorphous. Low, predictable shrink.\", null) ]); \/* ---- drawing ---- *\/ var svg = el(\"wallSvg\"); clear(svg); var g = S(\"g\", {}); svg.appendChild(g); var px = 26; \/* px per mm at this scale *\/ var y0 = 120; var hNom = Math.max(6, t*px*0.5); var hThk = Math.max(6, tThick*px*0.5); g.appendChild(txt(24, 34, \"SECTION A\\u2013A \\u00B7 wall transition\", {size:12, mono:true, fill:MUTE})); \/* melt-colored part body: thin - blended step - thick *\/ var x1=60, x2=250, x3=250 + Math.max(18, t*px*1.5), x4=560; var d = \"M\" + x1 + \",\" + (y0-hNom\/2) + \" L\" + x2 + \",\" + (y0-hNom\/2) + \" L\" + x3 + \",\" + (y0-hThk\/2) + \" L\" + x4 + \",\" + (y0-hThk\/2) + \" L\" + x4 + \",\" + (y0+hThk\/2) + \" L\" + x3 + \",\" + (y0+hThk\/2) + \" L\" + x2 + \",\" + (y0+hNom\/2) + \" L\" + x1 + \",\" + (y0+hNom\/2) + \" Z\"; g.appendChild(S(\"path\",{d:d, fill:\"#fbdcc2\", stroke:RESIN, \"stroke-width\":1.6, \"stroke-linejoin\":\"round\"})); \/* sink mark on the top face over the thick zone *\/ if(sink > 12){ var depth = Math.min(16, sink\/6); var cx = (x3+x4)\/2; var sd = \"M\" + (cx-46) + \",\" + (y0-hThk\/2) + \" Q\" + cx + \",\" + (y0-hThk\/2+depth) + \" \" + (cx+46) + \",\" + (y0-hThk\/2); g.appendChild(S(\"path\",{d:sd, fill:\"none\", stroke: sink>60?BAD:WARN, \"stroke-width\":2.4})); g.appendChild(txt(cx, y0-hThk\/2-12, \"sink \" + sink.toFixed(0) + \" \\u00B5m\", {size:11, mono:true, anchor:\"middle\", fill: sink>60?BAD:WARN})); } \/* internal void when the section is very heavy *\/ if(tThick > m.w[1]*1.25){ var vx=(x3+x4)\/2, vy=y0; g.appendChild(S(\"ellipse\",{cx:vx+70, cy:vy, rx:Math.min(26,hThk*0.28), ry:Math.min(13,hThk*0.16), fill:\"#ffffff\", stroke:BAD, \"stroke-width\":1.6, \"stroke-dasharray\":\"4 3\"})); g.appendChild(txt(vx+70, vy+hThk\/2+22, \"void risk\", {size:11, mono:true, anchor:\"middle\", fill:BAD})); } dim(g, x1, y0-hNom\/2, x1, y0+hNom\/2, t.toFixed(1), -26); dim(g, x4, y0-hThk\/2, x4, y0+hThk\/2, tThick.toFixed(1), 26); \/* transition rule bar *\/ var need = 3*t*px; var have = x3-x2; var okBlend = have >= need*0.9; g.appendChild(S(\"line\",{x1:x2,y1:225,x2:x3,y2:225,stroke: okBlend?OK:BAD,\"stroke-width\":3})); g.appendChild(txt(x2, 245, \"blend \" + ((x3-x2)\/px).toFixed(1) + \" mm\", {size:11, mono:true, fill: okBlend?OK:BAD})); g.appendChild(S(\"line\",{x1:x2,y1:262,x2:x2+need,y2:262,stroke:STEEL,\"stroke-width\":3,\"stroke-dasharray\":\"5 4\"})); g.appendChild(txt(x2, 282, \"target blend \\u2265 3\\u00D7 wall = \" + (3*t).toFixed(1) + \" mm\", {size:11, mono:true, fill:MUTE})); var stepPct = ((tThick - t)\/t)*100; g.appendChild(txt(60, 300, \"step change \" + stepPct.toFixed(0) + \"% \\u00B7 keep under 25%\", {size:11, mono:true, fill: stepPct>25?BAD:OK})); } [wMat, wT, wK, wL].forEach(function(n){ n.addEventListener(\"input\", wallUpdate); n.addEventListener(\"change\", wallUpdate); }); \/* ===================================================================== * 2. RIBS * ===================================================================*\/ var rFam = el(\"ribFam\"), rT = el(\"ribT\"), rR = el(\"ribR\"), rH = el(\"ribH\"), rF = el(\"ribF\"); function ribUpdate(){ var fam = rFam.value; var T = parseFloat(rT.value), ratio = parseFloat(rR.value); var hR = parseFloat(rH.value), fR = parseFloat(rF.value); var tRib = T*ratio, hRib = T*hR, rad = T*fR; el(\"ribTOut\").textContent = T.toFixed(1) + \" mm\"; el(\"ribROut\").textContent = ratio.toFixed(2); el(\"ribHOut\").textContent = hR.toFixed(1) + \"\\u00D7\"; el(\"ribFOut\").textContent = fR.toFixed(2); var maxRatio = (fam === \"sc\") ? 0.5 : 0.6; var sinkState = OK, sinkNote = \"Root mass is balanced. No visible sink.\"; var over = ratio - maxRatio; if(over > 0.15){ sinkState = BAD; sinkNote = \"Heavy root. A sink line will read straight through the show face.\"; } else if(over > 0){ sinkState = WARN; sinkNote = \"Slight sink on a gloss face. Fine under a texture.\"; } var hState = OK, hNote = \"Fills and ejects without help.\"; if(hR > 3){ hState = WARN; hNote = \"Tall rib. Add draft, polish the rib steel along the draw, vent the top.\"; } if(hR > 4.5){ hState = BAD; hNote = \"Too tall to fill and eject cleanly. Split into two shorter ribs.\"; } var radState = OK, radNote = \"Radius carries the load into the wall.\"; if(fR < 0.2){ radState = BAD; radNote = \"Sharp root. Cracks start here in a drop test.\"; } else if(fR < 0.25){ radState = WARN; radNote = \"Thin radius. 0.25\\u20130.5\\u00D7 wall is the target.\"; } else if(fR > 0.6){ radState = WARN; radNote = \"Large radius adds mass back. Sink risk returns.\"; } \/* relative bending stiffness of a ribbed strip vs a plain wall of the same nominal thickness, unit width, single rib per 10T of width *\/ var pitch = 10*T; var Aw = pitch*T, Ar = tRib*hRib; var yBar = (Aw*(T\/2) + Ar*(T + hRib\/2)) \/ (Aw + Ar); var Iw = pitch*Math.pow(T,3)\/12 + Aw*Math.pow(yBar - T\/2, 2); var Ir = tRib*Math.pow(hRib,3)\/12 + Ar*Math.pow(T + hRib\/2 - yBar, 2); var Ibase = pitch*Math.pow(T,3)\/12; var stiff = (Iw+Ir)\/Ibase; var massAdd = (Ar\/Aw)*100; fill(el(\"ribCards\"), [ card(\"Rib base thickness\", tRib.toFixed(2) + \" mm\", \"Target \\u2264 \" + (T*maxRatio).toFixed(2) + \" mm for this family.\", sinkState), card(\"Rib height\", hRib.toFixed(1) + \" mm\", hNote, hState), card(\"Root radius\", rad.toFixed(2) + \" mm\", radNote, radState), card(\"Bending stiffness\", stiff.toFixed(1) + \"\\u00D7\", \"Against a plain wall of the same thickness.\", OK), card(\"Added material\", \"+\" + massAdd.toFixed(0) + \" %\", \"One rib per \" + pitch.toFixed(0) + \" mm of width.\", massAdd > 40 ? WARN : OK), card(\"Minimum spacing\", (2*T).toFixed(1) + \" mm\", \"Closer than this and the steel between ribs runs hot.\", null) ]); \/* ---- drawing ---- *\/ var svg = el(\"ribSvg\"); clear(svg); var g = S(\"g\",{}); svg.appendChild(g); var px = 30, wallY = 210, x0 = 90, x1 = 550; var wallH = T*px*0.55; var cx = 320; var tb = tRib*px*0.55, hh = hRib*px*0.55, rr = rad*px*0.55; g.appendChild(txt(24, 30, \"SECTION \\u00B7 rib at the show face\", {size:12, mono:true, fill:MUTE})); \/* show surface label *\/ g.appendChild(S(\"line\",{x1:x0,y1:wallY+wallH,x2:x1,y2:wallY+wallH,stroke:STEEL_D,\"stroke-width\":1,\"stroke-dasharray\":\"6 4\"})); g.appendChild(txt(x0, wallY+wallH+20, \"show surface (Class A)\", {size:11, mono:true, fill:MUTE})); \/* body: wall + rib with fillets *\/ var dRib = \"M\" + x0 + \",\" + wallY + \" L\" + (cx - tb\/2 - rr) + \",\" + wallY + \" Q\" + (cx - tb\/2) + \",\" + wallY + \" \" + (cx - tb\/2) + \",\" + (wallY - rr) + \" L\" + (cx - tb\/2*0.72) + \",\" + (wallY - hh) + \" L\" + (cx + tb\/2*0.72) + \",\" + (wallY - hh) + \" L\" + (cx + tb\/2) + \",\" + (wallY - rr) + \" Q\" + (cx + tb\/2) + \",\" + wallY + \" \" + (cx + tb\/2 + rr) + \",\" + wallY + \" L\" + x1 + \",\" + wallY + \" L\" + x1 + \",\" + (wallY + wallH) + \" L\" + x0 + \",\" + (wallY + wallH) + \" Z\"; g.appendChild(S(\"path\",{d:dRib, fill:\"#fbdcc2\", stroke:RESIN, \"stroke-width\":1.7, \"stroke-linejoin\":\"round\"})); \/* mass circle at the root *\/ var massR = Math.sqrt(tb*tb + wallH*wallH)\/2 + rr*0.5; g.appendChild(S(\"circle\",{cx:cx, cy:wallY+wallH*0.15, r:massR, fill:\"none\", stroke: sinkState, \"stroke-width\":1.3, \"stroke-dasharray\":\"4 3\", opacity:\"0.9\"})); \/* sink curve on the show face *\/ if(over > 0){ var dep = Math.min(14, over*70); var sd = \"M\" + (cx-massR*1.4) + \",\" + (wallY+wallH) + \" Q\" + cx + \",\" + (wallY+wallH-dep) + \" \" + (cx+massR*1.4) + \",\" + (wallY+wallH); g.appendChild(S(\"path\",{d:sd, fill:\"none\", stroke:sinkState, \"stroke-width\":2.6})); g.appendChild(txt(cx, wallY+wallH+42, \"sink reads here\", {size:11, mono:true, anchor:\"middle\", fill:sinkState})); } dim(g, x0+20, wallY, x0+20, wallY+wallH, \"T \" + T.toFixed(1), -30); dim(g, cx - tb\/2, wallY - hh, cx + tb\/2, wallY - hh, \"t \" + tRib.toFixed(2), -14); dim(g, cx + tb\/2 + 60, wallY, cx + tb\/2 + 60, wallY - hh, \"h \" + hRib.toFixed(1), 0); \/* draft indication on the rib *\/ g.appendChild(txt(cx + tb\/2 + 78, wallY - hh - 8, \"draft 0.5\\u20131.5\\u00B0 per side\", {size:11, mono:true, fill:\"#0f5f8f\"})); g.appendChild(txt(90, 300, \"ratio t\/T = \" + ratio.toFixed(2) + \" \\u00B7 family limit \" + maxRatio.toFixed(2), {size:12, mono:true, fill: over>0 ? sinkState : OK})); } [rFam, rT, rR, rH, rF].forEach(function(n){ n.addEventListener(\"input\", ribUpdate); n.addEventListener(\"change\", ribUpdate); }); \/* ===================================================================== * 3. DRAFT * ===================================================================*\/ var FINISH = [ {k:\"a1\", n:\"SPI A-1 high polish (lens)\", base:1.5, tex:0, note:\"Polished faces grip. Never go below 1\\u00B0.\"}, {k:\"a3\", n:\"SPI A-3 diamond polish\", base:1.0, tex:0, note:\"Standard cosmetic polish.\"}, {k:\"b3\", n:\"SPI B-3 paper 600\", base:0.75,tex:0, note:\"Semi-gloss, common on housings.\"}, {k:\"c3\", n:\"SPI C-3 stone 600\", base:0.5, tex:0, note:\"Matte, the practical minimum.\"}, {k:\"d2\", n:\"SPI D-2 bead blast\", base:1.0, tex:0.02, note:\"Light blast still needs extra draft.\"}, {k:\"t1\", n:\"Texture MT-11010 (fine)\", base:1.0, tex:0.025,note:\"Roughly 0.025 mm deep.\"}, {k:\"t2\", n:\"Texture MT-11020 (medium)\", base:1.0, tex:0.050,note:\"Roughly 0.05 mm deep.\"}, {k:\"t3\", n:\"Texture MT-11030 (coarse)\", base:1.0, tex:0.090,note:\"Roughly 0.09 mm deep. Needs serious draft.\"}, {k:\"lt\", n:\"Leather grain, deep\", base:1.0, tex:0.115,note:\"Deep grain. 6\\u00B0 and up is normal.\"} ]; var dFin = el(\"drFin\"), dD = el(\"drD\"), dA = el(\"drA\"); (function(){ for(var i=0;i<FINISH.length;i++){ var o = document.createElement(\"option\"); o.value = FINISH[i].k; o.textContent = FINISH[i].n; if(FINISH[i].k === \"b3\"){ o.selected = true; } dFin.appendChild(o); } })(); function finByKey(k){ for(var i=0;i<FINISH.length;i++){ if(FINISH[i].k===k){ return FINISH[i]; } } return FINISH[2]; } var ejectT = 0, ejectRAF = null; function draftUpdate(){ var f = finByKey(dFin.value); var D = parseFloat(dD.value), A = parseFloat(dA.value); el(\"drDOut\").textContent = D.toFixed(0) + \" mm\"; el(\"drAOut\").textContent = A.toFixed(1) + \"\\u00B0\"; var need = f.base + (f.tex\/0.025)*1.5; if(D > 60){ need += 0.5; } var offset = D * Math.tan(A*Math.PI\/180); var state = OK, note = \"Releases clean off the core.\"; if(A < need*0.6){ state = BAD; note = \"Not enough. Expect drag marks, stress whitening or a stuck part.\"; } else if(A < need){ state = WARN; note = \"Below target. It may run, but ejection force will be high.\"; } fill(el(\"drCards\"), [ card(\"Draft required\", need.toFixed(1) + \"\\u00B0\", f.note, state), card(\"Draft applied\", A.toFixed(1) + \"\\u00B0\", state === OK ? \"Meets the requirement.\" : note, state), card(\"Wall offset over the draw\", offset.toFixed(2) + \" mm\", \"The top of the wall sits this much outside the base.\", null), card(\"Draft margin\", (A - need >= 0 ? \"+\" : \"\") + (A - need).toFixed(1) + \"\\u00B0\", A >= need ? \"Contact breaks as soon as the core moves.\" : \"The part slides on the core through part of the stroke.\", state), card(\"Texture depth\", (f.tex*1000).toFixed(0) + \" \\u00B5m\", \"Add about 1.5\\u00B0 for every 25 \\u00B5m of depth.\", f.tex > 0.05 ? WARN : null) ]); drawDraft(f, D, A, need, state); } function drawDraft(f, D, A, need, state){ var svg = el(\"drSvg\"); clear(svg); var g = S(\"g\",{}); svg.appendChild(g); var scale = Math.min(3.6, 190\/D); var h = D*scale, halfBase = 90, cx = 300; var off = h*Math.tan(A*Math.PI\/180); var yBase = 265, yTop = yBase - h; var lift = ejectT * 90; g.appendChild(txt(24, 28, \"CORE SIDE \\u00B7 ejection\", {size:12, mono:true, fill:MUTE})); \/* core steel (fixed) *\/ var coreD = \"M\" + (cx-halfBase) + \",\" + yBase + \" L\" + (cx-halfBase+off) + \",\" + yTop + \" L\" + (cx+halfBase-off) + \",\" + yTop + \" L\" + (cx+halfBase) + \",\" + yBase + \" Z\"; g.appendChild(S(\"path\",{d:coreD, fill:\"#c9d6de\", stroke:STEEL_D, \"stroke-width\":1.5})); g.appendChild(txt(cx, yBase-14, \"CORE\", {size:12, mono:true, anchor:\"middle\", fill:STEEL_D, weight:700})); \/* mold base line *\/ g.appendChild(S(\"rect\",{x:60, y:yBase, width:480, height:22, fill:\"#aebecb\", stroke:STEEL_D, \"stroke-width\":1})); \/* part shell, lifted during ejection *\/ var wall = 13; var pTop = yTop - lift, pBase = yBase - lift; var pd = \"M\" + (cx-halfBase-wall) + \",\" + pBase + \" L\" + (cx-halfBase+off) + \",\" + pTop + \" L\" + (cx+halfBase-off) + \",\" + pTop + \" L\" + (cx+halfBase+wall) + \",\" + pBase + \" L\" + (cx+halfBase+wall-2) + \",\" + (pBase) + \" L\" + (cx+halfBase-off+wall*0.6) + \",\" + (pTop+wall) + \" L\" + (cx-halfBase+off-wall*0.6) + \",\" + (pTop+wall) + \" L\" + (cx-halfBase-wall+2) + \",\" + pBase + \" Z\"; g.appendChild(S(\"path\",{d:pd, fill:\"#fbdcc2\", stroke:RESIN, \"stroke-width\":1.7, \"stroke-linejoin\":\"round\", opacity:\"0.95\"})); \/* drag scoring when draft is short *\/ if(state === BAD && lift > 4){ var n = 5, i; for(i=0;i<n;i++){ var yy = pTop + wall + 14 + i*(h-30)\/n; if(yy > pBase-6){ break; } g.appendChild(S(\"line\",{x1:cx-halfBase-wall+4, y1:yy, x2:cx-halfBase-wall+16, y2:yy, stroke:BAD, \"stroke-width\":2})); g.appendChild(S(\"line\",{x1:cx+halfBase+wall-4, y1:yy, x2:cx+halfBase+wall-16, y2:yy, stroke:BAD, \"stroke-width\":2})); } g.appendChild(txt(cx, 46, \"drag marks on both walls\", {size:12, mono:true, anchor:\"middle\", fill:BAD, weight:700})); } \/* ejector pins *\/ var pinY = yBase + 22; [cx-52, cx+52].forEach(function(px2){ g.appendChild(S(\"rect\",{x:px2-6, y:pinY - lift, width:12, height:60, fill:\"#8ea3b2\", stroke:STEEL_D, \"stroke-width\":1})); }); \/* angle annotation *\/ dim(g, cx+halfBase, yBase, cx+halfBase-off, yTop, A.toFixed(1) + \"\\u00B0\", 34); g.appendChild(txt(cx+halfBase+58, yTop+20, \"offset \" + (D*Math.tan(A*Math.PI\/180)).toFixed(2) + \" mm\", {size:11, mono:true, fill:\"#0f5f8f\"})); g.appendChild(txt(60, 300, \"required \" + need.toFixed(1) + \"\\u00B0 \\u00B7 applied \" + A.toFixed(1) + \"\\u00B0\", {size:12, mono:true, fill:state})); } el(\"drEject\").addEventListener(\"click\", function(){ if(ejectRAF){ cancelAnimationFrame(ejectRAF); } var reduce = window.matchMedia && window.matchMedia(\"(prefers-reduced-motion:reduce)\").matches; if(reduce){ ejectT = 1; draftUpdate(); setTimeout(function(){ ejectT = 0; draftUpdate(); }, 900); return; } var t0 = null; function step(ts){ if(!t0){ t0 = ts; } var p = (ts - t0)\/1400; if(p > 1){ p = 1; } ejectT = p < 0.75 ? (p\/0.75) : (1 - (p-0.75)\/0.25); draftUpdate(); if(p < 1){ ejectRAF = requestAnimationFrame(step); } else { ejectT = 0; draftUpdate(); ejectRAF = null; } } ejectRAF = requestAnimationFrame(step); }); [dFin, dD, dA].forEach(function(n){ n.addEventListener(\"input\", draftUpdate); n.addEventListener(\"change\", draftUpdate); }); \/* ===================================================================== * 4. CORNER RADII * ===================================================================*\/ var KTAB = [[0.05,4.0],[0.1,3.0],[0.15,2.55],[0.2,2.25],[0.3,1.90],[0.4,1.72],[0.5,1.60],[0.6,1.52],[0.8,1.42],[1.0,1.35]]; function kFactor(rt){ if(rt <= KTAB[0][0]){ return KTAB[0][1]; } if(rt >= KTAB[KTAB.length-1][0]){ return KTAB[KTAB.length-1][1]; } for(var i=0;i<KTAB.length-1;i++){ if(rt >= KTAB[i][0] && rt <= KTAB[i+1][0]){ var f = (rt - KTAB[i][0])\/(KTAB[i+1][0]-KTAB[i][0]); return KTAB[i][1] + f*(KTAB[i+1][1]-KTAB[i][1]); } } return 1.5; } var cT = el(\"rdT\"), cR = el(\"rdR\"); function radiiUpdate(){ var T = parseFloat(cT.value), rt = parseFloat(cR.value); var Ri = T*rt, Ro = Ri + T, K = kFactor(rt); el(\"rdTOut\").textContent = T.toFixed(1) + \" mm\"; el(\"rdROut\").textContent = rt.toFixed(2); var state = OK, note = \"Good balance of strength, flow and mass.\"; if(rt < 0.25){ state = BAD; note = \"Stress climbs fast below 0.25. Parts crack at this corner.\"; } else if(rt < 0.4){ state = WARN; note = \"Workable, but 0.5 is the sweet spot.\"; } else if(rt > 0.75){ state = WARN; note = \"Diminishing return, and the corner starts to add mass.\"; } fill(el(\"rdCards\"), [ card(\"Inside radius\", Ri.toFixed(2) + \" mm\", \"Cut with a ball mill of the same radius.\", state), card(\"Outside radius\", Ro.toFixed(2) + \" mm\", \"Inside radius plus one wall keeps the section constant.\", null), card(\"Stress factor K\", K.toFixed(2) + \"\\u00D7\", note, state), card(\"Peak stress reduction\", \"\\u2212\" + ((1 - K\/kFactor(0.05))*100).toFixed(0) + \" %\", \"Against an almost sharp inside corner on the same wall.\", OK) ]); \/* --- corner drawing --- *\/ var a = el(\"rdSvgA\"); clear(a); var ga = S(\"g\",{}); a.appendChild(ga); var px = 26, T2 = T*px*0.7, ri = Ri*px*0.7, ro = ri + T2; var ox = 80, oy = 190; ga.appendChild(txt(14, 24, \"CORNER SECTION\", {size:11, mono:true, fill:MUTE})); var dOut = \"M\" + ox + \",\" + (oy-150) + \" L\" + ox + \",\" + (oy-ro) + \" A\" + ro + \",\" + ro + \" 0 0 0 \" + (ox+ro) + \",\" + oy + \" L\" + (ox+170) + \",\" + oy; var dIn = \"M\" + (ox+T2) + \",\" + (oy-150) + \" L\" + (ox+T2) + \",\" + (oy-ro) + \" A\" + ri + \",\" + ri + \" 0 0 0 \" + (ox+ro) + \",\" + (oy-T2) + \" L\" + (ox+170) + \",\" + (oy-T2); var band = dOut + \" L\" + (ox+170) + \",\" + (oy-T2) + \" L\" + (ox+ro) + \",\" + (oy-T2) + \" A\" + ri + \",\" + ri + \" 0 0 1 \" + (ox+T2) + \",\" + (oy-ro) + \" L\" + (ox+T2) + \",\" + (oy-150) + \" Z\"; ga.appendChild(S(\"path\",{d:band, fill:\"#fbdcc2\", stroke:\"none\"})); ga.appendChild(S(\"path\",{d:dOut, fill:\"none\", stroke:RESIN, \"stroke-width\":1.8})); ga.appendChild(S(\"path\",{d:dIn, fill:\"none\", stroke:RESIN, \"stroke-width\":1.8})); \/* hot-spot marker *\/ var hot = state === BAD ? BAD : (state === WARN ? WARN : OK); ga.appendChild(S(\"circle\",{cx:ox+ro-ri*0.35, cy:oy-ro+ri*0.35, r:Math.max(5, 16-rt*12), fill:\"none\", stroke:hot, \"stroke-width\":2, \"stroke-dasharray\":\"3 3\"})); ga.appendChild(txt(ox+ro+14, oy-ro-6, \"K = \" + K.toFixed(2), {size:12, mono:true, fill:hot, weight:700})); dim(ga, ox, oy-140, ox+T2, oy-140, T.toFixed(1), -12); ga.appendChild(txt(14, 240, \"R inside \" + Ri.toFixed(2) + \" \/ R outside \" + Ro.toFixed(2), {size:11, mono:true, fill:MUTE})); \/* --- chart --- *\/ var b = el(\"rdSvgB\"); clear(b); var gb = S(\"g\",{}); b.appendChild(gb); var X0=52, X1=290, Y0=210, Y1=40; gb.appendChild(txt(14, 24, \"STRESS CONCENTRATION\", {size:11, mono:true, fill:MUTE})); gb.appendChild(S(\"line\",{x1:X0,y1:Y0,x2:X1,y2:Y0,stroke:STEEL_D,\"stroke-width\":1})); gb.appendChild(S(\"line\",{x1:X0,y1:Y0,x2:X0,y2:Y1,stroke:STEEL_D,\"stroke-width\":1})); var i, pts = []; for(i=0;i<=60;i++){ var xr = 0.05 + (i\/60)*0.95; var kk = kFactor(xr); var px2 = X0 + ((xr-0.05)\/0.95)*(X1-X0); var py2 = Y0 - ((kk-1)\/3.2)*(Y0-Y1); pts.push(px2.toFixed(1) + \",\" + py2.toFixed(1)); } gb.appendChild(S(\"polyline\",{points:pts.join(\" \"), fill:\"none\", stroke:\"#0f5f8f\", \"stroke-width\":2})); \/* recommended band 0.4-0.6 *\/ var bx1 = X0 + ((0.4-0.05)\/0.95)*(X1-X0), bx2 = X0 + ((0.6-0.05)\/0.95)*(X1-X0); gb.appendChild(S(\"rect\",{x:bx1, y:Y1, width:bx2-bx1, height:Y0-Y1, fill:\"#0d7a55\", opacity:\"0.09\"})); gb.appendChild(txt((bx1+bx2)\/2, Y1-6, \"target\", {size:10, mono:true, anchor:\"middle\", fill:OK})); \/* marker *\/ var mx = X0 + ((Math.max(0.05,rt)-0.05)\/0.95)*(X1-X0); var my = Y0 - ((K-1)\/3.2)*(Y0-Y1); gb.appendChild(S(\"line\",{x1:mx,y1:Y0,x2:mx,y2:my,stroke:RESIN,\"stroke-width\":1,\"stroke-dasharray\":\"3 3\"})); gb.appendChild(S(\"circle\",{cx:mx, cy:my, r:5, fill:RESIN})); gb.appendChild(txt(X0-8, Y0+16, \"0.05\", {size:10, mono:true, fill:MUTE})); gb.appendChild(txt(X1-14, Y0+16, \"1.0\", {size:10, mono:true, fill:MUTE})); gb.appendChild(txt(X0, Y0+34, \"R \/ T\", {size:11, mono:true, fill:MUTE})); gb.appendChild(txt(10, Y1-8, \"K\", {size:11, mono:true, fill:MUTE})); } [cT, cR].forEach(function(n){ n.addEventListener(\"input\", radiiUpdate); }); \/* ===================================================================== * 5. BOSSES * ===================================================================*\/ var SCREWS = [ {k:\"m2\", n:\"M2\", d:2.0}, {k:\"m25\", n:\"M2.5\", d:2.5}, {k:\"m3\", n:\"M3\", d:3.0}, {k:\"m35\", n:\"M3.5\", d:3.5}, {k:\"m4\", n:\"M4\", d:4.0}, {k:\"m5\", n:\"M5\", d:5.0}, {k:\"m6\", n:\"M6\", d:6.0} ]; var bScrew = el(\"bsScrew\"), bType = el(\"bsType\"), bT = el(\"bsT\"), bK = el(\"bsK\"), bH = el(\"bsH\"); (function(){ for(var i=0;i<SCREWS.length;i++){ var o = document.createElement(\"option\"); o.value = SCREWS[i].k; o.textContent = SCREWS[i].n; if(SCREWS[i].k === \"m3\"){ o.selected = true; } bScrew.appendChild(o); } })(); function screwByKey(k){ for(var i=0;i<SCREWS.length;i++){ if(SCREWS[i].k===k){ return SCREWS[i]; } } return SCREWS[2]; } function bossUpdate(){ var s = screwByKey(bScrew.value); var isInsert = bType.value === \"insert\"; var T = parseFloat(bT.value), k = parseFloat(bK.value), H = parseFloat(bH.value); var id = isInsert ? s.d*1.15 : s.d*0.80; var od = s.d*k; var bw = (od - id)\/2; var rootR = Math.max(0.4, 0.35*T); el(\"bsTOut\").textContent = T.toFixed(1) + \" mm\"; el(\"bsKOut\").textContent = k.toFixed(2) + \"\\u00D7\"; el(\"bsHOut\").textContent = H.toFixed(0) + \" mm\"; var limit = 0.7*T; var wState = OK, wNote = \"Boss wall stays under 0.7\\u00D7 nominal. No visible sink.\"; if(bw > limit*1.4){ wState = BAD; wNote = \"Far too heavy. A sink ring will read on the opposite face.\"; } else if(bw > limit){ wState = WARN; wNote = \"Heavy. Reduce the OD, or relieve the base with a counterbore.\"; } else if(bw < 0.35*T && !isInsert){ wState = WARN; wNote = \"Thin wall. The boss may split as the screw forms its thread.\"; } var hState = OK, hNote = \"Self-supporting.\"; if(H > 3*od){ hState = WARN; hNote = \"Tall boss. Add two or three gussets or tie it to a wall.\"; } if(H > 5*od){ hState = BAD; hNote = \"Too tall. The core pin will deflect and the wall will run thin on one side.\"; } var eng = isInsert ? s.d*1.8 : s.d*2.2; var pullout = isInsert ? \"Brass insert carries repeated assembly.\" : \"Good for 3\\u20135 assembly cycles, no more.\"; fill(el(\"bsCards\"), [ card(isInsert ? \"Insert bore\" : \"Pilot hole\", id.toFixed(2) + \" mm\", isInsert ? \"Sized for a standard knurled insert. Confirm with the supplier.\" : \"0.80\\u00D7 screw diameter is the usual start point.\", null), card(\"Boss OD\", od.toFixed(2) + \" mm\", \"2.0\\u20132.4\\u00D7 screw diameter is the normal window.\", (k<2 || k>2.6) ? WARN : OK), card(\"Boss wall\", bw.toFixed(2) + \" mm\", wNote, wState), card(\"Max OD without sink\", (id + 1.4*T).toFixed(2) + \" mm\", \"Screw strength wants a big OD, sink control wants a small one. This is where they meet.\", null), card(\"Boss height\", H.toFixed(0) + \" mm\", hNote + \" Limit \" + (3*od).toFixed(0) + \" mm without support.\", hState), card(\"Thread engagement\", eng.toFixed(1) + \" mm\", pullout, null), card(\"Root radius\", rootR.toFixed(2) + \" mm\", \"0.25\\u20130.5\\u00D7 wall at the base of the boss.\", null) ]); \/* ---- drawing ---- *\/ var svg = el(\"bsSvg\"); clear(svg); var g = S(\"g\",{}); svg.appendChild(g); var px = Math.min(16, 150\/od); var cx = 300, baseY = 250; var wallH = T*px, hh = Math.min(180, H*px), odp = od*px, idp = id*px, rr = rootR*px; g.appendChild(txt(24, 28, \"SECTION \\u00B7 cored boss with gusset\", {size:12, mono:true, fill:MUTE})); \/* floor wall *\/ g.appendChild(S(\"rect\",{x:70, y:baseY, width:460, height:wallH, fill:\"#fbdcc2\", stroke:RESIN, \"stroke-width\":1.6})); \/* boss walls (two sides of the section) *\/ function bossSide(sign){ var xo = cx + sign*odp\/2, xi = cx + sign*idp\/2; var d = \"M\" + xo + \",\" + baseY + \" L\" + xo + \",\" + (baseY-hh) + \" L\" + xi + \",\" + (baseY-hh) + \" L\" + xi + \",\" + (baseY-hh*0.12) + \" L\" + xi + \",\" + baseY + \" Z\"; g.appendChild(S(\"path\",{d:d, fill:\"#fbdcc2\", stroke:RESIN, \"stroke-width\":1.6, \"stroke-linejoin\":\"round\"})); \/* root fillet *\/ g.appendChild(S(\"path\",{ d:\"M\" + (xo + sign*rr) + \",\" + baseY + \" Q\" + xo + \",\" + baseY + \" \" + xo + \",\" + (baseY-rr), fill:\"none\", stroke:RESIN, \"stroke-width\":1.6 })); \/* gusset *\/ g.appendChild(S(\"path\",{ d:\"M\" + (xo + sign*4) + \",\" + (baseY-hh*0.62) + \" L\" + (xo + sign*(hh*0.5)) + \",\" + baseY + \" L\" + (xo+sign*4) + \",\" + baseY + \" Z\", fill:\"#fbdcc2\", stroke:RESIN, \"stroke-width\":1.3, opacity:\"0.9\" })); } bossSide(-1); bossSide(1); \/* core pin *\/ g.appendChild(S(\"rect\",{x:cx-idp\/2, y:baseY-hh, width:idp, height:hh+wallH+30, fill:\"#c9d6de\", stroke:STEEL_D, \"stroke-width\":1.3})); g.appendChild(txt(cx, baseY+wallH+46, \"core pin\", {size:11, mono:true, anchor:\"middle\", fill:STEEL_D})); \/* screw *\/ g.appendChild(S(\"rect\",{x:cx-idp\/2-2, y:baseY-hh-34, width:idp+4, height:26, fill:\"#8ea3b2\", stroke:STEEL_D, \"stroke-width\":1})); g.appendChild(txt(cx, baseY-hh-42, s.n + (isInsert ? \" into insert\" : \" thread-forming\"), {size:11, mono:true, anchor:\"middle\", fill:STEEL_D})); dim(g, cx-odp\/2, baseY-hh, cx+odp\/2, baseY-hh, \"OD \" + od.toFixed(1), -18); dim(g, cx-idp\/2, baseY-hh+18, cx+idp\/2, baseY-hh+18, \"\\u00D8\" + id.toFixed(1), 0); dim(g, cx+odp\/2+40, baseY, cx+odp\/2+40, baseY-hh, \"H \" + H.toFixed(0), 0); \/* sink flag *\/ if(wState !== OK){ var dep = wState === BAD ? 10 : 5; g.appendChild(S(\"path\",{ d:\"M\" + (cx-odp*0.8) + \",\" + (baseY+wallH) + \" Q\" + cx + \",\" + (baseY+wallH-dep) + \" \" + (cx+odp*0.8) + \",\" + (baseY+wallH), fill:\"none\", stroke:wState, \"stroke-width\":2.4 })); g.appendChild(txt(cx, baseY+wallH+22, \"sink ring on the outside face\", {size:11, mono:true, anchor:\"middle\", fill:wState})); } g.appendChild(txt(70, 306, \"boss wall \" + bw.toFixed(2) + \" mm \\u00B7 limit \" + (0.7*T).toFixed(2) + \" mm\", {size:12, mono:true, fill:wState})); } [bScrew, bType, bT, bK, bH].forEach(function(n){ n.addEventListener(\"input\", bossUpdate); n.addEventListener(\"change\", bossUpdate); }); \/* ===================================================================== * 6. UNDERCUTS AND TOOL ACTIONS * ===================================================================*\/ var ACTIONS = [ {k:\"slide\", n:\"Side hole or window on a vertical face\", sol:\"Slide (cam-driven side action)\", cost:[8,15], cyc:[1,2], wk:[1,2], tip:\"Cheapest real action. Needs room on the parting line and leaves a witness line around the feature.\"}, {k:\"lift\", n:\"Internal snap hook or latch pocket\", sol:\"Lifter (angled ejector)\", cost:[5,12], cyc:[1,2], wk:[1,2], tip:\"Works when the part can flex slightly during ejection. Needs stroke room under the part.\"}, {k:\"hyd\", n:\"Deep side pocket or large cored opening\", sol:\"Hydraulic slide\", cost:[15,25], cyc:[2,4], wk:[2,3], tip:\"Needs a hydraulic circuit on the press. Confirm the machine has spare cores.\"}, {k:\"coll\", n:\"Internal thread or internal groove all round\", sol:\"Collapsible core\", cost:[25,40], cyc:[3,5], wk:[3,5], tip:\"A precision assembly with a service life. Budget spare segments from day one.\"}, {k:\"unsc\", n:\"External thread on a round part\", sol:\"Unscrewing unit or two-part split cavity\", cost:[30,60], cyc:[4,8], wk:[3,6], tip:\"A split cavity is cheaper but leaves a flash line on the thread. Unscrewing is clean and slow.\"}, {k:\"bump\", n:\"Shallow bump, rib or bead under 0.5 mm deep\", sol:\"Bump-off (stripped over the steel)\", cost:[2,6], cyc:[0,1], wk:[0,1], tip:\"Only for flexible resins with good elongation. Add generous lead-in radii.\"}, {k:\"ins\", n:\"Metal insert molded in place\", sol:\"Manual loading, insert molding\", cost:[3,8], cyc:[8,20], wk:[1,2], tip:\"Tool cost barely moves. Cycle time and labor carry the cost instead.\"}, {k:\"tex\", n:\"Texture wrapping over a side-action face\", sol:\"Texture the slide separately\", cost:[3,6], cyc:[0,0], wk:[1,2], tip:\"The texture must be re-registered on the slide. Expect a visible match line.\"} ]; (function(){ var box = el(\"acList\"); for(var i=0;i<ACTIONS.length;i++){ var a = ACTIONS[i]; var lab = document.createElement(\"label\"); lab.className = \"twdfm-pick\"; var inp = document.createElement(\"input\"); inp.type = \"checkbox\"; inp.value = a.k; var sp = document.createElement(\"span\"); sp.appendChild(document.createTextNode(a.n)); var it = document.createElement(\"i\"); it.textContent = a.sol; sp.appendChild(it); lab.appendChild(inp); lab.appendChild(sp); box.appendChild(lab); inp.addEventListener(\"change\", actionUpdate); } })(); function actionUpdate(){ var boxes = all(\".twdfm-pick input\"); var c0=0,c1=0,y0=0,y1=0,w0=0,w1=0,n=0,tips=[]; for(var i=0;i<boxes.length;i++){ if(!boxes[i].checked){ continue; } var k = boxes[i].value, a = null, j; for(j=0;j<ACTIONS.length;j++){ if(ACTIONS[j].k===k){ a=ACTIONS[j]; } } if(!a){ continue; } n++; c0+=a.cost[0]; c1+=a.cost[1]; y0+=a.cyc[0]; y1+=a.cyc[1]; if(a.wk[1] > w1){ w0=a.wk[0]; w1=a.wk[1]; } tips.push(a.sol + \" \\u2014 \" + a.tip); } var state = n === 0 ? OK : (c1 > 45 ? BAD : (c1 > 20 ? WARN : OK)); fill(el(\"acCards\"), [ card(\"Moving actions\", String(n), n === 0 ? \"Straight-pull tool. The cheapest mold you can build.\" : \"Each action is a wear item with its own maintenance interval.\", state), card(\"Tool cost added\", n === 0 ? \"0 %\" : \"+\" + c0 + \"\\u2013\" + c1 + \" %\", \"Against a straight-pull tool of the same size and class.\", state), card(\"Cycle time added\", n === 0 ? \"0 s\" : \"+\" + y0 + \"\\u2013\" + y1 + \" s\", \"Actions must clear before the mold opens or closes.\", y1 > 6 ? WARN : OK), card(\"Lead time added\", n === 0 ? \"0 wk\" : \"+\" + w0 + \"\\u2013\" + w1 + \" wk\", \"Driven by the slowest single action, not the sum.\", w1 >= 3 ? WARN : OK) ]); var note = el(\"acNote\"); clear(note); if(tips.length === 0){ note.appendChild(document.createTextNode(\"Nothing selected. A part that opens in one direction with draft on every face is the target. Get as close to it as the function allows.\")); } else { var ul = document.createElement(\"ul\"); ul.style.margin = \"0\"; ul.style.paddingLeft = \"1.1rem\"; for(var q=0;q<tips.length;q++){ var li = document.createElement(\"li\"); li.style.marginBottom = \".35rem\"; li.textContent = tips[q]; ul.appendChild(li); } note.appendChild(ul); } } \/* ===================================================================== * 7. GATE AND FLOW * ===================================================================*\/ var CW = 720, CH = 420, CELL = 6; var GX = CW\/CELL, GY = CH\/CELL; \/* 120 x 70 cells *\/ var MMPC = 2; \/* mm per cell -> 240 x 140 mm plate *\/ var gates = [{x:60, y:35}]; var twoGates = false; var gtMat = el(\"gtMat\"), gtT = el(\"gtT\"), gtCanvas = el(\"gtCanvas\"); fillMatSelect(gtMat, \"abs\"); var HOLES = [ {t:\"c\", x:88, y:22, r:9}, \/* circular hole *\/ {t:\"r\", x:34, y:47, w:9, h:16} \/* rectangular cutout *\/ ]; function blocked(ix, iy){ var i; for(i=0;i<HOLES.length;i++){ var h = HOLES[i]; if(h.t === \"c\"){ var dx = ix-h.x, dy = iy-h.y; if(dx*dx + dy*dy <= h.r*h.r){ return true; } } else { if(ix >= h.x - h.w\/2 && ix <= h.x + h.w\/2 && iy >= h.y - h.h\/2 && iy <= h.y + h.h\/2){ return true; } } } return false; } function solveFill(){ var N = GX*GY, i; var dist = new Float32Array(N), src = new Int8Array(N), blk = new Uint8Array(N); for(i=0;i<N;i++){ dist[i] = 1e9; src[i] = -1; } var x, y; for(y=0;y<GY;y++){ for(x=0;x<GX;x++){ if(blocked(x,y)){ blk[y*GX+x] = 1; } } } for(i=0;i<gates.length;i++){ var gx = Math.round(gates[i].x), gy = Math.round(gates[i].y); if(gx<0){gx=0;} if(gx>GX-1){gx=GX-1;} if(gy<0){gy=0;} if(gy>GY-1){gy=GY-1;} var id = gy*GX+gx; if(blk[id]){ continue; } dist[id] = 0; src[id] = i; } var D1 = 1, D2 = 1.41421356; var pass, changed = true, guard = 0; var order = [[-1,-1,D2],[0,-1,D1],[1,-1,D2],[-1,0,D1],[1,0,D1],[-1,1,D2],[0,1,D1],[1,1,D2]]; while(changed && guard < 40){ changed = false; guard++; for(pass=0; pass<2; pass++){ var ys = pass === 0 ? 0 : GY-1, ye = pass === 0 ? GY : -1, ystep = pass === 0 ? 1 : -1; for(y=ys; y!==ye; y+=ystep){ var xs = pass === 0 ? 0 : GX-1, xe = pass === 0 ? GX : -1, xstep = pass === 0 ? 1 : -1; for(x=xs; x!==xe; x+=xstep){ var idx = y*GX+x; if(blk[idx]){ continue; } var best = dist[idx], bsrc = src[idx], o; for(o=0;o<8;o++){ var nx = x+order[o][0], ny = y+order[o][1]; if(nx<0||ny<0||nx>=GX||ny>=GY){ continue; } var nid = ny*GX+nx; if(blk[nid]){ continue; } var cand = dist[nid] + order[o][2]; if(cand < best - 0.0001){ best = cand; bsrc = src[nid]; } } if(best < dist[idx] - 0.0001){ dist[idx] = best; src[idx] = bsrc; changed = true; } } } } } return {dist:dist, src:src, blk:blk}; } function drawGate(){ var m = matByKey(gtMat.value); var T = parseFloat(gtT.value); el(\"gtTOut\").textContent = T.toFixed(1) + \" mm\"; var r = solveFill(); var ctx = gtCanvas.getContext(\"2d\"); var i, x, y, maxD = 0, maxI = -1; for(i=0;i<r.dist.length;i++){ if(r.blk[i]){ continue; } if(r.dist[i] < 1e8 && r.dist[i] > maxD){ maxD = r.dist[i]; maxI = i; } } ctx.clearRect(0,0,CW,CH); ctx.fillStyle = \"#ffffff\"; ctx.fillRect(0,0,CW,CH); var band = 7; \/* cells per isochrone *\/ for(y=0;y<GY;y++){ for(x=0;x<GX;x++){ var id = y*GX+x; if(r.blk[id]){ ctx.fillStyle = \"#c9d6de\"; } else if(r.dist[id] > 1e8){ ctx.fillStyle = \"#eef2f5\"; } else { var p = r.dist[id]\/(maxD || 1); var bandIdx = Math.floor(r.dist[id]\/band); var shade = (bandIdx % 2 === 0) ? 0 : 10; var rr2 = Math.round(214 + p*40 - shade); var gg = Math.round(74 + p*150 - shade*0.4); var bb = Math.round(15 + p*190 - shade*0.2); if(rr2>255){rr2=255;} if(gg>250){gg=250;} if(bb>245){bb=245;} ctx.fillStyle = \"rgb(\" + rr2 + \",\" + gg + \",\" + bb + \")\"; } ctx.fillRect(x*CELL, y*CELL, CELL, CELL); } } \/* weld lines between two gates: boundary of source regions *\/ ctx.fillStyle = \"#bb3325\"; for(y=0;y<GY-1;y++){ for(x=0;x<GX-1;x++){ var a1 = r.src[y*GX+x]; if(a1 < 0 || r.blk[y*GX+x]){ continue; } var b1 = r.src[y*GX+x+1], c1 = r.src[(y+1)*GX+x]; if((b1 >= 0 && b1 !== a1) || (c1 >= 0 && c1 !== a1)){ ctx.fillRect(x*CELL, y*CELL, CELL, CELL); } } } \/* obstacle outlines and their shadow weld lines *\/ ctx.lineWidth = 2; for(i=0;i<HOLES.length;i++){ var h = HOLES[i]; ctx.strokeStyle = \"#42576a\"; ctx.beginPath(); var hx, hy, hr; if(h.t === \"c\"){ hx = h.x*CELL; hy = h.y*CELL; hr = h.r*CELL; ctx.arc(hx, hy, hr, 0, Math.PI*2); } else { hx = h.x*CELL; hy = h.y*CELL; hr = Math.max(h.w, h.h)*CELL\/2; ctx.rect((h.x-h.w\/2)*CELL, (h.y-h.h\/2)*CELL, h.w*CELL, h.h*CELL); } ctx.stroke(); \/* nearest gate decides the shadow direction *\/ var gbest = gates[0], gd = 1e9, q; for(q=0;q<gates.length;q++){ var ddx = gates[q].x-h.x, ddy = gates[q].y-h.y; var dd = ddx*ddx+ddy*ddy; if(dd < gd){ gd = dd; gbest = gates[q]; } } var vx = h.x - gbest.x, vy = h.y - gbest.y; var vl = Math.sqrt(vx*vx+vy*vy) || 1; vx \/= vl; vy \/= vl; var sx = hx + vx*hr, sy = hy + vy*hr; var len = Math.min(150, hr*4); ctx.strokeStyle = \"#bb3325\"; ctx.setLineDash([7,5]); ctx.beginPath(); ctx.moveTo(sx, sy); ctx.lineTo(sx+vx*len, sy+vy*len); ctx.stroke(); ctx.setLineDash([]); ctx.fillStyle = \"#bb3325\"; ctx.font = \"11px ui-monospace,Menlo,Consolas,monospace\"; ctx.fillText(\"weld line\", sx+vx*len+4, sy+vy*len+4); } \/* last fill point *\/ if(maxI >= 0){ var lx = (maxI % GX)*CELL + CELL\/2, ly = Math.floor(maxI\/GX)*CELL + CELL\/2; ctx.strokeStyle = \"#11181f\"; ctx.lineWidth = 2; ctx.beginPath(); ctx.arc(lx, ly, 9, 0, Math.PI*2); ctx.stroke(); ctx.beginPath(); ctx.moveTo(lx-14, ly); ctx.lineTo(lx+14, ly); ctx.moveTo(lx, ly-14); ctx.lineTo(lx, ly+14); ctx.stroke(); ctx.fillStyle = \"#11181f\"; ctx.font = \"11px ui-monospace,Menlo,Consolas,monospace\"; var lbl = \"last to fill \\u2013 vent here\"; ctx.fillText(lbl, Math.min(lx+16, CW-140), Math.max(16, ly-12)); } \/* gates *\/ for(i=0;i<gates.length;i++){ var ggx = gates[i].x*CELL, ggy = gates[i].y*CELL; ctx.fillStyle = \"#11181f\"; ctx.beginPath(); ctx.arc(ggx, ggy, 7, 0, Math.PI*2); ctx.fill(); ctx.strokeStyle = \"#ffffff\"; ctx.lineWidth = 2; ctx.beginPath(); ctx.arc(ggx, ggy, 7, 0, Math.PI*2); ctx.stroke(); ctx.fillStyle = \"#11181f\"; ctx.font = \"bold 11px ui-monospace,Menlo,Consolas,monospace\"; ctx.fillText(\"GATE \" + (i+1), Math.min(ggx+11, CW-70), ggy+4); } \/* border *\/ ctx.strokeStyle = \"#42576a\"; ctx.lineWidth = 2; ctx.strokeRect(1,1,CW-2,CH-2); \/* readout *\/ var flowMM = maxD * MMPC; var need = flowMM \/ T, have = m.lt; var state = OK, note = \"One gate fills this plate at this wall.\"; if(need > have){ state = BAD; note = \"Past the practical reach. Add a gate or increase the wall.\"; } else if(need > have*0.8){ state = WARN; note = \"Close to the limit. Expect high pressure and a packing gradient.\"; } var plateDiag = Math.sqrt(Math.pow(GX*MMPC,2) + Math.pow(GY*MMPC,2)); fill(el(\"gtCards\"), [ card(\"Longest flow path\", flowMM.toFixed(0) + \" mm\", \"Measured around the openings, not straight across.\", state), card(\"Flow length \/ wall\", need.toFixed(0) + \" : 1\", \"This resin manages about \" + have + \" : 1. \" + note, state), card(\"Gates\", String(gates.length), gates.length > 1 ? \"Two gates halve the flow path and create a weld line between them.\" : \"Single gate. No gate-to-gate weld line.\", null), card(\"Plate size\", (GX*MMPC) + \" \\u00D7 \" + (GY*MMPC) + \" mm\", \"Diagonal \" + plateDiag.toFixed(0) + \" mm.\", null), card(\"Weld lines\", String(HOLES.length + (gates.length > 1 ? 1 : 0)), \"One downstream of each opening, plus one between gates.\", HOLES.length ? WARN : OK) ]); } function freeCell(ix, iy){ if(!blocked(ix,iy)){ return {x:ix, y:iy}; } var r2, dx, dy; for(r2=1;r2<20;r2++){ for(dx=-r2;dx<=r2;dx++){ for(dy=-r2;dy<=r2;dy++){ var nx = ix+dx, ny = iy+dy; if(nx<1||ny<1||nx>GX-2||ny>GY-2){ continue; } if(!blocked(nx,ny)){ return {x:nx, y:ny}; } } } } return {x:2, y:2}; } function gateFromEvent(e){ var rect = gtCanvas.getBoundingClientRect(); var sx = CW \/ rect.width, sy = CH \/ rect.height; var px2 = (e.clientX - rect.left) * sx, py2 = (e.clientY - rect.top) * sy; var ix = Math.round(px2\/CELL), iy = Math.round(py2\/CELL); if(ix<1){ix=1;} if(ix>GX-2){ix=GX-2;} if(iy<1){iy=1;} if(iy>GY-2){iy=GY-2;} if(blocked(ix,iy)){ return; } gates[0] = {x:ix, y:iy}; if(twoGates){ gates[1] = freeCell(Math.min(GX-2, Math.max(1, GX-ix)), Math.min(GY-2, Math.max(1, GY-iy))); } drawGate(); } gtCanvas.addEventListener(\"click\", gateFromEvent); all(\"[data-gate]\").forEach(function(b){ b.addEventListener(\"click\", function(){ var g = b.getAttribute(\"data-gate\"); if(g === \"c\"){ gates[0] = {x:Math.round(GX\/2), y:Math.round(GY\/2)}; } if(g === \"e\"){ gates[0] = {x:3, y:Math.round(GY\/2)}; } if(g === \"k\"){ gates[0] = {x:4, y:4}; } if(twoGates){ gates[1] = freeCell(GX-gates[0].x, GY-gates[0].y); } drawGate(); }); }); el(\"gtTwo\").addEventListener(\"click\", function(){ twoGates = !twoGates; if(twoGates){ this.classList.add(\"is-on\"); this.textContent = \"Single gate\"; gates[1] = freeCell(Math.max(2, GX-gates[0].x), Math.max(2, GY-gates[0].y)); } else { this.classList.remove(\"is-on\"); this.textContent = \"Add 2nd gate\"; gates.length = 1; } drawGate(); }); [gtMat, gtT].forEach(function(n){ n.addEventListener(\"input\", drawGate); n.addEventListener(\"change\", drawGate); }); \/* ===================================================================== * 8. SHRINK AND TOLERANCE * ===================================================================*\/ var tMat = el(\"tlMat\"), tL = el(\"tlL\"), tSrc = el(\"tlSrc\"); fillMatSelect(tMat, \"abs\"); function tolUpdate(){ var m = matByKey(tMat.value); var L = parseFloat(tL.value); el(\"tlLOut\").textContent = L.toFixed(1) + \" mm\"; var comm, fine; if(m.fam === \"am\"){ comm = 0.076 + 0.0025*L; } else if(m.k === \"pa66g\" || m.k === \"pbt\"){ comm = 0.080 + 0.0030*L; } else { comm = 0.090 + 0.0045*L; } fine = comm*0.62; var add = 0, srcNote = \"Formed in one mold half. The best you can hold.\"; if(tSrc.value === \"pl\"){ add = 0.05 + 0.0004*L; srcNote = \"Across the parting line. Add clamp and flash variation.\"; } if(tSrc.value === \"sl\"){ add = 0.08 + 0.0006*L; srcNote = \"Formed by a slide. Add the shut-off clearance and wear.\"; } var shAvg = (m.sh[0]+m.sh[1])\/2; var steel = L*(1 + shAvg\/100); var shSpread = L*(m.sh[1]-m.sh[0])\/100; fill(el(\"tlCards\"), [ card(\"Standard tolerance\", \"\\u00B1\" + (comm+add).toFixed(3) + \" mm\", srcNote, null), card(\"Fine tolerance\", \"\\u00B1\" + (fine+add).toFixed(3) + \" mm\", \"Needs process control, a tighter resin spec and higher tool class.\", WARN), card(\"Cavity steel size\", steel.toFixed(3) + \" mm\", \"Cut at average shrink \" + shAvg.toFixed(2) + \" %, then steel-safe where it matters.\", null), card(\"Shrink spread alone\", \"\\u00B1\" + (shSpread\/2).toFixed(3) + \" mm\", \"The published shrink range covers this much on its own.\", shSpread\/2 > comm ? BAD : OK), card(\"Resin type\", m.fam === \"sc\" ? \"Semi-crystalline\" : \"Amorphous\", m.fam === \"sc\" ? \"Shrinks more and often differently along and across the flow.\" : \"Low and fairly uniform shrink.\" , null) ]); \/* band drawing *\/ var svg = el(\"tlSvg\"); clear(svg); var g = S(\"g\",{}); svg.appendChild(g); var X0 = 60, X1 = 580, mid = 100; var maxT = Math.max(comm+add, shSpread\/2)*1.25 || 1; function w(v){ return (v\/maxT)*((X1-X0)\/2); } g.appendChild(txt(24, 30, \"TOLERANCE BANDS AT \" + L.toFixed(0) + \" mm\", {size:12, mono:true, fill:MUTE})); g.appendChild(S(\"line\",{x1:(X0+X1)\/2, y1:50, x2:(X0+X1)\/2, y2:170, stroke:INK, \"stroke-width\":1.4})); g.appendChild(txt((X0+X1)\/2, 186, \"nominal\", {size:11, mono:true, anchor:\"middle\", fill:INK})); function bandRow(y, half, color, label){ var c = (X0+X1)\/2; g.appendChild(S(\"rect\",{x:c-w(half), y:y-11, width:w(half)*2, height:22, fill:color, opacity:\"0.16\"})); g.appendChild(S(\"line\",{x1:c-w(half), y1:y-11, x2:c-w(half), y2:y+11, stroke:color, \"stroke-width\":2})); g.appendChild(S(\"line\",{x1:c+w(half), y1:y-11, x2:c+w(half), y2:y+11, stroke:color, \"stroke-width\":2})); g.appendChild(txt(X0-6, y+4, label, {size:11, mono:true, anchor:\"end\", fill:color})); g.appendChild(txt(c+w(half)+8, y+4, \"\\u00B1\" + half.toFixed(3), {size:11, mono:true, fill:color})); } bandRow(70, fine+add, \"#0d7a55\", \"fine\"); bandRow(110, comm+add, \"#0f5f8f\", \"standard\"); bandRow(150, shSpread\/2, \"#ea6a17\", \"shrink range\"); } [tMat, tL, tSrc].forEach(function(n){ n.addEventListener(\"input\", tolUpdate); n.addEventListener(\"change\", tolUpdate); }); \/* ===================================================================== * 9. QUIZ * ===================================================================*\/ var QZ = [ {q:\"A part has a 2 mm nominal wall and a 5 mm thick rim. What happens first?\", o:[\"The rim fills last and short-shots\",\"The rim sinks and may trap a void\",\"The rim warps the gate area\",\"Nothing, thick sections pack better\"], a:1, e:\"The heavy rim cools last. It keeps shrinking after the gate freezes, so the surface pulls in and the core can tear into a void.\"}, {q:\"Which rib base thickness is right for a 2.5 mm wall in PP?\", o:[\"2.5 mm\",\"1.8 mm\",\"1.1 mm\",\"0.4 mm\"], a:2, e:\"PP shrinks a lot, so 0.4\\u20130.5\\u00D7 wall is the working range. 1.1 mm is about 0.45\\u00D7 and will not read through.\"}, {q:\"A 60 mm deep wall carries a medium texture around 0.05 mm deep. Minimum draft?\", o:[\"0.5\\u00B0\",\"1\\u00B0\",\"2\\u00B0\",\"4\\u00B0 or more\"], a:3, e:\"Base draft near 1\\u00B0 plus roughly 1.5\\u00B0 per 0.025 mm of texture depth. That lands at 4\\u00B0 and up on a draw this deep.\"}, {q:\"Inside corner radius on a 3 mm wall. Best default?\", o:[\"0.1 mm\",\"0.5 mm\",\"1.5 mm\",\"3 mm\"], a:2, e:\"R = 0.5\\u00D7 wall = 1.5 mm. Below R\/T 0.3 the stress factor climbs steeply; above 0.6 you only add mass.\"}, {q:\"An M3 thread-forming screw goes into a boss. What pilot hole?\", o:[\"2.4 mm\",\"3.0 mm\",\"3.2 mm\",\"1.5 mm\"], a:0, e:\"About 0.80\\u00D7 the screw diameter. 2.4 mm gives the screw material to form a thread without splitting the boss.\"}, {q:\"Where does a weld line appear on a plate with one gate and one hole?\", o:[\"At the gate\",\"Directly downstream of the hole\",\"At the last point to fill\",\"Along the parting line\"], a:1, e:\"The flow front splits around the hole and rejoins behind it. That rejoin line is the weld line, and it is the weakest place on the part.\"}, {q:\"Same part in ABS and in POM. Which needs the wider tolerance?\", o:[\"ABS\",\"POM\",\"Both the same\",\"Depends only on the tool\"], a:1, e:\"POM shrinks around 1.8\\u20132.5% against 0.4\\u20130.7% for ABS. A wider shrink range means a wider achievable tolerance.\"}, {q:\"Which change removes the most cost from a mold?\", o:[\"Polishing to A-1 instead of B-3\",\"Deleting a side hole so the tool runs on straight pull\",\"Switching resin colour\",\"Adding a second ejector plate\"], a:1, e:\"Every action is tool cost, cycle time and a wear item. Getting the part to open in one direction is the single biggest saving.\"} ]; (function(){ var wrap = el(\"qzWrap\"); for(var i=0;i<QZ.length;i++){ (function(idx){ var item = QZ[idx]; var box = document.createElement(\"div\"); box.className = \"twdfm-q\"; var h = document.createElement(\"h5\"); var b = document.createElement(\"b\"); b.textContent = (idx+1 < 10 ? \"0\" : \"\") + (idx+1); h.appendChild(b); h.appendChild(document.createTextNode(item.q)); box.appendChild(h); var exp = document.createElement(\"p\"); exp.className = \"twdfm-exp\"; for(var j=0;j<item.o.length;j++){ (function(jdx){ var btn = document.createElement(\"button\"); btn.type = \"button\"; btn.className = \"twdfm-opt\"; btn.textContent = item.o[jdx]; btn.addEventListener(\"click\", function(){ if(box.getAttribute(\"data-done\") === \"1\"){ return; } box.setAttribute(\"data-done\",\"1\"); var opts = box.querySelectorAll(\".twdfm-opt\"), z; for(z=0;z<opts.length;z++){ if(z === item.a){ opts[z].style.borderColor = OK; opts[z].style.background = \"#eaf6f1\"; opts[z].style.color = OK; } else if(z === jdx){ opts[z].style.borderColor = BAD; opts[z].style.background = \"#fbeceb\"; opts[z].style.color = BAD; } opts[z].style.cursor = \"default\"; } exp.textContent = item.e; exp.style.display = \"block\"; if(jdx === item.a){ score++; } answered++; scoreUpdate(); }); box.appendChild(btn); })(j); } box.appendChild(exp); wrap.appendChild(box); })(i); } })(); var score = 0, answered = 0; function scoreUpdate(){ var msg = \"Keep going.\"; if(answered === QZ.length){ if(score === QZ.length){ msg = \"Full marks. Send us a model and we will try to find something.\"; } else if(score >= QZ.length-2){ msg = \"Solid. The rest come from seeing parts run.\"; } else { msg = \"Worth a second pass through sections 1 to 3.\"; } } fill(el(\"qzScore\"), [ card(\"Answered\", answered + \" \/ \" + QZ.length, msg, null), card(\"Correct\", String(score), answered ? Math.round(score\/answered*100) + \"% so far.\" : \"No answers yet.\", score === answered ? OK : WARN) ]); } \/* ===================================================================== * INIT * ===================================================================*\/ wallUpdate(); ribUpdate(); draftUpdate(); radiiUpdate(); bossUpdate(); actionUpdate(); tolUpdate(); scoreUpdate(); drawGate(); } if(document.readyState === \"loading\"){ document.addEventListener(\"DOMContentLoaded\", boot); } else { boot(); } })(); <\/script><p class=\"wp-block-paragraph\">Structural analysis is one of the most critical steps in the design process. Without it, your product may end up failing under real-world conditions, which could lead to costly recalls, delays, or even a damaged brand reputation. The goal here is to predict and analyze how the product will behave when subjected to various forces, environmental conditions, and stresses. For complex geometry, <a href=\"https:\/\/www.engineering.com\/design-software\/finite-element-analysis-fea\/\" target=\"_blank\" rel=\"nofollow noopener\">Finite Element Analysis (FEA)<\/a> is the industry standard for verification.<\/p><p class=\"wp-block-paragraph\">For example, when designing an injection-molded plastic component, the material\u2019s structural integrity is paramount. Certain materials, like polypropylene (PP), might behave differently under stress compared to materials like polycarbonate (PC), which is much more rigid and durable. Using Finite Element Analysis (FEA) software, engineers can simulate how the part will respond to pressure, temperature changes, and mechanical forces. FEA helps identify weak spots in your design, such as potential points of failure or areas prone to warping under heat or stress. This analysis is especially important for products that will be subjected to heavy usage or extreme conditions, such as automotive parts or outdoor electronics.<\/p><p class=\"wp-block-paragraph\">Additionally, in <a href=\"https:\/\/www.plasticmoulds.net\/operation-cycle-of-injection-molding\">injection molding<\/a>, designers must consider the cooling and shrinkage of materials. If the design isn\u2019t properly aligned with how materials contract during cooling, the product may experience dimensional inconsistencies, warping, or cracking. For example, parts with thick cross-sections may cool at different rates, causing stress that could lead to failure over time. By conducting a structural analysis, you can mitigate these risks, ensuring that your product is robust and reliable in the long term.<\/p><h2 class=\"wp-block-heading\">6. Final Materials Selection<\/h2><p class=\"wp-block-paragraph\">As your design evolves, it\u2019s time to finalize your materials selection. By now, you should have a clearer understanding of which material best fits your product\u2019s needs in terms of cost, performance, and manufacturability. This decision may come after further testing, simulation, or consultation with suppliers. For help determining costs, you can use our <a href=\"https:\/\/www.plasticmoulds.net\/smart-injection-mold-cost-calculator.html\">smart injection mold cost calculator<\/a>.<\/p><p class=\"wp-block-paragraph\">For example, if you\u2019re designing a medical device that requires sterilization, you might opt for a material like PEEK (Polyether Ether Ketone), which is known for its excellent resistance to heat and chemicals. On the other hand, if you\u2019re designing a disposable packaging product, something more cost-effective like PET (Polyethylene Terephthalate) might be suitable.<\/p><h2 class=\"wp-block-heading\">7. Modify the Design for Manufacturing (DFM)<\/h2><p class=\"wp-block-paragraph\">Design for Manufacturing (DFM) is the process of refining your design to make it easier, more cost-effective, and more efficient to manufacture. It\u2019s an essential step for anyone looking to move from prototype to production, as it helps ensure that the product can be made without significant delays or unexpected costs. Reviewing <a href=\"https:\/\/www.protolabs.com\/resources\/design-tips\/designing-for-manufacturability\/\" target=\"_blank\" rel=\"nofollow noopener\">DFM best practices<\/a> can significantly shorten your timeline.<\/p><p class=\"wp-block-paragraph\">The DFM process involves analyzing every aspect of the design to identify potential challenges that could arise during production. In the case of injection molding, this might involve simplifying parts to reduce the complexity of the mold. For example, if the design has deep undercuts or complex geometries that make it difficult to eject the part from the mold, these features could be modified or eliminated altogether.<\/p><p class=\"wp-block-paragraph\">A good example of DFM in injection molding would be the use of draft angles. Without draft angles (slight slopes on the sides of the mold cavity), the molded part might get stuck in the mold, requiring additional labor or tooling to remove it. Draft angles of about 1 to 2 degrees are often used to facilitate easy ejection. In addition to draft angles, gate and runner systems (which direct the flow of molten material into the mold) are also optimized during the DFM process. By strategically placing the gates and ensuring a uniform flow of material, manufacturers can reduce cycle times and material waste, which in turn lowers production costs.<\/p><p class=\"wp-block-paragraph\">Another important DFM consideration is part count. The fewer parts a product has, the easier and less expensive it is to manufacture. Consolidating components, where possible, or designing for multi-functional parts can help reduce manufacturing time, tooling complexity, and assembly costs. Ultimately, DFM is about striking the right balance between design complexity, manufacturability, and cost efficiency.<\/p><h2 class=\"wp-block-heading\">8. Prototyping<\/h2><figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/image-4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"492\" src=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/image-4-1024x492.png\" alt=\"Plastic part prototyping process\" class=\"wp-image-14502\" srcset=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/image-4-1024x492.png 1024w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/image-4-300x144.png 300w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/image-4-768x369.png 768w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/image-4-18x9.png 18w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/image-4.png 1500w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><p class=\"wp-block-paragraph\">Prototyping is where the rubber meets the road. Until this stage, your design exists only as an idea or a digital file. The prototype is the first time you\u2019ll see and feel your design in the real world. It\u2019s an invaluable step for identifying issues that may not have been apparent during the design phase and for verifying that your design works as intended before moving into full-scale production. For early-stage testing, many start with <a href=\"https:\/\/www.plasticmoulds.net\/advice-for-beginners-about-prototyping.html\">prototyping advice for beginners<\/a>.<\/p><p class=\"wp-block-paragraph\">For injection-molded products, prototyping often involves creating a limited-run mold that\u2019s used to produce a small batch of parts. These parts are then tested for functionality, fit, and finish. This stage provides a chance to evaluate the product\u2019s real-world performance, including its strength, ease of assembly, and user experience. If you\u2019re working on a consumer product, like a new mobile phone case, you may also want to test for tactile qualities\u2014how does the product feel in hand? Is it too bulky, too slick, or uncomfortable to use?<\/p><p class=\"wp-block-paragraph\">In some cases, <a href=\"https:\/\/www.plasticmoulds.net\/rapid-prototype\">rapid prototyping<\/a> methods like 3D printing are used to create a prototype. While 3D printed prototypes can help visualize the form and fit of a design quickly, they typically don\u2019t replicate the material properties or production processes of injection molding. However, 3D printed models can provide invaluable insights into design adjustments that are necessary before creating more expensive molds.<\/p><p class=\"wp-block-paragraph\">Prototyping also offers the opportunity to refine the assembly process. Can all parts be easily assembled? Is there an easier way to connect them? Are any adjustments needed in terms of part tolerances? Testing with a prototype helps uncover these small but significant issues that might lead to bigger problems during mass production.<\/p><h2 class=\"wp-block-heading\">9. Tooling<\/h2><figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/injection-mold-structure.webp\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"682\" src=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/injection-mold-structure.webp\" alt=\"injection mold structure\" class=\"wp-image-14452\" srcset=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/injection-mold-structure.webp 1024w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/injection-mold-structure-300x200.webp 300w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/injection-mold-structure-768x512.webp 768w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/08\/injection-mold-structure-18x12.webp 18w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">injection mold structure<\/figcaption><\/figure><p class=\"wp-block-paragraph\">Tooling is arguably one of the most expensive and time-consuming stages of product development. This step involves creating the molds or tools that will be used to produce your product in large quantities. The tooling process involves crafting precise molds for injection molding, die casting, or other manufacturing techniques, and it sets the stage for mass production.<\/p><p class=\"wp-block-paragraph\">Creating the right tooling is essential to the success of your product\u2019s manufacturing process. If the tooling is inaccurate or poorly designed, it could lead to defects such as poor surface finish, dimensional inaccuracies, or excessive cycle times. For injection molding, the creation of the mold is a highly specialized task that requires experienced engineers and machinists. The mold design process considers the number of cavities (how many identical parts can be produced at once), gating systems (how the molten material enters the mold), and cooling channels (to control the temperature and ensure uniform cooling).<\/p><p class=\"wp-block-paragraph\">The tooling process often begins with prototyping the mold itself, creating test molds to verify the design and identify any issues before full-scale production begins. Once the mold is ready, it undergoes testing to ensure that it\u2019s capable of producing consistent, high-quality parts without excessive wear. For example, if you\u2019re designing a component for an <a href=\"https:\/\/www.plasticmoulds.net\/injection-molding-for-automotive-industry.html\">automotive application<\/a>, you\u2019ll need tooling that can handle high volumes without degradation of precision. Typically, this tooling is made from hardened steel to withstand the pressure of multiple injection cycles.<\/p><p class=\"wp-block-paragraph\">It\u2019s important to note that tooling costs are a significant part of the overall manufacturing cost, and these costs can vary depending on the complexity of the product design. Complex features, like multi-cavity molds, may cost more to produce but result in faster cycle times and lower per-unit costs. Additionally, if the tooling is designed poorly or needs frequent maintenance, it could lead to delays in production or increased scrap rates, which ultimately raises the cost of production.<\/p><h2 class=\"wp-block-heading\">10. Production<\/h2><figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/05\/2025-04-02-24.png\"><img loading=\"lazy\" decoding=\"async\" width=\"828\" height=\"542\" src=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/05\/2025-04-02-24.png\" alt=\"injection molding machine\" class=\"wp-image-13951\" srcset=\"https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/05\/2025-04-02-24.png 828w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/05\/2025-04-02-24-300x196.png 300w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/05\/2025-04-02-24-768x503.png 768w, https:\/\/www.plasticmoulds.net\/wp-content\/uploads\/2025\/05\/2025-04-02-24-18x12.png 18w\" sizes=\"auto, (max-width: 828px) 100vw, 828px\" \/><\/a><\/figure><p class=\"wp-block-paragraph\">Finally, we arrive at the production phase, where your product comes to life in large quantities. During production, quality control is key. For injection molded parts, this means checking each batch for defects such as short shots (incomplete filling), warping, or sink marks (surface imperfections due to cooling).<\/p><p class=\"wp-block-paragraph\">At this point, you\u2019ll likely enter into a continuous feedback loop with the manufacturing team, ensuring the process stays on track. If you\u2019ve followed all the previous steps carefully, the production phase should run smoothly. But even then, regular monitoring is essential to maintain the quality and integrity of each batch. For more information on operational standards, visit our <a href=\"https:\/\/www.plasticmoulds.net\/blog\">blog<\/a> for daily updates.<\/p><p class=\"wp-block-paragraph\">In conclusion, successful product development is a journey that requires meticulous planning and careful execution. From defining your requirements to final production, each step in the design process plays a critical role in ensuring your product not only meets customer needs but is also manufacturable and cost-effective. By following these 10 key steps, you\u2019ll set yourself up for success and avoid common pitfalls that can derail product development. Take each step seriously, and you\u2019ll be well on your way to turning your ideas into reality.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Table of Contents1. Defining Requirements2. Create a Preliminary Concept Sketch3. Initial Materials Selection4. Design Parts5. Structural Analysis6. Final Materials Selection7. Modify the Design for Manufacturing (DFM)8. Prototyping9. Tooling10. ProductionThe Ultimate Guide to Simplifying the Design Process for New Product DevelopersCreating a new product is both an exciting and daunting task. Whether you\u2019re a seasoned designer [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-4276","page","type-page","status-publish","hentry"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"_links":{"self":[{"href":"https:\/\/www.plasticmoulds.net\/pt\/wp-json\/wp\/v2\/pages\/4276","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.plasticmoulds.net\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.plasticmoulds.net\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.plasticmoulds.net\/pt\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.plasticmoulds.net\/pt\/wp-json\/wp\/v2\/comments?post=4276"}],"version-history":[{"count":13,"href":"https:\/\/www.plasticmoulds.net\/pt\/wp-json\/wp\/v2\/pages\/4276\/revisions"}],"predecessor-version":[{"id":19224,"href":"https:\/\/www.plasticmoulds.net\/pt\/wp-json\/wp\/v2\/pages\/4276\/revisions\/19224"}],"wp:attachment":[{"href":"https:\/\/www.plasticmoulds.net\/pt\/wp-json\/wp\/v2\/media?parent=4276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}