mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-08 01:13:27 +01:00
158 lines
4.4 KiB
JavaScript
158 lines
4.4 KiB
JavaScript
import * as test from '../../test'
|
|
import {deepMerge} from '../coreTests/utils/deep-merge'
|
|
import {Matrix3x4} from "math/matrix";
|
|
|
|
const OPERANDS_MODE = false;
|
|
|
|
const CASE = {
|
|
|
|
testSmokedSalmon: function (env) {
|
|
test.modeller(env.test((win, app) => {
|
|
const box1 = app.TPI.brep.primitives.box(500, 500, 500);
|
|
const box2 = app.TPI.brep.primitives.box(250, 250, 750, new Matrix3x4().translate(25, 25, 0));
|
|
const box3 = app.TPI.brep.primitives.box(150, 600, 350, new Matrix3x4().translate(25, 25, -250));
|
|
let result = app.TPI.brep.bool.subtract(box1, box2);
|
|
result = app.TPI.brep.bool.subtract(result, box3);
|
|
app.TPI.addShellOnScene(result);
|
|
env.done();
|
|
}));
|
|
},
|
|
|
|
/**
|
|
* https://github.com/xibyte/jsketcher/issues/47
|
|
*/
|
|
testFacesAreInSamePlane_BUG_47: function(env) {
|
|
test.modeller(env.test((win, app) => {
|
|
|
|
const mat = new Matrix3x4();
|
|
const m = mat.translate(0, 0, 10);
|
|
|
|
const box1 = app.TPI.brep.primitives.box(100, 100, 100, undefined);
|
|
const box2 = app.TPI.brep.primitives.box(100, 100, 100, mat);
|
|
const shell = app.TPI.brep.bool.union(box1, box2);
|
|
|
|
// app.exposure.addShellOnScene(box1);
|
|
// app.exposure.addShellOnScene(box2);
|
|
app.TPI.addShellOnScene(shell);
|
|
env.done();
|
|
}));
|
|
}
|
|
|
|
};
|
|
|
|
def('simple.union');
|
|
def('simple.intersect');
|
|
def('simple.subtract');
|
|
def('overlap.face.intersect');
|
|
def('overlap.face.subtract');
|
|
def('overlap.face.half.intersect');
|
|
def('overlap.face.half.subtract');
|
|
def('overlap.face.edge1.intersect');
|
|
def('overlap.face.edge1.subtract');
|
|
def('overlap.face.edge1.half.intersect');
|
|
def('overlap.face.edge1.half.subtract');
|
|
def('overlap.face.edge2.intersect');
|
|
def('overlap.face.edge2.subtract');
|
|
def('overlap.face.edge2.half.intersect');
|
|
def('overlap.face.edge2.half.subtract');
|
|
def('overlap.face.inside.intersect');
|
|
def('overlap.face.inside.subtract');
|
|
def('overlap.face.inside.half.intersect');
|
|
def('overlap.face.inside.half.subtract');
|
|
def('overlap.kiss.edge.intersect');
|
|
def('overlap.kiss.edge.subtract');
|
|
def('overlap.kiss.edge.half.intersect');
|
|
def('overlap.kiss.edge.half.subtract');
|
|
def('overlap.kiss.edge4.intersect');
|
|
def('overlap.kiss.edge4.subtract');
|
|
def('overlap.kiss.edge4.half.intersect');
|
|
def('overlap.kiss.edge4.half.subtract');
|
|
|
|
def('star.intersect');
|
|
def('star.subtract');
|
|
|
|
function def(name) {
|
|
const funcName = 'test' + name.split(/\./).map(part => part.charAt(0).toUpperCase() + part.slice(1)).join('');
|
|
CASE[funcName] = function (env) {
|
|
test.modeller(env.test((win, app) => {
|
|
ddt(env, app, name);
|
|
}));
|
|
};
|
|
}
|
|
|
|
|
|
function ddt(env, app, name) {
|
|
const input = getInput(name);
|
|
const result = performOperation(app, input);
|
|
app.TPI.addShellOnScene(result);
|
|
compare(env, app, name, result);
|
|
env.done();
|
|
}
|
|
|
|
function compare(env, app, name, result) {
|
|
const out = require('./data/brep/' + name + '/out.json');
|
|
const resultData = shellToData(app.TPI.brep.IO, out.format, result);
|
|
env.assertData(out, resultData);
|
|
}
|
|
|
|
function shellToData(io, format, shell) {
|
|
if (format == 'LOOPS') {
|
|
return io.toLoops(shell);
|
|
} else {
|
|
throw 'unsupported type: ' + format;
|
|
}
|
|
}
|
|
|
|
function getInput(name) {
|
|
const input = readInput(name);
|
|
if (input.overrides) {
|
|
const overrides = readInput(input.overrides);
|
|
return deepMerge({}, overrides, input);
|
|
}
|
|
return input;
|
|
}
|
|
|
|
function readInput(name) {
|
|
return require('./data/brep/' + name + '/in.json');
|
|
}
|
|
|
|
function materialize(tpi, def) {
|
|
if (def.type == 'EXTRUDE') {
|
|
return tpi.brep.createPrism(def.base.map(p => new tpi.brep.geom.Point().set3(p)), def.height);
|
|
} else {
|
|
throw 'unsupported type: ' + def.type;
|
|
}
|
|
}
|
|
|
|
function performOperation(app, input) {
|
|
const A = materialize(app.TPI, input.A);
|
|
const B = materialize(app.TPI, input.B);
|
|
|
|
if (OPERANDS_MODE) {
|
|
app.TPI.addShellOnScene(A, {
|
|
color: 0x800080,
|
|
transparent: true,
|
|
opacity: 0.5,
|
|
});
|
|
app.TPI.addShellOnScene(B, {
|
|
color: 0xfff44f,
|
|
transparent: true,
|
|
opacity: 0.5,
|
|
});
|
|
//throw '!operands mode. turn it off!'
|
|
}
|
|
|
|
const bool = app.TPI.brep.bool;
|
|
|
|
if (input.operation == 'UNION') {
|
|
return bool.union(A, B);
|
|
} else if (input.operation == 'INTERSECT') {
|
|
return bool.intersect(A, B);
|
|
} else if (input.operation == 'SUBTRACT') {
|
|
return bool.subtract(A, B);
|
|
} else {
|
|
throw 'unknown operation: ' + input.operation;
|
|
}
|
|
}
|
|
|
|
export default CASE;
|