@twinfinity/product-geometry
v6.2.0-beta
Published
Model to geometry bridge
Readme
@twinfinity/product-geometry
High-level BIM section geometry computation. Takes 3D BIM products and a cutting plane, produces categorized 2D line geometry with hidden line removal, feature edges, stair arrows, snap target finding, and room labels.
Quick Start
import { SlabSection } from '@twinfinity/product-geometry';
const section = new SlabSection(scene, {
cutHeight: 1.5,
depth: { above: 2.0, below: 0.3 },
});
const geometry = await section.compute(products);
// geometry.cutLines — where walls are sliced (bold red in drawings)
// geometry.visibleLines — edges you can see from above
// geometry.hiddenLines — edges behind other geometry (dashed)
// geometry.silhouettes — outer boundary outlines
// geometry.featureEdges — sharp creases in geometry
// geometry.stairArrows — direction arrows for stairsAdvanced configuration
import { SlabSection } from '@twinfinity/product-geometry';
const section = new SlabSection(api.viewer.scene, {
cutHeight: 1.5,
depth: { above: 2.0, below: 0.3 },
lines: {
cut: true, visible: true, hidden: true,
silhouettes: true, featureEdges: true, stairArrows: true,
outlineVisible: true, outlineHidden: true,
},
featureAngle: 30,
classRules: [
{ match: 'ifcstair', featureAngle: 15 },
{ match: 'ifcramp', skipCutLines: true },
{ match: ['ifcrailing', 'ifccurtainwall'], renderMode: 'silhouette-only' },
],
complexityDetection: {
enabled: true,
faceDensityThreshold: 5000,
complexMeshMode: 'silhouette-with-features',
structuralClasses: ['walls', 'slab', 'beam', 'columns', 'roof'],
},
trackProducts: true,
onProgress: (percent, phase) => {
updateProgressBar(percent * 100, phase);
},
});
const geometry = await section.compute(products);
if (geometry.perProduct) {
for (const entry of geometry.perProduct) {
console.log(entry.product.name, 'cut:', entry.cutLines.length);
}
}Elevation / facade views
import { SlabSection } from '@twinfinity/product-geometry';
const elevationSection = new SlabSection(api.viewer.scene, {
cutHeight: 0,
viewDir: [-1, 0, 0], // East facade
cutOrigin: [15, 0, 0],
depth: { above: 12.0, below: 0.5 },
lines: {
cut: true, visible: true, hidden: true, featureEdges: true,
stairArrows: false, silhouettes: false,
outlineVisible: false, outlineHidden: false,
},
});
const facade = await elevationSection.compute(products);Snap target finding
import { findSnapTarget, findEdgesForProduct } from '@twinfinity/product-geometry';
const edges = findEdgesForProduct(product);
const snap = findSnapTarget(edges, cursorWorldPos, 0.5);
if (snap.closest) {
console.log('Snap type:', snap.type); // 'vertex', 'edgeMidpoint', etc.
console.log('Snap point:', snap.closest);
}