{"id":24411,"date":"2026-05-07T13:46:44","date_gmt":"2026-05-07T11:46:44","guid":{"rendered":"https:\/\/cortez-engineering.com\/?page_id=24411"},"modified":"2026-05-08T12:27:26","modified_gmt":"2026-05-08T10:27:26","slug":"3d-printing-price-calculator","status":"publish","type":"page","link":"https:\/\/cortez-engineering.com\/en\/3d-printing-price-calculator\/","title":{"rendered":"3D Printing Price Calculator"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"24411\" class=\"elementor elementor-24411\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a2123ff elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a2123ff\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-faa6677\" data-id=\"faa6677\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-575d474 elementor-widget elementor-widget-html\" data-id=\"575d474\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!--\r\nELEMENTOR READY \u2014 Cortez Engineering 3D Calculator \u2014 EN\r\n\r\nThis version is prepared for the English page.\r\nPaste this block into an Elementor HTML widget.\r\nIt does not include <!DOCTYPE>, <html>, <head> or <body>.\r\n\r\nImportant:\r\n- The Spanish and German versions remain unchanged.\r\n- This version sends lang=en to the backend.\r\n- Your current multilingual PHP already supports EN.\r\n-->\r\n\r\n<div id=\"ce-3d-calculator\" class=\"no-file\">\r\n  <style>\r\n    #ce-3d-calculator{--bg:#fff;--bg-s:#f5f6f7;--bg-s2:#eef0f2;--bd:#e3e5e8;--bds:#c8ccd0;--tx:#111;--tx2:#555c62;--tx3:#9199a0;--ac:#18f07e;--acd:#0ec46a;--acs:rgba(24,240,126,.10);--bk:#0d0d0d;--r:14px;--rl:22px;--pill:9999px;--mx:1180px;background:var(--bg);color:var(--tx);font-family:Outfit,system-ui,sans-serif;font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased}\r\n    #ce-3d-calculator *{box-sizing:border-box}\r\n    #ce-3d-calculator a{color:inherit;text-decoration:none}\r\n    #ce-3d-calculator .intro{max-width:var(--mx);margin:0 auto;padding:72px 40px 0}\r\n    #ce-3d-calculator .intro h1{font-size:clamp(36px,4.5vw,54px);font-weight:800;letter-spacing:-.025em;line-height:1.08;margin:0 0 20px}\r\n    #ce-3d-calculator .intro p{font-size:17px;color:var(--tx2);max-width:720px;line-height:1.65;margin:0}\r\n    #ce-3d-calculator .co{max-width:var(--mx);margin:0 auto;padding:48px 40px 0;overflow:visible}\r\n    #ce-3d-calculator .cgrid{display:grid;grid-template-columns:1fr 340px;gap:20px;align-items:start;overflow:visible}\r\n    #ce-3d-calculator .cleft{display:flex;flex-direction:column;gap:20px}\r\n    #ce-3d-calculator .dz{border:2px dashed var(--bds);border-radius:var(--rl);background:var(--bg-s);padding:80px 40px;text-align:center;cursor:pointer;transition:border-color .25s,background .25s}\r\n    #ce-3d-calculator .dz:hover,#ce-3d-calculator .dz.over,#ce-3d-calculator .dz.loading{border-color:var(--acd);background:var(--acs)}\r\n    #ce-3d-calculator .dz-icon{width:56px;height:56px;margin:0 auto 20px;color:var(--tx3)}\r\n    #ce-3d-calculator .dz h3{font-size:20px;font-weight:700;margin:0 0 8px}\r\n    #ce-3d-calculator .dz p{font-size:15px;color:var(--tx2);margin:0 0 18px}\r\n    #ce-3d-calculator .brbtn{display:inline-flex;align-items:center;gap:8px;padding:11px 24px;border-radius:var(--pill);background:var(--bk);color:#fff;font-size:14px;font-weight:600}\r\n    #ce-3d-calculator .dfmt{margin-top:14px;font-size:12px;color:var(--tx3);letter-spacing:.04em}\r\n    #ce-3d-calculator .dzstatus{margin-top:12px;font-size:13px;font-weight:700;color:var(--acd);display:none}\r\n    #ce-3d-calculator .dz.loading .dzstatus{display:block}\r\n    #ce-3d-calculator input[type=file]{display:none}\r\n    #ce-3d-calculator .priv{display:flex;align-items:flex-start;gap:10px;font-size:13px;color:var(--tx3);line-height:1.55}\r\n    #ce-3d-calculator .priv svg{flex-shrink:0;margin-top:2px}\r\n    #ce-3d-calculator .fcard{display:none;background:#fff;border:1px solid var(--bd);border-radius:var(--r);overflow:hidden}\r\n    #ce-3d-calculator .fcard.show{display:block}\r\n    #ce-3d-calculator .fchead{display:flex;align-items:center;justify-content:space-between;padding:16px 22px;border-bottom:1px solid var(--bd);background:var(--bg-s);gap:14px}\r\n    #ce-3d-calculator .fcname{display:flex;align-items:center;gap:10px;font-weight:600;font-size:15px;min-width:0}\r\n    #ce-3d-calculator .fcname span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\r\n    #ce-3d-calculator .fcname svg{color:var(--acd);flex-shrink:0}\r\n    #ce-3d-calculator .factions{display:flex;align-items:center;gap:10px;flex-shrink:0;flex-wrap:wrap}\r\n    #ce-3d-calculator .fstatus{display:inline-flex;padding:5px 10px;border-radius:var(--pill);background:var(--acs);color:var(--acd);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}\r\n    #ce-3d-calculator .fcrep{padding:6px 14px;border-radius:var(--pill);border:1px solid var(--bd);background:#fff;font-size:12px;font-weight:500;cursor:pointer;color:var(--tx2);font-family:inherit}\r\n    #ce-3d-calculator .fstats{display:grid;grid-template-columns:repeat(4,1fr);padding:18px 22px;gap:16px}\r\n    #ce-3d-calculator .fstat .sl{font-size:12px;color:var(--tx3);margin-bottom:4px}\r\n    #ce-3d-calculator .fstat .sv{font-size:15px;font-weight:600;color:var(--tx)}\r\n    #ce-3d-calculator .fileslist{display:grid;gap:8px;padding:0 22px 18px}\r\n    #ce-3d-calculator .loadedTitle{font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--tx2);padding:16px 22px 8px}\r\n    #ce-3d-calculator .multiNote{font-size:12px;color:var(--tx3);padding:0 22px 10px;line-height:1.45}\r\n    #ce-3d-calculator .fileitem{display:grid;grid-template-columns:auto 1fr auto;gap:12px;align-items:center;padding:10px 12px;border:1px solid var(--bd);border-radius:var(--r);background:#fff;cursor:pointer}\r\n    #ce-3d-calculator .fileitem:hover{background:var(--bg-s)}\r\n    #ce-3d-calculator .fileitem.active{border-color:var(--acd);background:var(--acs)}\r\n    #ce-3d-calculator .filebadge{width:28px;height:28px;border-radius:var(--pill);background:var(--bk);color:#fff;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:800;flex-shrink:0}\r\n    #ce-3d-calculator .fileitem.active .filebadge{background:var(--acd);color:var(--bk)}\r\n    #ce-3d-calculator .fileitem .fn{font-size:13px;font-weight:800;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\r\n    #ce-3d-calculator .fileitem .fm{font-size:12px;color:var(--tx2);margin-top:1px}\r\n    #ce-3d-calculator .fileitem .fp{font-size:12px;font-weight:800;color:var(--tx);white-space:nowrap}\r\n    #ce-3d-calculator .viewer{display:none;background:#fff;border:1px solid var(--bd);border-radius:var(--r);overflow:hidden}\r\n    #ce-3d-calculator .viewer.show{display:block}\r\n    #ce-3d-calculator .vhead{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:14px 18px;border-bottom:1px solid var(--bd);background:var(--bg-s)}\r\n    #ce-3d-calculator .vtitle{font-size:13px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--tx2)}\r\n    #ce-3d-calculator .vhint{font-size:12px;color:var(--tx3);text-align:right}\r\n    #ce-3d-calculator .vbox{height:360px;background:linear-gradient(180deg,#fafafa,#eef0f2);position:relative}\r\n    #ce-3d-calculator .vbox canvas{display:block;width:100%;height:100%;cursor:grab}\r\n    #ce-3d-calculator .vbox canvas:active{cursor:grabbing}\r\n    #ce-3d-calculator .vmsg{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;text-align:center;padding:30px;color:var(--tx2);font-size:14px;line-height:1.55}\r\n    #ce-3d-calculator .vmsg strong{display:block;color:var(--tx);font-size:16px;margin-bottom:6px}\r\n    #ce-3d-calculator .cpanel{display:none;background:#fff;border:1px solid var(--bd);border-radius:var(--r)}\r\n    #ce-3d-calculator .cpanel.show{display:block}\r\n    #ce-3d-calculator .csec{padding:24px 24px 0}\r\n    #ce-3d-calculator .csec:last-child{padding-bottom:24px}\r\n    #ce-3d-calculator .csec+.csec{border-top:1px solid var(--bd);padding-top:20px}\r\n    #ce-3d-calculator .clbl{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--tx2);margin-bottom:14px;display:block}\r\n    #ce-3d-calculator .mgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}\r\n    #ce-3d-calculator .mbtn,#ce-3d-calculator .obtn{border:1.5px solid var(--bd);border-radius:var(--r);background:#fff;cursor:pointer;font-family:inherit;transition:all .2s}\r\n    #ce-3d-calculator .mbtn{padding:14px 16px;text-align:left}\r\n    #ce-3d-calculator .mbtn:hover,#ce-3d-calculator .obtn:hover{border-color:var(--bds);background:var(--bg-s)}\r\n    #ce-3d-calculator .mbtn.sel,#ce-3d-calculator .obtn.sel{border-color:var(--acd);background:var(--acs)}\r\n    #ce-3d-calculator .mbtn.disabled{opacity:.55;cursor:not-allowed;background:#f8f9fa}\r\n    #ce-3d-calculator .mbtn.disabled:hover{border-color:var(--bd);background:#f8f9fa}\r\n    #ce-3d-calculator .mbtn.disabled .mp{background:#e5e7eb;color:#6b7280}\r\n    #ce-3d-calculator .mbtn .mn{font-size:15px;font-weight:700;color:var(--tx);margin-bottom:2px}\r\n    #ce-3d-calculator .mbtn .ms{font-size:12px;color:var(--tx2)}\r\n    #ce-3d-calculator .mbtn .mp{display:inline-flex;margin-top:8px;padding:4px 9px;border-radius:var(--pill);background:var(--bg-s2);color:var(--tx2);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}\r\n    #ce-3d-calculator .orow{display:flex;flex-wrap:wrap;gap:8px}\r\n    #ce-3d-calculator .obtn{padding:10px 16px}\r\n    #ce-3d-calculator .obtn .on{font-size:14px;font-weight:700}\r\n    #ce-3d-calculator .obtn .os{font-size:11px;color:var(--tx2);margin-top:2px}\r\n    #ce-3d-calculator .qrow{display:flex;align-items:center;gap:6px;flex-wrap:wrap}\r\n    #ce-3d-calculator .qm,#ce-3d-calculator .qp{width:40px;height:40px;border:1.5px solid var(--bd);border-radius:var(--pill);background:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-family:inherit}\r\n    #ce-3d-calculator #qtyInput{width:72px;height:40px;text-align:center;border:1.5px solid var(--bd);border-radius:var(--r);background:#fff;font-size:15px;font-weight:700;font-family:inherit;outline:none}\r\n    #ce-3d-calculator .qlbl{font-size:14px;color:var(--tx2)}\r\n    #ce-3d-calculator .optbox{display:none;margin-top:14px;padding:18px;border:1px solid var(--bd);border-radius:var(--r);background:var(--bg-s)}\r\n    #ce-3d-calculator .optbox.show{display:block}\r\n    #ce-3d-calculator .optbox h4{font-size:15px;font-weight:800;margin:0 0 6px}\r\n    #ce-3d-calculator .optbox p{font-size:13px;color:var(--tx2);line-height:1.55;margin:0 0 14px}\r\n    #ce-3d-calculator .optgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}\r\n    #ce-3d-calculator .optfield{display:grid;gap:5px}\r\n    #ce-3d-calculator .optfield label{font-size:12px;font-weight:600;color:var(--tx2)}\r\n    #ce-3d-calculator .optfield input,#ce-3d-calculator .optfield select,#ce-3d-calculator .optfield textarea{width:100%;padding:11px 12px;border:1.5px solid var(--bd);border-radius:var(--r);background:#fff;font-family:inherit;font-size:14px;outline:none}\r\n    #ce-3d-calculator .optfield textarea{min-height:76px;resize:vertical}\r\n    #ce-3d-calculator .optnote{margin-top:12px;font-size:12px;color:var(--tx3);line-height:1.5}\r\n    #ce-3d-calculator .qfsec{display:none}\r\n    #ce-3d-calculator .qfsec.show{display:block}\r\n    #ce-3d-calculator .qfform{display:grid;gap:14px}\r\n    #ce-3d-calculator .qffield{display:grid;gap:6px}\r\n    #ce-3d-calculator .qffield label{font-size:13px;font-weight:700;color:var(--tx2)}\r\n    #ce-3d-calculator .qffield input,#ce-3d-calculator .qffield textarea{width:100%;padding:13px 16px;border:1.5px solid var(--bd);border-radius:var(--r);background:var(--bg-s);font-family:inherit;font-size:15px;outline:none}\r\n    #ce-3d-calculator .qffield textarea{resize:vertical;min-height:120px;line-height:1.55}\r\n    #ce-3d-calculator .qfrow{display:grid;grid-template-columns:1fr 1fr;gap:12px}\r\n    #ce-3d-calculator .checkrow{display:flex;align-items:flex-start;gap:10px;padding:14px 16px;border:1px solid var(--bd);border-radius:var(--r);background:var(--bg-s)}\r\n    #ce-3d-calculator .checkrow input[type=\"checkbox\"]{display:inline-grid!important;appearance:auto!important;-webkit-appearance:checkbox!important;width:16px!important;height:16px!important;min-width:16px!important;min-height:16px!important;margin:4px 0 0!important;opacity:1!important;visibility:visible!important;position:static!important;accent-color:var(--acd);flex-shrink:0}\r\n    #ce-3d-calculator .checkrow span{font-size:14px;color:var(--tx2);line-height:1.45}\r\n    #ce-3d-calculator .hiddenfield{display:none}\r\n    #ce-3d-calculator .hiddenfield.show{display:grid}\r\n    #ce-3d-calculator .filesmall{font-size:12px;color:var(--tx3);line-height:1.45;margin-top:4px}\r\n    #ce-3d-calculator .filepick{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:13px 18px;border-radius:var(--pill);background:var(--bk);color:#fff;font-size:14px;font-weight:700;cursor:pointer}\r\n    #ce-3d-calculator .filepicked{display:none;margin-top:8px;padding:9px 12px;border-radius:var(--r);background:var(--acs);color:var(--acd);font-size:12px;font-weight:700;line-height:1.35;word-break:break-word}\r\n    #ce-3d-calculator .filepicked.show{display:block}\r\n    #ce-3d-calculator .cright{position:-webkit-sticky;position:sticky;top:170px;align-self:flex-start;background:var(--bg-s);border:1px solid var(--bd);border-radius:var(--rl);overflow:hidden;z-index:5}\r\n    #ce-3d-calculator.no-file .cright{position:static;top:auto}\r\n    #ce-3d-calculator .shead{padding:22px 24px 18px;border-bottom:1px solid var(--bd);background:#fff}\r\n    #ce-3d-calculator .shead h3{font-size:15px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--tx2);margin:0}\r\n    #ce-3d-calculator .bdown{padding:18px 24px 0}\r\n    #ce-3d-calculator .br{display:flex;justify-content:space-between;align-items:center;padding:10px 0;font-size:14px;border-bottom:1px dashed var(--bd);gap:14px}\r\n    #ce-3d-calculator .br .bl{color:var(--tx2)}\r\n    #ce-3d-calculator .br .bv{font-weight:600;text-align:right}\r\n    #ce-3d-calculator .tblock{margin:18px 24px 0;padding:20px;background:#fff;border:1px solid var(--bd);border-radius:var(--r)}\r\n    #ce-3d-calculator .tlbl{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--tx3);margin-bottom:6px}\r\n    #ce-3d-calculator .tamt{font-size:46px;font-weight:800;letter-spacing:-.03em;line-height:1}\r\n    #ce-3d-calculator .tvat{font-size:12px;color:var(--tx3);margin-top:4px}\r\n    #ce-3d-calculator .tunit{font-size:13px;color:var(--tx2);margin-top:4px;font-weight:500}\r\n    #ce-3d-calculator .shipPromo{display:none;margin-top:14px;padding:12px 14px;border-radius:var(--r);background:var(--acs);border:1px solid rgba(24,240,126,.35);color:var(--tx);font-size:13px;font-weight:800;line-height:1.35}\r\n    #ce-3d-calculator .shipPromo.show{display:block}\r\n    #ce-3d-calculator .shipPromo .small{display:block;margin-top:3px;font-size:11px;font-weight:600;color:var(--tx2)}\r\n    #ce-3d-calculator .shipPromo.free{background:var(--ac);border-color:var(--ac);color:var(--bk)}\r\n    #ce-3d-calculator .shipPromo.review{background:#fff;border-color:var(--bd);color:var(--tx2)}\r\n    #ce-3d-calculator .sndbtn{display:block;width:calc(100% - 48px);margin:16px 24px;padding:15px;text-align:center;background:var(--ac);color:var(--bk);font-weight:700;font-size:15px;border-radius:var(--pill);border:none;cursor:pointer;font-family:inherit;transition:all .25s}\r\n    #ce-3d-calculator .sndbtn:hover{background:var(--acd);color:#fff;box-shadow:0 6px 20px rgba(24,240,126,.3);transform:translateY(-1px)}\r\n    #ce-3d-calculator .sndbtn:disabled{opacity:.45;pointer-events:none}\r\n    #ce-3d-calculator .uploadProgress{display:none;margin:0 24px 18px;padding:14px;border:1px solid var(--bd);border-radius:var(--r);background:#fff}\r\n    #ce-3d-calculator .uploadProgress.show{display:block}\r\n    #ce-3d-calculator .uploadProgressTop{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:8px;font-size:12px;font-weight:800;color:var(--tx2)}\r\n    #ce-3d-calculator .uploadBar{height:9px;border-radius:var(--pill);background:var(--bg-s2);overflow:hidden}\r\n    #ce-3d-calculator .uploadBarFill{height:100%;width:0%;border-radius:var(--pill);background:var(--ac);transition:width .15s ease}\r\n    #ce-3d-calculator .uploadProgressNote{margin-top:8px;font-size:11px;color:var(--tx3);line-height:1.4}\r\n    #ce-3d-calculator .price-pending .tamt{color:var(--tx3)}\r\n    #ce-3d-calculator .price-pending .bdown{opacity:.65}\r\n    #ce-3d-calculator .nfsec{max-width:var(--mx);margin:0 auto;padding:48px 40px 100px}\r\n    #ce-3d-calculator .nfcard{border:1px solid var(--bd);border-radius:var(--rl);overflow:hidden}\r\n    #ce-3d-calculator .nfhead{background:var(--bg-s);padding:40px 48px;border-bottom:1px solid var(--bd)}\r\n    #ce-3d-calculator .nfhead h2{font-size:28px;font-weight:800;letter-spacing:-.02em;margin:0 0 8px}\r\n    #ce-3d-calculator .nfhead p{font-size:16px;color:var(--tx2);max-width:620px;line-height:1.6;margin:0}\r\n    #ce-3d-calculator .nfbody{padding:40px 48px;display:grid;grid-template-columns:1fr 1fr;gap:48px}\r\n    #ce-3d-calculator .nfform{display:grid;gap:14px}\r\n    #ce-3d-calculator .nfform input,#ce-3d-calculator .nfform textarea{width:100%;padding:13px 16px;border:1.5px solid var(--bd);border-radius:var(--r);background:var(--bg-s);font-family:inherit;font-size:15px;outline:none}\r\n    #ce-3d-calculator .nfform textarea{resize:vertical;min-height:160px}\r\n    #ce-3d-calculator .nflbl{font-size:13px;font-weight:600;color:var(--tx2);margin-bottom:6px;display:block}\r\n    #ce-3d-calculator .nfsub{padding:14px 32px;border-radius:var(--pill);background:var(--bk);color:#fff;font-size:15px;font-weight:700;border:none;cursor:pointer;font-family:inherit}\r\n    #ce-3d-calculator .nfinfo p{font-size:15px;color:var(--tx2);line-height:1.7;margin:0 0 12px}\r\n    #ce-3d-calculator .nfinfo p:first-child{font-size:16px;font-weight:600;color:var(--tx);margin-bottom:10px}\r\n    #ce-3d-calculator .nfsvcbtn{display:inline-flex;align-items:center;justify-content:center;margin-top:10px;padding:13px 24px;border-radius:var(--pill);background:var(--ac);color:var(--bk);font-size:14px;font-weight:800;line-height:1;text-decoration:none;transition:all .25s}\r\n    #ce-3d-calculator .nfsvcbtn:hover{background:var(--acd);color:#fff;box-shadow:0 6px 20px rgba(24,240,126,.3);transform:translateY(-1px)}\r\n    @media(max-width:1024px){#ce-3d-calculator .cgrid{grid-template-columns:1fr}#ce-3d-calculator .cright{position:static;top:auto}#ce-3d-calculator .nfbody{grid-template-columns:1fr;gap:32px}}\r\n    @media(max-width:720px){#ce-3d-calculator .optgrid,#ce-3d-calculator .qfrow{grid-template-columns:1fr}#ce-3d-calculator .intro,#ce-3d-calculator .co,#ce-3d-calculator .nfsec{padding-left:20px;padding-right:20px}#ce-3d-calculator .nfhead,#ce-3d-calculator .nfbody{padding:28px 24px}#ce-3d-calculator .mgrid{grid-template-columns:1fr}#ce-3d-calculator .fstats{grid-template-columns:repeat(2,1fr)}#ce-3d-calculator .tamt{font-size:38px}}\r\n  <\/style>\r\n\r\n  <div class=\"intro\"><h1>3D Printing<br>Price Calculator<\/h1><p>Upload your file and get an instant indicative price estimate. If the estimate fits your needs, you can send us the data for technical review and final quotation.<\/p><\/div>\r\n  <div class=\"co\"><div class=\"cgrid\"><div class=\"cleft\"><div class=\"dz\" id=\"dz\"><svg class=\"dz-icon\" viewbox=\"0 0 56 56\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M28 10v28M16 26l12 12 12-12\"\/><path d=\"M8 42v6h40v-6\"\/><\/svg><h3>Drag your 3D files here<\/h3><p>or click to browse your computer<\/p><div class=\"brbtn\" id=\"brbtn\">Select file<\/div><div class=\"dfmt\">STL \u00b7 OBJ with automatic calculation \u00b7 STEP \/ 3MF for technical review<\/div><div class=\"dzstatus\" id=\"dzstatus\">Processing file\u2026<\/div><input type=\"file\" id=\"fi\" accept=\".stl,.obj,.step,.stp,.3mf\" multiple><\/div><div class=\"priv\"><svg width=\"15\" height=\"15\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/><\/svg><span>STL and OBJ files are processed locally in your browser to calculate an estimate. STEP and 3MF files are accepted for manual technical review. The file is only sent if you decide to submit the request.<\/span><\/div><div class=\"fcard\" id=\"fcard\"><div class=\"fchead\"><div class=\"fcname\"><svg width=\"18\" height=\"18\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M13 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V9z\"\/><polyline points=\"13 2 13 9 20 9\"\/><\/svg><span id=\"fcname\">\u2014<\/span><\/div><div class=\"factions\"><span class=\"fstatus\" id=\"fstatus\">File loaded<\/span><button class=\"fcrep\" id=\"fadd\" type=\"button\">+ Add file<\/button><button class=\"fcrep\" id=\"fdel\" type=\"button\">Remove<\/button><\/div><\/div><div class=\"fstats\"><div class=\"fstat\"><div class=\"sl\">Volume<\/div><div class=\"sv\" id=\"svol\">\u2014<\/div><\/div><div class=\"fstat\"><div class=\"sl\">Dimensions mm<\/div><div class=\"sv\" id=\"sdim\">\u2014<\/div><\/div><div class=\"fstat\"><div class=\"sl\">Triangles<\/div><div class=\"sv\" id=\"stri\">\u2014<\/div><\/div><div class=\"fstat\"><div class=\"sl\">File size<\/div><div class=\"sv\" id=\"ssz\">\u2014<\/div><\/div><\/div><div class=\"fileslist\" id=\"fileslist\"><\/div><\/div><div class=\"viewer\" id=\"viewer\"><div class=\"vhead\"><div class=\"vtitle\">3D preview<\/div><div class=\"vhint\" id=\"vhint\">Drag to rotate \u00b7 scroll to zoom<\/div><\/div><div class=\"vbox\" id=\"vbox\"><div class=\"vmsg\" id=\"vmsg\"><div><strong>Model preview<\/strong>Upload an STL or OBJ file to interact with the part.<\/div><\/div><\/div><\/div><div class=\"cpanel\" id=\"cpanel\"><div class=\"csec\"><span class=\"clbl\">Material<\/span><div class=\"mgrid\" id=\"mgrid\"><\/div><\/div><div class=\"csec\"><span class=\"clbl\">Layer quality<\/span><div class=\"orow\" id=\"qrow\"><\/div><\/div><div class=\"csec\"><span class=\"clbl\">Filling \/ Infill<\/span><div class=\"orow\" id=\"irow\"><\/div><div class=\"optbox\" id=\"optbox\"><h4>Structural infill optimization<\/h4><p>This option is not a standard infill and does not simply mean printing at 100%. It includes FEM-based optimization, technical analysis of the part and a short PDF report with improvements in weight, stiffness or material distribution.<\/p><div class=\"optgrid\"><div class=\"optfield\"><label for=\"forceInput\">Estimated main force (N)<\/label><input type=\"number\" id=\"forceInput\" min=\"0\" step=\"10\" placeholder=\"e.g. 10000\"><\/div><div class=\"optfield\"><label for=\"loadPointsInput\">Load points<\/label><input type=\"number\" id=\"loadPointsInput\" min=\"0\" step=\"1\" placeholder=\"e.g. 2\"><\/div><div class=\"optfield\"><label for=\"supportPointsInput\">Support \/ fixing points<\/label><input type=\"number\" id=\"supportPointsInput\" min=\"0\" step=\"1\" placeholder=\"e.g. 4\"><\/div><div class=\"optfield\"><label for=\"objectiveInput\">Main objective<\/label><select id=\"objectiveInput\"><option>Reduce weight while maintaining stiffness<\/option><option>Increase stiffness<\/option><option>Reduce deformation<\/option><option>Reinforce critical areas<\/option><\/select><\/div><div class=\"optfield\" style=\"grid-column:1\/-1\"><label for=\"loadDescInput\">Description of loads and part use<\/label><textarea id=\"loadDescInput\" placeholder=\"e.g. vertical force on this face, part fixed with 4 screws, functional use, approximate temperature, etc.\"><\/textarea><\/div><\/div><div class=\"optnote\">Adaptive infill aims to reinforce the areas that work the most and reduce material where it contributes less. It can improve the weight-to-stiffness ratio, reduce local deformation and avoid an unnecessarily solid and heavy part.<\/div><\/div><\/div><div class=\"csec\"><span class=\"clbl\">Quantity<\/span><div class=\"qrow\"><button class=\"qm\" id=\"qm\" type=\"button\">\u2212<\/button><input type=\"number\" id=\"qtyInput\" value=\"1\" min=\"1\" max=\"10000\"><button class=\"qp\" id=\"qp\" type=\"button\">+<\/button><span class=\"qlbl\">units<\/span><\/div><\/div><div class=\"csec\"><span class=\"clbl\">Shipping destination<\/span><div class=\"orow\" id=\"shiprowopts\"><\/div><\/div><div class=\"csec qfsec\" id=\"qfsec\"><form class=\"qfform\" id=\"qfform\" action=\"\"><div style=\"position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden;\" aria-hidden=\"true\"><label for=\"ceWebsite\">Website<\/label><input type=\"text\" id=\"ceWebsite\" name=\"website\" tabindex=\"-1\" autocomplete=\"off\"><\/div><div class=\"qfrow\"><div class=\"qffield\"><label for=\"qfe\">Email *<\/label><input type=\"email\" id=\"qfe\" placeholder=\"your@email.com\" required><\/div><div class=\"qffield\"><label for=\"qfp\">Phone *<\/label><input type=\"tel\" id=\"qfp\" placeholder=\"+49 \u2026\" required><\/div><\/div><div class=\"checkrow\"><input type=\"checkbox\" id=\"isCompany\"><span>Are you purchasing as a company?<\/span><\/div><div class=\"hiddenfield\" id=\"companyFields\"><div class=\"qfrow\"><div class=\"qffield\"><label for=\"companyName\">Company name *<\/label><input type=\"text\" id=\"companyName\" placeholder=\"e.g. Cortez Engineering\"><\/div><div class=\"qffield\"><label for=\"billingCountry\">Billing country *<\/label><input type=\"text\" id=\"billingCountry\" placeholder=\"e.g. Germany, France, Spain\u2026\"><\/div><\/div><\/div><div class=\"qffield\"><label for=\"qfd\">Part \/ project details *<\/label><textarea id=\"qfd\" placeholder=\"e.g. part use, decorative or functional part, critical areas, tolerances, desired finish, deadline, operating conditions\u2026\" required><\/textarea><\/div><div class=\"checkrow\"><input type=\"checkbox\" id=\"specificColor\"><span>I want a specific color. If you do not select this option, we will use an available standard color, usually white, black or the most suitable color depending on material and availability.<\/span><\/div><div class=\"qffield hiddenfield\" id=\"colorField\"><label for=\"colorText\">Desired color<\/label><input type=\"text\" id=\"colorText\" placeholder=\"e.g. matte black, white, red, dark grey, similar to RAL 9005\u2026\"><\/div><div class=\"qffield\"><label>Optional drawing, PDF or additional technical documentation<\/label><label for=\"qfpdf\" class=\"filepick\">Attach optional PDF \/ image<\/label><input type=\"file\" id=\"qfpdf\" accept=\".pdf,.png,.jpg,.jpeg\"><div class=\"filepicked\" id=\"pdfStatus\">Document attached<\/div><div class=\"filesmall\">Optional. You can add a drawing, sketch, screenshot or technical document if it helps us understand the part better.<\/div><\/div><input type=\"hidden\" name=\"trp-form-language\" value=\"en\"\/><\/form><\/div><\/div><\/div><div class=\"cright price-pending\" id=\"cright\"><div class=\"shead\"><h3>Price summary<\/h3><\/div><div class=\"bdown\"><div class=\"br\"><span class=\"bl\">Material<\/span><span class=\"bv\" id=\"bmat\">\u2014<\/span><\/div><div class=\"br\"><span class=\"bl\">Quality<\/span><span class=\"bv\" id=\"bqual\">\u2014<\/span><\/div><div class=\"br\"><span class=\"bl\">Infill<\/span><span class=\"bv\" id=\"binfill\">\u2014<\/span><\/div><div class=\"br\" id=\"bcolorrow\" style=\"display:none\"><span class=\"bl\">Specific color<\/span><span class=\"bv\" id=\"bcolor\">\u2014<\/span><\/div><div class=\"br\"><span class=\"bl\" id=\"bweightlbl\">Estimated weight<\/span><span class=\"bv\" id=\"bweight\">\u2014<\/span><\/div><div class=\"br\"><span class=\"bl\">Preparation included<\/span><span class=\"bv\" id=\"bsetup\">\u2014<\/span><\/div><div class=\"br\"><span class=\"bl\">Quantity<\/span><span class=\"bv\" id=\"bqty\">1 unit<\/span><\/div><div class=\"br\" id=\"borderrow\" style=\"display:none\"><span class=\"bl\">Parts subtotal<\/span><span class=\"bv\" id=\"border\">\u2014<\/span><\/div><div class=\"br\" id=\"shiprow\" style=\"display:none\"><span class=\"bl\">Shipping<\/span><span class=\"bv\" id=\"bship\">\u2014<\/span><\/div><\/div><div class=\"tblock\"><div class=\"tlbl\">Estimated total<\/div><div class=\"tamt\" id=\"tamt\">\u2014 \u20ac<\/div><div class=\"tvat\">Excl. VAT \u00b7 indicative price<\/div><div class=\"tunit\" id=\"tunit\"><\/div><div class=\"shipPromo\" id=\"shipPromo\"><\/div><\/div><button class=\"sndbtn\" id=\"sndbtn\" type=\"button\" disabled>Send request \u2192<\/button><div class=\"uploadProgress\" id=\"uploadProgress\"><div class=\"uploadProgressTop\"><span id=\"uploadStatusText\">Uploading files\u2026<\/span><span id=\"uploadPercent\">0%<\/span><\/div><div class=\"uploadBar\"><div class=\"uploadBarFill\" id=\"uploadBarFill\"><\/div><\/div><div class=\"uploadProgressNote\">Please do not close this window until the upload is complete.<\/div><\/div><\/div><\/div><\/div><div class=\"nfsec\"><div class=\"nfcard\" id=\"nfcard\"><div class=\"nfhead\"><h2>Do you not have a 3D file yet?<\/h2><p>If you need design, redesign, reverse engineering, optimization or technical consulting before manufacturing, tell us about your idea and we will guide you on the next step.<\/p><\/div><div class=\"nfbody\"><form class=\"nfform\" id=\"nfform\" action=\"\"><div style=\"position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden;\" aria-hidden=\"true\"><label for=\"ceNoFileWebsite\">Website<\/label><input type=\"text\" id=\"ceNoFileWebsite\" name=\"website\" tabindex=\"-1\" autocomplete=\"off\"><\/div><div class=\"nfield\"><label class=\"nflbl\" for=\"nfe\">Email *<\/label><input type=\"email\" id=\"nfe\" placeholder=\"your@email.com\" required><\/div><div class=\"nfield\"><label class=\"nflbl\" for=\"nfp\">Phone *<\/label><input type=\"tel\" id=\"nfp\" placeholder=\"+49 \u2026\" required><\/div><div class=\"nfield\"><label class=\"nflbl\" for=\"nfd\">Tell us what you need *<\/label><textarea id=\"nfd\" placeholder=\"e.g. design a part from scratch, redesign an existing part, reverse engineering, weight optimization, strength validation\u2026\" required><\/textarea><\/div><button type=\"submit\" class=\"nfsub\">Send request<\/button><input type=\"hidden\" name=\"trp-form-language\" value=\"en\"\/><\/form><div class=\"nfinfo\"><p>Need more than 3D printing?<\/p><p>In addition to 3D printing, Cortez Engineering offers FEM analysis, topology optimization and reverse engineering. If your part needs to be redesigned before printing, we will tell you clearly.<\/p><p>We usually reply within 24 business hours. We speak English, German and Spanish.<\/p><a class=\"nfsvcbtn\" href=\"https:\/\/cortez-engineering.com\/en\/servicios\/\">View services \u2192<\/a><\/div><\/div><\/div><\/div>\r\n\r\n  <script type=\"module\">\r\n    import * as THREE from 'https:\/\/esm.sh\/three@0.160.0';\r\n\r\n    const CE_LANG='en';\r\n    const CE_ROOT = document.getElementById('ce-3d-calculator');\r\n    const $ = (id) => CE_ROOT.querySelector('#' + id);\r\n    const setText = (id, value) => { const el = $(id); if (el) el.textContent = value; };\r\n    const setHTML = (id, value) => { const el = $(id); if (el) el.innerHTML = value; };\r\n\r\n    const MATS={pla:{name:'PLA',sub:'Visual prototypes and simple parts',tag:'Fast and economical',price:.032,dens:1.24,timeFactor:1,machineRate:1.8,setupExtra:2.9},petg:{name:'PETG',sub:'Functional parts with good resistance',tag:'Functional use',price:.036,dens:1.28,timeFactor:1.05,machineRate:2.2,setupExtra:3.9},abs:{name:'ASA \/ ABS',sub:'Outdoor, temperature and automotive use',tag:'Outdoor and heat',price:.048,dens:1.05,timeFactor:1.18,machineRate:3.2,setupExtra:6.9},nylon:{name:'PA6-GF \/ Nylon',sub:'Technical parts under mechanical load',tag:'Technical engineering',price:.105,dens:1.09,timeFactor:1.4,machineRate:5.5,setupExtra:14.9},pacf:{name:'PA-CF \/ PAHT-CF',sub:'High stiffness and low deformation',tag:'High performance',price:.175,dens:1.1,timeFactor:1.55,machineRate:6.9,setupExtra:19.9},tpu:{name:'TPU 95A',sub:'Flexible, grip and impact absorption',tag:'Functional flexible',price:.06,dens:1.22,timeFactor:1.55,machineRate:4.8,setupExtra:9.9},peek:{name:'PEEK',sub:'High temperature and demanding environments',tag:'Maximum performance',price:1,dens:1.32,timeFactor:2.2,machineRate:18,setupExtra:50},multi:{name:'Multi-material',sub:'Material combination',tag:'Technical review',reviewOnly:true},continuousCarbon:{name:'Continuous carbon fiber',sub:'High-performance composite printing',tag:'Coming soon',comingSoon:true},metal:{name:'Metal',sub:'Metal additive manufacturing',tag:'Coming soon',comingSoon:true}};\r\n    const QUALS={draft:{name:'Draft',sub:'0.30 mm',qf:.85,tf:.7},std:{name:'Standard',sub:'0.20 mm',qf:1,tf:1},fine:{name:'Fine',sub:'0.10 mm',qf:1.3,tf:1.8},ultra:{name:'Ultra',sub:'0.05 mm',qf:1.8,tf:3.5}};\r\n    const INFILLS={i15:{name:'15%',sub:'lightweight',ratio:.15},i30:{name:'30%',sub:'balanced',ratio:.3},i60:{name:'60%',sub:'high strength',ratio:.6},i100:{name:'100%',sub:'maximum density',ratio:1},opt:{name:'Optimized',sub:'Adaptive infill',ratio:.35}};\r\n    const SHELL_FACTOR=.58,PROCESS_FACTOR=1.04,BASE_PRINT_SPEED_CM3_H=13.5,OPTIMIZED_VOLUME_FACTOR=.52,OPTIMIZED_WORK_HOURS=8,OPTIMIZED_HOURLY_RATE=60,OPTIMIZED_ENGINEERING_FEE=OPTIMIZED_WORK_HOURS*OPTIMIZED_HOURLY_RATE;\r\n    const SHIPPING={de:{name:'Germany',price:6.90,freeFrom:75,note:'Free from 75 \u20ac'},eu:{name:'European Union',price:16.90,freeFrom:150,note:'Free from 150 \u20ac'},other:{name:'Outside the EU',price:null,freeFrom:null,note:'To be confirmed'}};\r\n    const CE_QUOTE_ENDPOINT='\/wp-json\/cortez\/v1\/3d-quote';\r\n    const CE_CONSULT_ENDPOINT='\/wp-json\/cortez\/v1\/technical-consultation';\r\n    const MAX_TOTAL_UPLOAD_BYTES=500*1024*1024;\r\n    const LARGE_FILE_MESSAGE='For files larger than 500 MB, please send us the request and we will provide you with a secure upload link.';\r\n    let items=[],activeIndex=-1,S=defaultItem();\r\n    let V={renderer:null,scene:null,camera:null,model:null,animation:null,rotX:.52,rotZ:.75,dist:250,drag:false,lastX:0,lastY:0};\r\n\r\n    function defaultItem(){return{vol:0,mat:'pla',qual:'std',infill:'i30',qty:1,shipping:'de',file:null,fileExt:'',reviewOnly:false,colorSpecific:false,colorFee:5,colorText:'',tri:null,dimText:'',triCount:0}}\r\n    function parseBin(buf){const v=new DataView(buf),n=v.getUint32(80,true);if(84+n*50!==buf.byteLength)return null;const t=[];let o=84;for(let i=0;i<n;i++){o+=12;const a=[v.getFloat32(o,true),v.getFloat32(o+4,true),v.getFloat32(o+8,true)];o+=12;const b=[v.getFloat32(o,true),v.getFloat32(o+4,true),v.getFloat32(o+8,true)];o+=12;const c=[v.getFloat32(o,true),v.getFloat32(o+4,true),v.getFloat32(o+8,true)];o+=14;t.push([a,b,c])}return t}\r\n    function parseAscii(txt){const t=[],vb=[];for(const line of txt.split('\\n')){const s=line.trim();if(s.startsWith('vertex ')){const p=s.split(\/\\s+\/);vb.push([+p[1],+p[2],+p[3]]);if(vb.length===3){t.push([...vb]);vb.length=0}}}return t}\r\n    function parseOBJ(txt){const vs=[],t=[];for(const line of txt.split('\\n')){const s=line.trim();if(s.startsWith('v ')){const p=s.split(\/\\s+\/);vs.push([+p[1],+p[2],+p[3]])}else if(s.startsWith('f ')){const p=s.split(\/\\s+\/).slice(1).map(x=>+x.split('\/')[0]-1);for(let i=1;i<p.length-1;i++){if(vs[p[0]]&&vs[p[i]]&&vs[p[i+1]])t.push([vs[p[0]],vs[p[i]],vs[p[i+1]]])}}}return t}\r\n    function vol(tri){let s=0;for(const[a,b,c]of tri)s+=a[0]*(b[1]*c[2]-b[2]*c[1])+a[1]*(b[2]*c[0]-b[0]*c[2])+a[2]*(b[0]*c[1]-b[1]*c[0]);return Math.abs(s)\/6}\r\n    function bnds(tri){const mn=[1e9,1e9,1e9],mx=[-1e9,-1e9,-1e9];for(const face of tri)for(const p of face)for(let i=0;i<3;i++){mn[i]=Math.min(mn[i],p[i]);mx[i]=Math.max(mx[i],p[i])}return[mx[0]-mn[0],mx[1]-mn[1],mx[2]-mn[2]]}\r\n    function calcItem(it){if(!it||!it.vol||it.reviewOnly||MATS[it.mat]?.reviewOnly||MATS[it.mat]?.comingSoon)return null;const m=MATS[it.mat],q=QUALS[it.qual],f=INFILLS[it.infill],isOpt=it.infill==='opt';const vf=isOpt?OPTIMIZED_VOLUME_FACTOR:Math.min(1,(SHELL_FACTOR+(1-SHELL_FACTOR)*f.ratio)*PROCESS_FACTOR);const ev=it.vol*vf,mc=ev*m.price,ph=(ev\/BASE_PRINT_SPEED_CM3_H)*q.tf*m.timeFactor*(isOpt?1.15:1),mach=ph*m.machineRate,setup=isOpt?(12+m.setupExtra):m.setupExtra,eng=isOpt?OPTIMIZED_ENGINEERING_FEE:0;let discount=1;if(it.qty>=1000)discount=.6;else if(it.qty>=200)discount=.72;else if(it.qty>=50)discount=.82;else if(it.qty>=10)discount=.92;const colorFee=it.colorSpecific?it.colorFee:0,min=isOpt?OPTIMIZED_ENGINEERING_FEE:8.9,total=Math.max((((mc+mach)*q.qf+setup)*it.qty*discount)+eng+colorFee,min);return{optimized:isOpt,ph,w:(ev*m.dens).toFixed(1),total:total.toFixed(2),pu:(total\/it.qty).toFixed(2),colorFee:colorFee.toFixed(2)}}\r\n    function calc(){return calcItem(S)}\r\n    function calcShipping(subtotal){const cfg=SHIPPING[S.shipping||'de'];if(!cfg||cfg.price===null)return{label:'To be confirmed',price:null,remaining:null,free:false};const free=subtotal>=cfg.freeFrom&&subtotal>0,price=free?0:cfg.price,remaining=free?0:Math.max(0,cfg.freeFrom-subtotal);return{label:free?'Free':`${price.toFixed(2).replace('.',',')} \u20ac`,price,remaining,free}}\r\n    function calcOrder(){let subtotal=0,review=0;for(const it of items){const r=calcItem(it);if(r)subtotal+=Number(r.total);else if(it.reviewOnly||MATS[it.mat]?.reviewOnly||MATS[it.mat]?.comingSoon)review++}const ship=calcShipping(subtotal),total=ship.price===null?subtotal:subtotal+ship.price;return{subtotal,review,shipping:ship,subtotalText:subtotal.toFixed(2),total:total.toFixed(2)}}\r\n    function eu(v){return String(v).replace('.',',')+'&nbsp;\u20ac'}\r\n    function updateColorRow(r){const row=$('bcolorrow'),val=$('bcolor');if(!row||!val)return;if(S.colorSpecific){const txt=($('colorText')?.value||'').trim(),fee=(r?.colorFee||S.colorFee.toFixed(2)).replace('.',',');row.style.display='flex';val.textContent=txt?`${txt} \u00b7 +${fee} \u20ac`:`Yes \u00b7 +${fee} \u20ac`}else{row.style.display='none';val.textContent='\u2014'}}\r\n    function updateShippingPromo(order){const el=$('shipPromo');if(!el)return;el.className='shipPromo';el.innerHTML='';if(!S.file){el.classList.remove('show');return}const cfg=SHIPPING[S.shipping||'de'];if(!cfg||order.shipping.price===null){el.classList.add('show','review');el.innerHTML='Shipping to be confirmed<span class=\"small\">For this destination, we review shipping based on weight, size and country.<\/span>';return}if(order.shipping.free){el.classList.add('show','free');el.innerHTML='\u2713 Free shipping applied<span class=\"small\">The minimum order value for '+cfg.name+' has been reached.<\/span>';return}const remaining=order.shipping.remaining.toFixed(2).replace('.',',');el.classList.add('show');el.innerHTML='Only '+remaining+' \u20ac left for free shipping<span class=\"small\">Add another part or increase the quantity to save shipping costs in '+cfg.name+'.<\/span>'}\r\n    function syncActive(){if(activeIndex>=0&&items[activeIndex])items[activeIndex]={...S}}\r\n    function showOptBox(){const box=$('optbox');if(box)box.classList.toggle('show',S.infill==='opt')}\r\n    function syncControls(){CE_ROOT.querySelectorAll('.mbtn').forEach((b,i)=>b.classList.toggle('sel',Object.keys(MATS)[i]===S.mat));CE_ROOT.querySelectorAll('#qrow .obtn').forEach((b,i)=>b.classList.toggle('sel',Object.keys(QUALS)[i]===S.qual));CE_ROOT.querySelectorAll('#irow .obtn').forEach((b,i)=>b.classList.toggle('sel',Object.keys(INFILLS)[i]===S.infill));CE_ROOT.querySelectorAll('#shiprowopts .obtn').forEach((b,i)=>b.classList.toggle('sel',Object.keys(SHIPPING)[i]===S.shipping));$('qtyInput').value=S.qty;$('specificColor').checked=!!S.colorSpecific;$('colorField').classList.toggle('show',!!S.colorSpecific);$('colorText').value=S.colorText||'';showOptBox()}\r\n    function renderFilesList(){const list=$('fileslist');if(!list)return;list.innerHTML='';if(!items.length)return;const title=document.createElement('div');title.className='loadedTitle';title.textContent=items.length===1?'1 file loaded':`${items.length} files loaded`;list.appendChild(title);if(items.length>1){const note=document.createElement('div');note.className='multiNote';note.textContent='Each file is added to the order and can have its own material, infill, quantity and color. Select a part to edit it.';list.appendChild(note)}let html='';items.forEach((it,idx)=>{const r=calcItem(it),needsReview=it.reviewOnly||MATS[it.mat]?.reviewOnly||MATS[it.mat]?.comingSoon,price=needsReview?'Review':(r?eu(r.total).replace('&nbsp;',' '):'\u2014'),active=idx===activeIndex?' active':'',plural=it.qty>1?'s':'';html+=`<div class=\"fileitem${active}\" data-idx=\"${idx}\"><div class=\"filebadge\">${idx+1}<\/div><div><div class=\"fn\">File ${idx+1} loaded \u00b7 ${it.file.name}<\/div><div class=\"fm\">${MATS[it.mat].name} \u00b7 ${INFILLS[it.infill].name} \u00b7 ${it.qty} unit${plural}<\/div><\/div><div class=\"fp\">${price}<\/div><\/div>`});list.insertAdjacentHTML('beforeend',html);list.querySelectorAll('.fileitem').forEach(row=>row.addEventListener('click',()=>selectItem(Number(row.dataset.idx))))}\r\n    function upd(){if(S.file)syncActive();CE_ROOT.classList.toggle('no-file',!S.file);const r=calc(),cr=$('cright'),order=calcOrder();renderFilesList();updateColorRow(r);updateShippingPromo(order);const orderRow=$('borderrow');if(orderRow){orderRow.style.display=S.file?'flex':'none';setText('border',`${items.length} file(s) \u00b7 ${order.subtotalText.replace('.',',')} \u20ac`)}const shipRow=$('shiprow');if(shipRow){shipRow.style.display=S.file?'flex':'none';setText('bship',order.shipping.label)}if(!S.file){cr.classList.add('price-pending');setText('tamt','\u2014 \u20ac');$('sndbtn').disabled=true;return}setText('bmat',MATS[S.mat].name);setText('bqual',`${QUALS[S.qual].name} \u00b7 ${QUALS[S.qual].sub}`);setText('binfill',S.infill==='opt'?'Optimized \u00b7 FEM':INFILLS[S.infill].name);setText('bqty',S.qty+' unit'+(S.qty>1?'s':'')+'.');$('sndbtn').disabled=false;if(!r){cr.classList.add('price-pending');setText('bweight','Review');setText('bsetup',(MATS[S.mat]?.reviewOnly||MATS[S.mat]?.comingSoon||S.reviewOnly)?'Technical review':'Included');if(items.length>1&&order.subtotal>0){setHTML('tamt',eu(order.total));setText('tunit','Active part: technical review')}else{setText('tamt','Review');setText('tunit',(MATS[S.mat]?.reviewOnly||MATS[S.mat]?.comingSoon)?'This material requires technical review.':'')}return}cr.classList.remove('price-pending');setText('binfill',r.optimized?'Optimized \u00b7 FEM':INFILLS[S.infill].name);setText('bweightlbl',r.optimized?'Optimized estimated weight':'Estimated weight');setText('bweight',r.w.replace('.',',')+' g');setText('bsetup',r.optimized?'FEM optimization + PDF':'Included');setHTML('tamt',eu(order.total));const unitText=items.length>1?`Parts subtotal: ${order.subtotalText.replace('.',',')} \u20ac \u00b7 Active part: ${r.total.replace('.',',')} \u20ac`:(S.qty>1?`${r.pu.replace('.',',')} \u20ac\/unit \u00b7 volume discount applied`:(S.colorSpecific?`Specific color: +${r.colorFee.replace('.',',')} \u20ac`:''));setText('tunit',unitText)}\r\n    function buildMats(){const g=$('mgrid');g.innerHTML='';Object.entries(MATS).forEach(([k,m])=>{const b=document.createElement('button');b.type='button';b.className='mbtn'+(k===S.mat?' sel':'')+(m.comingSoon?' disabled':'');b.innerHTML=`<div class=\"mn\">${m.name}<\/div><div class=\"ms\">${m.sub}<\/div><div class=\"mp\">${m.tag}<\/div>`;b.onclick=()=>{if(m.comingSoon)return;S.mat=k;syncActive();syncControls();upd()};g.appendChild(b)})}\r\n    function buildQuals(){const r=$('qrow');r.innerHTML='';Object.entries(QUALS).forEach(([k,q])=>{const b=document.createElement('button');b.type='button';b.className='obtn'+(k===S.qual?' sel':'');b.innerHTML=`<div class=\"on\">${q.name}<\/div><div class=\"os\">${q.sub}<\/div>`;b.onclick=()=>{S.qual=k;syncActive();syncControls();upd()};r.appendChild(b)})}\r\n    function buildInfills(){const r=$('irow');r.innerHTML='';Object.entries(INFILLS).forEach(([k,f])=>{const b=document.createElement('button');b.type='button';b.className='obtn'+(k===S.infill?' sel':'');b.innerHTML=`<div class=\"on\">${f.name}<\/div><div class=\"os\">${f.sub}<\/div>`;b.onclick=()=>{S.infill=k;syncActive();syncControls();upd()};r.appendChild(b)})}\r\n    function buildShipping(){const r=$('shiprowopts');if(!r)return;r.innerHTML='';Object.entries(SHIPPING).forEach(([k,s])=>{const b=document.createElement('button');b.type='button';b.className='obtn'+(k===S.shipping?' sel':'');b.innerHTML=`<div class=\"on\">${s.name}<\/div><div class=\"os\">${s.note}<\/div>`;b.onclick=()=>{S.shipping=k;syncActive();syncControls();upd()};r.appendChild(b)})}\r\n    function clearViewer(){if(V.animation)cancelAnimationFrame(V.animation);if(V.renderer){V.renderer.dispose();V.renderer.domElement.remove()}V={renderer:null,scene:null,camera:null,model:null,animation:null,rotX:.52,rotZ:.75,dist:250,drag:false,lastX:0,lastY:0};$('viewer')?.classList.remove('show');if($('vmsg')){$('vmsg').style.display='flex';$('vmsg').innerHTML='<div><strong>Model preview<\/strong>Upload an STL or OBJ file to interact with the part.<\/div>'}}\r\n    function showViewerMessage(title,text){clearViewer();$('viewer')?.classList.add('show');setText('vhint','Preview not available');if($('vmsg')){$('vmsg').style.display='flex';$('vmsg').innerHTML=`<div><strong>${title}<\/strong>${text}<\/div>`}}\r\n    function renderPreview(tri){const box=$('vbox'),viewer=$('viewer'),msg=$('vmsg');if(!box||!tri?.length)return;clearViewer();viewer.classList.add('show');if(msg)msg.style.display='none';setText('vhint','Drag to rotate \u00b7 scroll to zoom');const w=box.clientWidth||700,h=box.clientHeight||360,scene=new THREE.Scene();scene.background=new THREE.Color(0xf7f7f7);const camera=new THREE.PerspectiveCamera(45,w\/h,.1,100000),renderer=new THREE.WebGLRenderer({antialias:true});renderer.setPixelRatio(Math.min(window.devicePixelRatio||1,2));renderer.setSize(w,h);box.appendChild(renderer.domElement);const verts=[];for(const face of tri)for(const p of face)verts.push(p[0],p[1],p[2]);const geo=new THREE.BufferGeometry();geo.setAttribute('position',new THREE.Float32BufferAttribute(verts,3));geo.computeVertexNormals();geo.computeBoundingBox();const mat=new THREE.MeshPhysicalMaterial({color:0x18f07e,roughness:.34,metalness:.06,clearcoat:.30,clearcoatRoughness:.20,side:THREE.DoubleSide});const mesh=new THREE.Mesh(geo,mat),bb=geo.boundingBox,center=new THREE.Vector3();bb.getCenter(center);mesh.position.sub(center);scene.add(mesh);const size=new THREE.Vector3();bb.getSize(size);const maxDim=Math.max(size.x,size.y,size.z)||100;const grid=new THREE.GridHelper(Math.max(120,Math.ceil(maxDim*1.6\/10)*10),20,0xb8bdc2,0xd9dcdf);grid.rotation.x=Math.PI\/2;grid.position.z=-(size.z\/2);scene.add(grid);scene.add(new THREE.AmbientLight(0xffffff,.78));const d1=new THREE.DirectionalLight(0xffffff,1);d1.position.set(maxDim,maxDim,maxDim*1.6);scene.add(d1);const d2=new THREE.DirectionalLight(0xffffff,.38);d2.position.set(-maxDim,-maxDim,maxDim);scene.add(d2);const d3=new THREE.DirectionalLight(0xffffff,.22);d3.position.set(0,maxDim*1.5,maxDim*.6);scene.add(d3);V={renderer,scene,camera,model:mesh,animation:null,rotX:.52,rotZ:.78,dist:maxDim*2.35,drag:false,lastX:0,lastY:0};function placeCamera(){const x=V.dist*Math.cos(V.rotX)*Math.cos(V.rotZ),y=V.dist*Math.cos(V.rotX)*Math.sin(V.rotZ),z=V.dist*Math.sin(V.rotX);camera.position.set(x,y,z);camera.up.set(0,0,1);camera.lookAt(0,0,size.z*.03)}placeCamera();renderer.domElement.onpointerdown=e=>{V.drag=true;V.lastX=e.clientX;V.lastY=e.clientY;renderer.domElement.setPointerCapture(e.pointerId)};renderer.domElement.onpointermove=e=>{if(!V.drag)return;const dx=e.clientX-V.lastX,dy=e.clientY-V.lastY;V.lastX=e.clientX;V.lastY=e.clientY;V.rotZ-=dx*.008;V.rotX=Math.max(-1.45,Math.min(1.45,V.rotX+dy*.008));placeCamera()};renderer.domElement.onpointerup=()=>{V.drag=false};renderer.domElement.onwheel=e=>{e.preventDefault();V.dist=Math.max(maxDim*.6,Math.min(maxDim*8,V.dist*(1+e.deltaY*.001)));placeCamera()};function resize(){const nw=box.clientWidth||700,nh=box.clientHeight||360;camera.aspect=nw\/nh;camera.updateProjectionMatrix();renderer.setSize(nw,nh)}window.addEventListener('resize',resize,{passive:true});function animate(){V.animation=requestAnimationFrame(animate);renderer.render(scene,camera)}animate()}\r\n    function makeItem(file,ext){return{...defaultItem(),mat:S.mat||'pla',qual:S.qual||'std',infill:S.infill||'i30',file,fileExt:ext,fileKey:getFileKey(file)}}\r\n    function getFileKey(file){return`${file.name}|${file.size}|${file.lastModified||0}`}\r\n    function selectItem(idx){if(idx<0||idx>=items.length)return;syncActive();activeIndex=idx;S=items[idx];setText('fcname',S.file.name);setText('ssz',formatSize(S.file.size));setText('fstatus',S.reviewOnly?'File for review':'File loaded');if(S.reviewOnly){setText('svol','Review');setText('sdim','Manual');setText('stri','\u2014');showViewerMessage('Preview not available for this format.','STEP and 3MF files are accepted for manual technical review. The file will be considered when confirming the final quotation.')}else{setText('svol',S.vol.toFixed(2).replace('.',',')+' cm\u00b3');setText('sdim',S.dimText||'\u2014');setText('stri',S.triCount?S.triCount.toLocaleString('en-US'):'\u2014');if(S.tri)renderPreview(S.tri)}syncControls();upd()}\r\n    async function processFile(file){const ext=file.name.split('.').pop().toLowerCase(),item=makeItem(file,ext);if(['step','stp','3mf'].includes(ext)){item.reviewOnly=true;return item}let tri=null;if(ext==='stl'){const buf=await file.arrayBuffer();tri=parseBin(buf);if(!tri)tri=parseAscii(new TextDecoder().decode(buf))}else if(ext==='obj'){tri=parseOBJ(await file.text())}else throw new Error('Please upload an STL, OBJ, STEP or 3MF file.');if(!tri?.length)throw new Error('The file triangles could not be read.');item.tri=tri;item.vol=vol(tri)\/1000;const sz=bnds(tri);item.dimText=`${sz[0].toFixed(0)}\u00d7${sz[1].toFixed(0)}\u00d7${sz[2].toFixed(0)}`;item.triCount=tri.length;return item}\r\n    async function handleFiles(fileList,{replace=false}={}){const incoming=Array.from(fileList||[]);if(!incoming.length)return;const incomingTotal=incoming.reduce((sum,file)=>sum+file.size,0);const currentTotal=replace?0:items.reduce((sum,it)=>sum+(it.file?.size||0),0);if(currentTotal+incomingTotal>MAX_TOTAL_UPLOAD_BYTES){alert(LARGE_FILE_MESSAGE);return;}const existingKeys=replace?new Set():new Set(items.map(it=>it.fileKey||getFileKey(it.file)));const seenInThisBatch=new Set();const files=incoming.filter(file=>{const key=getFileKey(file);if(existingKeys.has(key)||seenInThisBatch.has(key))return false;seenInThisBatch.add(key);return true});if(!files.length){alert('This file is already loaded. If you need more units, increase the quantity of that part.');return}const dz=$('dz');dz.classList.add('loading');setText('dzstatus',files.length>1?'Processing files\u2026':'Processing file\u2026');try{if(replace){items=[];activeIndex=-1;S=defaultItem()}else syncActive();const firstNewIndex=items.length,newItems=[];for(const file of files)newItems.push(await processFile(file));items=items.concat(newItems);activeIndex=firstNewIndex;S=items[activeIndex];$('dz').style.display='none';$('fcard').classList.add('show');$('cpanel').classList.add('show');$('qfsec').classList.add('show');dz.classList.remove('loading');selectItem(activeIndex);renderFilesList();upd()}catch(e){dz.classList.remove('loading');alert('Error: '+e.message)}}\r\n    function formatSize(s){return s<1048576?(s\/1024).toFixed(0)+' KB':(s\/1048576).toFixed(2).replace('.',',')+' MB'}\r\n    function resetFile(){items=[];activeIndex=-1;S=defaultItem();$('fi').value='';$('dz').style.display='';$('dz').classList.remove('loading');$('fcard').classList.remove('show');$('fileslist').innerHTML='';clearViewer();$('cpanel').classList.remove('show');$('qfsec').classList.remove('show');['bmat','bqual','binfill','bweight','bsetup'].forEach(id=>setText(id,'\u2014'));setText('bweightlbl','Estimated weight');setText('bqty','1 unit');setText('tamt','\u2014 \u20ac');setText('tunit','');$('bcolorrow').style.display='none';const promo=$('shipPromo');if(promo){promo.className='shipPromo';promo.innerHTML=''}syncControls();upd()}\r\n    function deleteActive(){if(activeIndex<0)return;items.splice(activeIndex,1);if(!items.length){resetFile();return}activeIndex=Math.min(activeIndex,items.length-1);S=items[activeIndex];selectItem(activeIndex)}\r\n    function openFilePicker(mode){const input=document.createElement('input');input.type='file';input.accept='.stl,.obj,.step,.stp,.3mf';input.multiple=true;input.style.display='none';CE_ROOT.appendChild(input);input.addEventListener('change',()=>{const selected=input.files;if(selected&&selected[0])handleFiles(selected,{replace:mode==='replace'});input.remove()},{once:true});input.click()}\r\n    function bindEvents(){const dz=$('dz'),fi=$('fi');$('brbtn').onclick=e=>{e.preventDefault();e.stopPropagation();openFilePicker('replace')};dz.onclick=e=>{if(e.target.closest('button'))return;openFilePicker('replace')};fi.onchange=e=>{if(e.target.files[0])handleFiles(e.target.files,{replace:true});fi.value=''};dz.addEventListener('dragover',e=>{e.preventDefault();dz.classList.add('over')});dz.addEventListener('dragleave',()=>dz.classList.remove('over'));dz.addEventListener('drop',e=>{e.preventDefault();dz.classList.remove('over');if(e.dataTransfer.files[0])handleFiles(e.dataTransfer.files,{replace:!items.length})});$('fadd').onclick=e=>{e.preventDefault();e.stopPropagation();openFilePicker('add')};$('fdel').onclick=deleteActive;$('qm').onclick=()=>{S.qty=Math.max(1,S.qty-1);$('qtyInput').value=S.qty;syncActive();upd()};$('qp').onclick=()=>{S.qty=Math.min(10000,S.qty+1);$('qtyInput').value=S.qty;syncActive();upd()};$('qtyInput').oninput=e=>{S.qty=Math.max(1,Math.min(10000,+e.target.value||1));e.target.value=S.qty;syncActive();upd()};$('specificColor').onchange=e=>{S.colorSpecific=e.target.checked;$('colorField').classList.toggle('show',S.colorSpecific);syncActive();upd()};$('isCompany').onchange=e=>{const checked=e.target.checked;$('companyFields').classList.toggle('show',checked);$('companyName').required=checked;$('billingCountry').required=checked;if(!checked){$('companyName').value='';$('billingCountry').value=''}};$('colorText').oninput=()=>{S.colorText=$('colorText').value;syncActive();upd()};$('qfpdf').onchange=e=>{const f=e.target.files[0],st=$('pdfStatus');if(f){st.textContent='Document attached: '+f.name;st.classList.add('show')}else st.classList.remove('show')};$('sndbtn').onclick=()=>{syncActive();if(!items.length)return;$('qfsec').classList.add('show');const form=$('qfform');if(!$('qfe').value||!$('qfp').value||!$('qfd').value){$('qfd').focus({preventScroll:false});form.reportValidity();return}form.requestSubmit()};$('qfform').onsubmit=submitQuoteRequest;$('nfform').onsubmit=submitNoFileConsultation}\r\n    function buildSubmissionSummary(){const order=calcOrder();const lines=[];lines.push('CALCULATOR SUMMARY');lines.push('Estimated total: '+order.total.replace('.',',')+' \u20ac excl. VAT');lines.push('Parts subtotal: '+order.subtotalText.replace('.',',')+' \u20ac');lines.push('Shipping: '+order.shipping.label);lines.push('Shipping destination: '+(SHIPPING[S.shipping||'de']?.name||'\u2014'));lines.push('');items.forEach((it,idx)=>{const r=calcItem(it);lines.push('File '+(idx+1)+': '+it.file.name);lines.push('- Format: '+(it.fileExt||'\u2014').toUpperCase());lines.push('- Material: '+MATS[it.mat].name);lines.push('- Quality: '+QUALS[it.qual].name+' \u00b7 '+QUALS[it.qual].sub);lines.push('- Infill: '+(it.infill==='opt'?'Optimized \u00b7 FEM':INFILLS[it.infill].name));lines.push('- Quantity: '+it.qty);lines.push('- Specific color: '+(it.colorSpecific?(it.colorText||'Yes, pending specification'):'No'));lines.push('- Volume: '+((it.reviewOnly||MATS[it.mat]?.reviewOnly||MATS[it.mat]?.comingSoon)?'Technical review':it.vol.toFixed(2).replace('.',',')+' cm\u00b3'));lines.push('- Dimensions: '+(it.dimText||'\u2014'));lines.push('- Estimated weight: '+(r?r.w.replace('.',',')+' g':'Technical review'));lines.push('- Indicative part price: '+(r?r.total.replace('.',',')+' \u20ac':'Technical review'));lines.push('')});if($('isCompany').checked){lines.push('COMPANY DATA');lines.push('Company name: '+$('companyName').value);lines.push('Billing country: '+$('billingCountry').value);lines.push('')}return lines.join('\\n')}\r\n    async function submitQuoteRequest(e){e.preventDefault();syncActive();const form=$('qfform');if(!form.reportValidity())return;if(!items.length){alert('Please upload at least one 3D file first.');return}const uploadTotal=items.reduce((sum,it)=>sum+(it.file?.size||0),0)+(($('qfpdf').files[0]?.size)||0);if(uploadTotal>MAX_TOTAL_UPLOAD_BYTES){alert(LARGE_FILE_MESSAGE);return}const btn=$('sndbtn'),oldText=btn.textContent,progress=$('uploadProgress'),bar=$('uploadBarFill'),pct=$('uploadPercent'),status=$('uploadStatusText');btn.disabled=true;btn.textContent='Uploading files\u2026';if(progress)progress.classList.add('show');if(bar)bar.style.width='0%';if(pct)pct.textContent='0%';if(status)status.textContent='Preparing request\u2026';try{const fd=new FormData();fd.append('lang',CE_LANG);fd.append('email',$('qfe').value.trim());fd.append('phone',$('qfp').value.trim());fd.append('details',$('qfd').value.trim());fd.append('is_company',$('isCompany').checked?'yes':'no');fd.append('company_name',$('companyName').value.trim());fd.append('billing_country',$('billingCountry').value.trim());fd.append('summary',buildSubmissionSummary());fd.append('website',$('ceWebsite') ? $('ceWebsite').value : '');items.forEach(it=>fd.append('files[]',it.file,it.file.name));const pdf=$('qfpdf').files[0];if(pdf)fd.append('attachment',pdf,pdf.name);const data=await sendQuoteWithProgress(fd,(percent)=>{if(bar)bar.style.width=percent+'%';if(pct)pct.textContent=percent+'%';if(status)status.textContent=percent<100?'Uploading files\u2026':'Processing request\u2026'});if(!data?.success)throw new Error(data?.message||'The request could not be sent.');if(bar)bar.style.width='100%';if(pct)pct.textContent='100%';if(status)status.textContent='Request sent successfully';alert('Request sent successfully. We will get back to you as soon as possible.');btn.textContent='Request sent \u2713'}catch(err){alert(err.message||'The request could not be sent. Please try again or contact us by email.');btn.disabled=false;btn.textContent=oldText;if(status)status.textContent='The request could not be sent'}}\r\n    function sendQuoteWithProgress(formData,onProgress){return new Promise((resolve,reject)=>{const xhr=new XMLHttpRequest();xhr.open('POST',CE_QUOTE_ENDPOINT,true);xhr.upload.onprogress=(event)=>{if(event.lengthComputable){const percent=Math.max(1,Math.min(99,Math.round((event.loaded\/event.total)*100)));onProgress(percent)}};xhr.onload=()=>{let data=null;try{data=JSON.parse(xhr.responseText)}catch(_e){}if(xhr.status>=200&&xhr.status<300){onProgress(100);resolve(data)}else{reject(new Error(data?.message||'The request could not be sent.'))}};xhr.onerror=()=>reject(new Error('Connection error while sending the request.'));xhr.send(formData)})}\r\n    async function submitNoFileConsultation(e){e.preventDefault();const form=$('nfform');if(!form.reportValidity())return;const btn=form.querySelector('.nfsub'),oldText=btn.textContent;btn.disabled=true;btn.textContent='Sending request\u2026';try{const fd=new FormData();fd.append('lang',CE_LANG);fd.append('email',$('nfe').value.trim());fd.append('phone',$('nfp').value.trim());fd.append('details',$('nfd').value.trim());fd.append('website',$('ceNoFileWebsite') ? $('ceNoFileWebsite').value : '');const res=await fetch(CE_CONSULT_ENDPOINT,{method:'POST',body:fd});let data=null;try{data=await res.json()}catch(_e){}if(!res.ok||!data?.success)throw new Error(data?.message||'The request could not be sent.');alert('Request sent successfully. We will get back to you as soon as possible.');btn.textContent='Request sent \u2713';form.reset()}catch(err){alert(err.message||'The request could not be sent. Please try again or contact us by email.');btn.disabled=false;btn.textContent=oldText}}\r\n    function prepareElementorSticky(){let el=CE_ROOT.parentElement,steps=0;while(el&&steps<8){const tag=(el.tagName||'').toLowerCase();if(tag==='body'||tag==='html')break;el.style.overflow='visible';el.style.overflowX='visible';el.style.overflowY='visible';steps++;el=el.parentElement}}\r\n    function runTests(){console.assert($('fadd'),'TEST: add file button exists');console.assert($('fileslist'),'TEST: multi-file list exists');console.assert($('borderrow'),'TEST: order subtotal row exists');console.assert($('shiprow'),'TEST: shipping row exists');console.assert($('shiprowopts'),'TEST: shipping selector exists');console.assert($('shipPromo'),'TEST: shipping promo exists');console.assert(SHIPPING.de.freeFrom===75,'TEST: free shipping Germany from 75 \u20ac');console.assert(SHIPPING.eu.freeFrom===150,'TEST: free shipping EU from 150 \u20ac');console.assert(OPTIMIZED_ENGINEERING_FEE===480,'TEST: optimized base price = 8h x 60\u20ac');console.assert($('bmat'),'TEST: bmat exists');console.assert($('isCompany'),'TEST: company checkbox exists');console.assert($('companyFields'),'TEST: company fields exist');console.assert($('viewer'),'TEST: 3D viewer exists');console.assert(typeof THREE.Scene==='function','TEST: THREE loaded from absolute URL');console.assert(buildSubmissionSummary().includes('CALCULATOR SUMMARY'),'TEST: submission summary generated');console.assert($('ceWebsite'),'TEST: anti-bot honeypot exists');console.assert($('ceNoFileWebsite'),'TEST: no-file anti-bot honeypot exists');console.assert(typeof submitNoFileConsultation==='function','TEST: no-file form connected');console.assert(MATS.multi.reviewOnly===true,'TEST: multi-material requires technical review');console.assert(MATS.continuousCarbon.comingSoon===true,'TEST: continuous carbon fiber is coming soon');console.assert(MATS.metal.comingSoon===true,'TEST: metal is coming soon')}\r\n    prepareElementorSticky();buildMats();buildQuals();buildInfills();buildShipping();showOptBox();bindEvents();upd();runTests();\r\n  <\/script>\r\n<\/div>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>3D PrintingPrice Calculator Upload your file and get an instant indicative price estimate. If the estimate fits your needs, you can send us the data for technical review and final quotation. Drag your 3D files here or click to browse your&#8230;<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"class_list":["post-24411","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cortez-engineering.com\/en\/wp-json\/wp\/v2\/pages\/24411","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cortez-engineering.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cortez-engineering.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cortez-engineering.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cortez-engineering.com\/en\/wp-json\/wp\/v2\/comments?post=24411"}],"version-history":[{"count":8,"href":"https:\/\/cortez-engineering.com\/en\/wp-json\/wp\/v2\/pages\/24411\/revisions"}],"predecessor-version":[{"id":24430,"href":"https:\/\/cortez-engineering.com\/en\/wp-json\/wp\/v2\/pages\/24411\/revisions\/24430"}],"wp:attachment":[{"href":"https:\/\/cortez-engineering.com\/en\/wp-json\/wp\/v2\/media?parent=24411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}