Initial commit

This commit is contained in:
Robert Nasarek 2026-06-25 09:11:23 +02:00
commit 05c65aad4d
155 changed files with 93617 additions and 0 deletions

View file

@ -0,0 +1,90 @@
import { core } from "../core.js";
import { distanceBetweenPointsVector, vectorBetweenPoints, halfwayBetweenPoints, interpolateDistanceBetweenPoints } from "../utils.js";
import THREE from "../init.js";
export function attachMeasurement(Viewer) {
Object.assign(Viewer, {
buildRuler(_id) {
Viewer.rulerObject = new THREE.Object3D();
const gridSize = Viewer.gridSize || core.gridSize || 1;
const sphereRadius = Math.max(gridSize / 150, 0.001);
const textScale = Math.max(gridSize / 100, 0.01);
const measureSize = Math.max(gridSize / 200, 0.01);
var sphere = new THREE.Mesh(
new THREE.SphereGeometry(sphereRadius, 7, 7),
new THREE.MeshStandardMaterial({
color: 0xff0000,
transparent: true,
opacity: 0.85,
side: THREE.DoubleSide,
depthTest: false,
depthWrite: false,
})
);
var newPoint = new THREE.Vector3(_id.point.x, _id.point.y, _id.point.z);
sphere.position.set(newPoint.x, newPoint.y, newPoint.z);
Viewer.rulerObject.add(sphere);
Viewer.linePoints.push(newPoint);
const lineGeometry = new THREE.BufferGeometry().setFromPoints(Viewer.linePoints);
const lineMaterial = new THREE.LineBasicMaterial({ color: 0x0000ff });
const line = new THREE.Line(lineGeometry, lineMaterial);
Viewer.rulerObject.add(line);
var lineMtr = new THREE.LineBasicMaterial({
color: 0x0000ff,
linewidth: 1,
opacity: 1,
side: THREE.DoubleSide,
depthTest: false,
depthWrite: false,
});
if (Viewer.linePoints.length > 1) {
var vectorPoints = vectorBetweenPoints(
Viewer.linePoints[Viewer.linePoints.length - 2],
newPoint
);
var distancePoints = distanceBetweenPointsVector(vectorPoints);
const measuredDistance = Viewer.formatMeasuredDistance(distancePoints);
//var distancePoints = distanceBetweenPoints(Viewer.linePoints[Viewer.linePoints.length-2], newPoint);
var halfwayPoints = halfwayBetweenPoints(
Viewer.linePoints[Viewer.linePoints.length - 2],
newPoint
);
Viewer.addTextPoint(measuredDistance.text, textScale, halfwayPoints);
var rulerI = 0;
// `measureSize` was already precomputed outside, keep same scale
while (rulerI <= distancePoints * 100) {
const geoSegm = [];
var interpolatePoints = interpolateDistanceBetweenPoints(
Viewer.linePoints[Viewer.linePoints.length - 2],
vectorPoints,
distancePoints,
rulerI / 100
);
geoSegm.push(
new THREE.Vector3(
interpolatePoints.x,
interpolatePoints.y,
interpolatePoints.z
)
);
geoSegm.push(
new THREE.Vector3(
interpolatePoints.x + measureSize,
interpolatePoints.y + measureSize,
interpolatePoints.z + measureSize
)
);
const geometryLine = new THREE.BufferGeometry().setFromPoints(geoSegm);
var lineSegm = new THREE.Line(geometryLine, lineMtr);
Viewer.rulerObject.add(lineSegm);
rulerI += 10;
}
}
Viewer.rulerObject.renderOrder = 10;
core.scene.add(Viewer.rulerObject);
Viewer.ruler.push(Viewer.rulerObject);
},
});
}