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)}};