import { dimensionGraphics } from './dimension-graphics'; import { breakSymbols, shortenEntity, shortenedBounds, shortenedY } from './breaks'; import type { DrawingView, Entity, Point } from './types'; export function presentationEntities(view:DrawingView):{entity:Entity;index:number}[] { const cuts=view.breaks??[]; const out=view.entities.flatMap((entity,index)=>{ if(entity.kind==='dimension'){ const p=(p:Point):Point=>[p[0],shortenedY(p[1],cuts)]; // Centre the label on the displayed dimension, retaining its original measured value. const displayed={...entity,a:p(entity.a),b:p(entity.b),position:entity.axis==='x'?shortenedY(entity.position,cuts):entity.position}; return dimensionGraphics(displayed).map(entity=>({entity,index})); } return shortenEntity(entity,cuts,entity.source.member!=='annotation').map(entity=>({entity,index})); }); for(const entity of breakSymbols(view.entities,cuts,view.scale))out.push({entity,index:view.entities.findIndex(e=>e.source===entity.source)}); const cut=cuts.find(c=>c.member==='column'),column=view.entities.find(e=>e.kind==='polyline'&&e.source.member==='column'); if(view.id==='front'&&cut&&column?.kind==='polyline'){ const xs=column.points.map(p=>p[0]),x=(Math.min(...xs)+Math.max(...xs))/2,r=(Math.max(...xs)-Math.min(...xs))/2; const y=(shortenedBounds({minX:0,maxX:0,minY:cut.from,maxY:cut.to},cuts).minY+shortenedBounds({minX:0,maxX:0,minY:cut.from,maxY:cut.to},cuts).maxY)/2; const source={...column.source,member:'column-section-inline'},base={source,layer:'SECTION' as const},index=view.entities.indexOf(column); out.push({index,entity:{...base,kind:'circle',center:[x,y],radius:r}}, {index,entity:{...base,kind:'text',point:[x+r+2*view.scale,y],text:'A-A',height:2.5*view.scale}}); if(view.entities.some(e=>e.layer==='CENTER'))out.push( {index,entity:{...base,layer:'CENTER',kind:'line',a:[x-r-view.scale,y],b:[x+r+view.scale,y]}}, {index,entity:{...base,layer:'CENTER',kind:'line',a:[x,y-r-view.scale],b:[x,y+r+view.scale]}}); if(view.entities.some(e=>e.kind==='dimension'))out.push(...dimensionGraphics({kind:'dimension',a:[x-r,y],b:[x+r,y],axis:'x',position:y+r+1.5*view.scale,height:2.8*view.scale,value:2*r,source,layer:'DIMENSION'}).map(entity=>({entity,index}))); } return out; } export function paperPoint(view:DrawingView,p:Point):Point { if(view.paperOrigin)return[view.paperOrigin[0]+p[0]/view.scale,view.paperOrigin[1]-p[1]/view.scale]; const b=shortenedBounds(view.bounds,view.breaks),s=view.slot; return[s.x+(s.width-(b.maxX-b.minX)/view.scale)/2+(p[0]-b.minX)/view.scale, s.y+(s.height-(b.maxY-b.minY)/view.scale)/2+(b.maxY-p[1])/view.scale]; } export function paperEntity(view:DrawingView,e:Entity):Entity { const point=(p:Point):Point=>{const q=paperPoint(view,p);return[q[0],-q[1]];}; if(e.kind==='line')return{...e,a:point(e.a),b:point(e.b)}; if(e.kind==='polyline')return{...e,points:e.points.map(point)}; if(e.kind==='hatch')return{...e,points:e.points.map(point),holes:e.holes?.map(loop=>loop.map(point)),spacing:e.spacing/view.scale}; if(e.kind==='circle')return{...e,center:point(e.center),radius:e.radius/view.scale}; if(e.kind==='text')return{...e,point:point(e.point),height:e.height/view.scale}; throw new Error('Paper entities require expanded dimension graphics.'); }