46 lines
3.3 KiB
TypeScript
46 lines
3.3 KiB
TypeScript
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.');
|
|
}
|