From 65a01a8889a543a2c583ffe4838e7c60a0e7e070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=91=EC=A1=B0?= Date: Wed, 28 Oct 2026 18:19:15 +0900 Subject: [PATCH] Add src/obj-export.js --- src/obj-export.js | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/obj-export.js diff --git a/src/obj-export.js b/src/obj-export.js new file mode 100644 index 0000000..7334a69 --- /dev/null +++ b/src/obj-export.js @@ -0,0 +1,3 @@ +// OBJ mesh serialization and browser download. +// Export each modeled component as a closed OBJ mesh. +window.CatchpitObjExporter={download(modelData,fileName){if(!modelData)return;const lines=['# Separate sump pit parts generated from DXF'];let next=1;for(const part of modelData.parts){const ring=part.footprint,n=ring.length,offset=next;lines.push(`o ${part.name.replace(/\s+/g,'_')}`);if(part.type==='wall'){const inner=part.innerFootprint,outerBottom=offset,outerTop=offset+n,innerBottom=offset+n*2,innerTop=offset+n*3;for(const p of ring)lines.push(`v ${p.x} ${p.y} ${part.z0}`);for(const p of ring)lines.push(`v ${p.x} ${p.y} ${part.z1}`);for(const p of inner)lines.push(`v ${p.x} ${p.y} ${part.z0}`);for(const p of inner)lines.push(`v ${p.x} ${p.y} ${part.z1}`);for(let i=0;ioffset+n+i).join(' '));lines.push('f '+Array.from({length:n},(_,i)=>offset+n-1-i).join(' '));next+=n*2}}const blob=new Blob([lines.join('\n')],{type:'text/plain'}),a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=fileName.replace(/\.dxf$/i,'')+'.obj';a.click();setTimeout(()=>URL.revokeObjectURL(a.href),1000)}};