brepjs 8.8.2 → 8.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/2d/curves.d.ts.map +1 -1
- package/dist/2d/lib/Curve2D.d.ts.map +1 -1
- package/dist/2d/lib/approximations.d.ts.map +1 -1
- package/dist/2d/lib/makeCurves.d.ts.map +1 -1
- package/dist/2d/lib/ocWrapper.d.ts.map +1 -1
- package/dist/2d.cjs +2 -2
- package/dist/2d.js +3 -3
- package/dist/Blueprint-C4Rx89oe.js +1440 -0
- package/dist/Blueprint-D1Dik12C.cjs +1439 -0
- package/dist/{boolean2D-q5FOdOQW.cjs → boolean2D-BZnkU_aH.cjs} +215 -130
- package/dist/{boolean2D-Dgnuy63w.js → boolean2D-D4j89vF_.js} +215 -130
- package/dist/{booleanFns-CFit7JYt.cjs → booleanFns-Cf_0aWNe.cjs} +214 -133
- package/dist/{booleanFns--Orezl-b.js → booleanFns-D6SeHoCv.js} +214 -133
- package/dist/brepjs.cjs +478 -314
- package/dist/brepjs.js +574 -410
- package/dist/core/disposal.d.ts +44 -3
- package/dist/core/disposal.d.ts.map +1 -1
- package/dist/core/errors.d.ts +2 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/geometryHelpers.d.ts.map +1 -1
- package/dist/core/kernelCall.d.ts +20 -0
- package/dist/core/kernelCall.d.ts.map +1 -1
- package/dist/core/memory.d.ts +1 -1
- package/dist/core/memory.d.ts.map +1 -1
- package/dist/core.cjs +7 -4
- package/dist/core.d.ts +1 -1
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +14 -11
- package/dist/{cornerFinder-KNTFoGrm.js → cornerFinder-CypY3T_w.js} +1 -1
- package/dist/{cornerFinder-v4un1Fr9.cjs → cornerFinder-DbRL42YI.cjs} +1 -1
- package/dist/{curveFns-6ovDM_sR.cjs → curveFns-KDpL9iyo.cjs} +139 -38
- package/dist/curveFns-VDZEhY97.js +281 -0
- package/dist/{drawFns-WgXeXHH1.cjs → drawFns-B52K-9DJ.cjs} +184 -104
- package/dist/{drawFns-XwroLxdb.js → drawFns-CVPwl2No.js} +184 -104
- package/dist/{errors-NNmTtM5u.cjs → errors-BYb4tL5h.cjs} +3 -0
- package/dist/{errors-DJ92ermb.js → errors-CHfaHQSt.js} +3 -0
- package/dist/faceFns-B8xnZw-f.cjs +358 -0
- package/dist/faceFns-DG4bu-QB.js +359 -0
- package/dist/{helpers-CRfqaW0Y.cjs → helpers-Cfibxk7U.cjs} +15 -12
- package/dist/{helpers-CtBCzEqs.js → helpers-zsENdJlc.js} +15 -12
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/io/importFns.d.ts.map +1 -1
- package/dist/io.cjs +133 -65
- package/dist/io.js +133 -65
- package/dist/kernel/booleanOps.d.ts.map +1 -1
- package/dist/loft-Bhnw5Rfr.cjs +530 -0
- package/dist/loft-fSnlFn-j.js +531 -0
- package/dist/measurement-C4Ofuy_y.cjs +200 -0
- package/dist/measurement-DzRb6oYN.js +201 -0
- package/dist/measurement.cjs +1 -1
- package/dist/measurement.js +1 -1
- package/dist/{meshFns-CPNNlpbw.cjs → meshFns-C-6Cq3V-.cjs} +3 -3
- package/dist/{meshFns-DAmWVyEp.js → meshFns-Cw3IFJjg.js} +3 -3
- package/dist/{occtBoundary-Cqfsau2c.cjs → occtBoundary-CN_uQJtA.cjs} +4 -3
- package/dist/{occtBoundary-DvBywHyU.js → occtBoundary-Ct0tN8cs.js} +4 -3
- package/dist/operations/exporterFns.d.ts.map +1 -1
- package/dist/operations/exporterUtils.d.ts +3 -3
- package/dist/operations/exporterUtils.d.ts.map +1 -1
- package/dist/operations/exporters.d.ts.map +1 -1
- package/dist/operations/extrude.d.ts.map +1 -1
- package/dist/operations/extrudeFns.d.ts.map +1 -1
- package/dist/operations/loft.d.ts.map +1 -1
- package/dist/operations/multiSweepFns.d.ts.map +1 -1
- package/dist/{operations-BQ25CPI8.cjs → operations-DvwWDqIp.cjs} +263 -168
- package/dist/{operations-vN0tcoaU.js → operations-PYuj8GLd.js} +263 -168
- package/dist/operations.cjs +2 -2
- package/dist/operations.js +2 -2
- package/dist/query/shapeDistanceFilter.d.ts.map +1 -1
- package/dist/query.cjs +67 -15
- package/dist/query.js +68 -16
- package/dist/result.cjs +1 -1
- package/dist/result.js +1 -1
- package/dist/{shapeFns-C785aeVn.cjs → shapeFns-ByLUl6KE.cjs} +63 -9
- package/dist/{shapeFns-ClpALED4.js → shapeFns-QL3zx6uW.js} +63 -9
- package/dist/{shapeTypes-DnwCo942.js → shapeTypes-D34s68Xi.js} +51 -20
- package/dist/{shapeTypes-CIijJxCz.cjs → shapeTypes-sXITvFkF.cjs} +33 -2
- package/dist/sketching/CompoundSketch.d.ts.map +1 -1
- package/dist/sketching/Sketch.d.ts.map +1 -1
- package/dist/sketching/Sketcher.d.ts.map +1 -1
- package/dist/sketching/Sketcher2d.d.ts.map +1 -1
- package/dist/sketching/cannedSketches.d.ts.map +1 -1
- package/dist/sketching/draw.d.ts.map +1 -1
- package/dist/sketching.cjs +2 -2
- package/dist/sketching.js +2 -2
- package/dist/surfaceBuilders-DYX6h68y.js +436 -0
- package/dist/surfaceBuilders-hupjYn0W.cjs +435 -0
- package/dist/topology/booleanFns.d.ts.map +1 -1
- package/dist/topology/compoundOpsFns.d.ts.map +1 -1
- package/dist/topology/curveBuilders.d.ts.map +1 -1
- package/dist/topology/shapeFns.d.ts.map +1 -1
- package/dist/topology/solidBuilders.d.ts.map +1 -1
- package/dist/topology/surfaceBuilders.d.ts.map +1 -1
- package/dist/{topology-zG8maSDK.cjs → topology-DWe9SYAy.cjs} +8 -8
- package/dist/{topology-CqyxpmEh.js → topology-psR8Hqiz.js} +8 -8
- package/dist/topology.cjs +6 -6
- package/dist/topology.js +6 -6
- package/dist/{vectors-CGLqemPY.cjs → vectors-9rrStq8t.cjs} +2 -2
- package/dist/{vectors-2lOjaa8N.js → vectors-Dp5Iu1KH.js} +2 -2
- package/dist/vectors.cjs +2 -2
- package/dist/vectors.js +2 -2
- package/package.json +4 -1
- package/dist/Blueprint-BmbNUnGI.cjs +0 -1185
- package/dist/Blueprint-C-JJkkwL.js +0 -1186
- package/dist/curveFns-BhQECv8e.js +0 -180
- package/dist/faceFns-3PDjBeW7.js +0 -272
- package/dist/faceFns-CxaLWOjc.cjs +0 -271
- package/dist/loft-CVb-IjEI.cjs +0 -372
- package/dist/loft-DMFjK6lk.js +0 -373
- package/dist/measurement-CecYIt3s.cjs +0 -134
- package/dist/measurement-DHDLAH7-.js +0 -135
- package/dist/surfaceBuilders-CC0ZQGix.cjs +0 -289
- package/dist/surfaceBuilders-CrJtFu2a.js +0 -290
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
3
|
+
var __typeError = (msg) => {
|
|
4
|
+
throw TypeError(msg);
|
|
5
|
+
};
|
|
6
|
+
var __using = (stack, value, async) => {
|
|
7
|
+
if (value != null) {
|
|
8
|
+
if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
|
|
9
|
+
var dispose, inner;
|
|
10
|
+
if (async) dispose = value[__knownSymbol("asyncDispose")];
|
|
11
|
+
if (dispose === void 0) {
|
|
12
|
+
dispose = value[__knownSymbol("dispose")];
|
|
13
|
+
if (async) inner = dispose;
|
|
14
|
+
}
|
|
15
|
+
if (typeof dispose !== "function") __typeError("Object not disposable");
|
|
16
|
+
if (inner) dispose = function() {
|
|
17
|
+
try {
|
|
18
|
+
inner.call(this);
|
|
19
|
+
} catch (e) {
|
|
20
|
+
return Promise.reject(e);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
stack.push([async, dispose, value]);
|
|
24
|
+
} else if (async) {
|
|
25
|
+
stack.push([async]);
|
|
26
|
+
}
|
|
27
|
+
return value;
|
|
28
|
+
};
|
|
29
|
+
var __callDispose = (stack, error, hasError) => {
|
|
30
|
+
var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
|
|
31
|
+
return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
|
|
32
|
+
};
|
|
33
|
+
var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
|
|
34
|
+
var next = (it) => {
|
|
35
|
+
while (it = stack.pop()) {
|
|
36
|
+
try {
|
|
37
|
+
var result = it[1] && it[1].call(it[2]);
|
|
38
|
+
if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
|
|
39
|
+
} catch (e) {
|
|
40
|
+
fail(e);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (hasError) throw error;
|
|
44
|
+
};
|
|
45
|
+
return next();
|
|
46
|
+
};
|
|
47
|
+
const occtBoundary = require("./occtBoundary-CN_uQJtA.cjs");
|
|
48
|
+
const vecOps = require("./vecOps-CjRL1jau.cjs");
|
|
49
|
+
const faceFns = require("./faceFns-B8xnZw-f.cjs");
|
|
50
|
+
const errors = require("./errors-BYb4tL5h.cjs");
|
|
51
|
+
const shapeTypes = require("./shapeTypes-sXITvFkF.cjs");
|
|
52
|
+
const surfaceBuilders = require("./surfaceBuilders-hupjYn0W.cjs");
|
|
53
|
+
function buildLawFromProfile(extrusionLength, { profile, endFactor = 1 }) {
|
|
54
|
+
var _stack = [];
|
|
55
|
+
try {
|
|
56
|
+
const oc = occtBoundary.getKernel().oc;
|
|
57
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
58
|
+
let law;
|
|
59
|
+
if (profile === "s-curve") {
|
|
60
|
+
law = scope.register(new oc.Law_S());
|
|
61
|
+
law.Set_1(0, 1, extrusionLength, endFactor);
|
|
62
|
+
} else if (profile === "linear") {
|
|
63
|
+
law = scope.register(new oc.Law_Linear());
|
|
64
|
+
law.Set(0, 1, extrusionLength, endFactor);
|
|
65
|
+
} else {
|
|
66
|
+
return errors.err(
|
|
67
|
+
errors.validationError("UNSUPPORTED_PROFILE", `Unsupported extrusion profile: ${String(profile)}`)
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
return errors.ok(law.Trim(0, extrusionLength, 1e-6));
|
|
71
|
+
} catch (_) {
|
|
72
|
+
var _error = _, _hasError = true;
|
|
73
|
+
} finally {
|
|
74
|
+
__callDispose(_stack, _error, _hasError);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function weldShapes(facesOrShells) {
|
|
78
|
+
const sewn = occtBoundary.getKernel().sew(facesOrShells.map((s) => s.wrapped));
|
|
79
|
+
return errors.unwrap(faceFns.cast(errors.unwrap(faceFns.downcast(sewn))));
|
|
80
|
+
}
|
|
81
|
+
function weldShellsAndFaces(facesOrShells, ignoreType = false) {
|
|
82
|
+
const shell = weldShapes(facesOrShells);
|
|
83
|
+
if (!ignoreType && !shapeTypes.isShell(shell))
|
|
84
|
+
return errors.err(errors.typeCastError("WELD_NOT_SHELL", "Could not make a shell from faces and shells"));
|
|
85
|
+
return errors.ok(shell);
|
|
86
|
+
}
|
|
87
|
+
function makeCylinder(radius, height, location = [0, 0, 0], direction = [0, 0, 1]) {
|
|
88
|
+
var _stack = [];
|
|
89
|
+
try {
|
|
90
|
+
const oc = occtBoundary.getKernel().oc;
|
|
91
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
92
|
+
const axis = scope.register(occtBoundary.makeOcAx2(location, direction));
|
|
93
|
+
const cylinder = scope.register(new oc.BRepPrimAPI_MakeCylinder_3(axis, radius, height));
|
|
94
|
+
return shapeTypes.createSolid(cylinder.Shape());
|
|
95
|
+
} catch (_) {
|
|
96
|
+
var _error = _, _hasError = true;
|
|
97
|
+
} finally {
|
|
98
|
+
__callDispose(_stack, _error, _hasError);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function makeSphere(radius) {
|
|
102
|
+
var _stack = [];
|
|
103
|
+
try {
|
|
104
|
+
const oc = occtBoundary.getKernel().oc;
|
|
105
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
106
|
+
const sphereMaker = scope.register(new oc.BRepPrimAPI_MakeSphere_1(radius));
|
|
107
|
+
return shapeTypes.createSolid(sphereMaker.Shape());
|
|
108
|
+
} catch (_) {
|
|
109
|
+
var _error = _, _hasError = true;
|
|
110
|
+
} finally {
|
|
111
|
+
__callDispose(_stack, _error, _hasError);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function makeCone(radius1, radius2, height, location = [0, 0, 0], direction = [0, 0, 1]) {
|
|
115
|
+
var _stack = [];
|
|
116
|
+
try {
|
|
117
|
+
const oc = occtBoundary.getKernel().oc;
|
|
118
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
119
|
+
const axis = scope.register(occtBoundary.makeOcAx2(location, direction));
|
|
120
|
+
const coneMaker = scope.register(new oc.BRepPrimAPI_MakeCone_3(axis, radius1, radius2, height));
|
|
121
|
+
return shapeTypes.createSolid(coneMaker.Shape());
|
|
122
|
+
} catch (_) {
|
|
123
|
+
var _error = _, _hasError = true;
|
|
124
|
+
} finally {
|
|
125
|
+
__callDispose(_stack, _error, _hasError);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function makeTorus(majorRadius, minorRadius, location = [0, 0, 0], direction = [0, 0, 1]) {
|
|
129
|
+
var _stack = [];
|
|
130
|
+
try {
|
|
131
|
+
const oc = occtBoundary.getKernel().oc;
|
|
132
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
133
|
+
const axis = scope.register(occtBoundary.makeOcAx2(location, direction));
|
|
134
|
+
const torusMaker = scope.register(new oc.BRepPrimAPI_MakeTorus_5(axis, majorRadius, minorRadius));
|
|
135
|
+
return shapeTypes.createSolid(torusMaker.Shape());
|
|
136
|
+
} catch (_) {
|
|
137
|
+
var _error = _, _hasError = true;
|
|
138
|
+
} finally {
|
|
139
|
+
__callDispose(_stack, _error, _hasError);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function makeEllipsoidTransform(x, y, z) {
|
|
143
|
+
var _stack = [];
|
|
144
|
+
try {
|
|
145
|
+
const oc = occtBoundary.getKernel().oc;
|
|
146
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
147
|
+
const xyRatio = Math.sqrt(x * y / z);
|
|
148
|
+
const xzRatio = x / xyRatio;
|
|
149
|
+
const yzRatio = y / xyRatio;
|
|
150
|
+
const ax1 = scope.register(occtBoundary.makeOcAx1([0, 0, 0], [0, 1, 0]));
|
|
151
|
+
const ax2 = scope.register(occtBoundary.makeOcAx1([0, 0, 0], [0, 0, 1]));
|
|
152
|
+
const ax3 = scope.register(occtBoundary.makeOcAx1([0, 0, 0], [1, 0, 0]));
|
|
153
|
+
const transform = new oc.gp_GTrsf_1();
|
|
154
|
+
transform.SetAffinity_1(ax1, xzRatio);
|
|
155
|
+
const xy = scope.register(new oc.gp_GTrsf_1());
|
|
156
|
+
xy.SetAffinity_1(ax2, xyRatio);
|
|
157
|
+
const yz = scope.register(new oc.gp_GTrsf_1());
|
|
158
|
+
yz.SetAffinity_1(ax3, yzRatio);
|
|
159
|
+
transform.Multiply(xy);
|
|
160
|
+
transform.Multiply(yz);
|
|
161
|
+
return {
|
|
162
|
+
transform,
|
|
163
|
+
applyToPoint(p) {
|
|
164
|
+
var _stack2 = [];
|
|
165
|
+
try {
|
|
166
|
+
const scope2 = __using(_stack2, new shapeTypes.DisposalScope());
|
|
167
|
+
const coords = scope2.register(p.XYZ());
|
|
168
|
+
transform.Transforms_1(coords);
|
|
169
|
+
return new oc.gp_Pnt_2(coords);
|
|
170
|
+
} catch (_2) {
|
|
171
|
+
var _error2 = _2, _hasError2 = true;
|
|
172
|
+
} finally {
|
|
173
|
+
__callDispose(_stack2, _error2, _hasError2);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
} catch (_) {
|
|
178
|
+
var _error = _, _hasError = true;
|
|
179
|
+
} finally {
|
|
180
|
+
__callDispose(_stack, _error, _hasError);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function convertToJSArray(arrayOfPoints) {
|
|
184
|
+
const newArray = [];
|
|
185
|
+
for (let row = arrayOfPoints.LowerRow(); row <= arrayOfPoints.UpperRow(); row++) {
|
|
186
|
+
const rowArr = [];
|
|
187
|
+
newArray.push(rowArr);
|
|
188
|
+
for (let c = arrayOfPoints.LowerCol(); c <= arrayOfPoints.UpperCol(); c++) {
|
|
189
|
+
const pnt = arrayOfPoints.Value(row, c);
|
|
190
|
+
rowArr.push(pnt);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return newArray;
|
|
194
|
+
}
|
|
195
|
+
function makeEllipsoid(aLength, bLength, cLength) {
|
|
196
|
+
var _stack = [];
|
|
197
|
+
try {
|
|
198
|
+
const oc = occtBoundary.getKernel().oc;
|
|
199
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
200
|
+
const sphere = scope.register(new oc.gp_Sphere_1());
|
|
201
|
+
sphere.SetRadius(1);
|
|
202
|
+
const sphericalSurface = scope.register(new oc.Geom_SphericalSurface_2(sphere));
|
|
203
|
+
const baseSurface = oc.GeomConvert.SurfaceToBSplineSurface(sphericalSurface.UReversed()).get();
|
|
204
|
+
try {
|
|
205
|
+
const poles = convertToJSArray(baseSurface.Poles_2());
|
|
206
|
+
const ellipsoidTrsf = makeEllipsoidTransform(aLength, bLength, cLength);
|
|
207
|
+
poles.forEach((columns, rowIdx) => {
|
|
208
|
+
columns.forEach((value, colIdx) => {
|
|
209
|
+
const newPoint = ellipsoidTrsf.applyToPoint(value);
|
|
210
|
+
baseSurface.SetPole_1(rowIdx + 1, colIdx + 1, newPoint);
|
|
211
|
+
newPoint.delete();
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
ellipsoidTrsf.transform.delete();
|
|
215
|
+
const shell = errors.unwrap(
|
|
216
|
+
faceFns.cast(
|
|
217
|
+
scope.register(new oc.BRepBuilderAPI_MakeShell_2(baseSurface.UReversed(), false)).Shell()
|
|
218
|
+
)
|
|
219
|
+
);
|
|
220
|
+
return errors.unwrap(makeSolid([shell]));
|
|
221
|
+
} finally {
|
|
222
|
+
baseSurface.delete();
|
|
223
|
+
}
|
|
224
|
+
} catch (_) {
|
|
225
|
+
var _error = _, _hasError = true;
|
|
226
|
+
} finally {
|
|
227
|
+
__callDispose(_stack, _error, _hasError);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function makeVertex(point) {
|
|
231
|
+
var _stack = [];
|
|
232
|
+
try {
|
|
233
|
+
const oc = occtBoundary.getKernel().oc;
|
|
234
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
235
|
+
const pnt = scope.register(occtBoundary.toOcPnt(point));
|
|
236
|
+
const vertexMaker = scope.register(new oc.BRepBuilderAPI_MakeVertex(pnt));
|
|
237
|
+
return shapeTypes.createVertex(vertexMaker.Vertex());
|
|
238
|
+
} catch (_) {
|
|
239
|
+
var _error = _, _hasError = true;
|
|
240
|
+
} finally {
|
|
241
|
+
__callDispose(_stack, _error, _hasError);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function makeOffset(face, offset, tolerance = 1e-6) {
|
|
245
|
+
const oc = occtBoundary.getKernel().oc;
|
|
246
|
+
const progress = new oc.Message_ProgressRange_1();
|
|
247
|
+
const offsetBuilder = new oc.BRepOffsetAPI_MakeOffsetShape();
|
|
248
|
+
try {
|
|
249
|
+
offsetBuilder.PerformByJoin(
|
|
250
|
+
face.wrapped,
|
|
251
|
+
offset,
|
|
252
|
+
tolerance,
|
|
253
|
+
oc.BRepOffset_Mode.BRepOffset_Skin,
|
|
254
|
+
false,
|
|
255
|
+
false,
|
|
256
|
+
oc.GeomAbs_JoinType.GeomAbs_Arc,
|
|
257
|
+
false,
|
|
258
|
+
progress
|
|
259
|
+
);
|
|
260
|
+
return errors.andThen(
|
|
261
|
+
faceFns.downcast(offsetBuilder.Shape()),
|
|
262
|
+
(downcasted) => errors.andThen(faceFns.cast(downcasted), (newShape) => {
|
|
263
|
+
if (!shapeTypes.isShape3D(newShape))
|
|
264
|
+
return errors.err(errors.typeCastError("OFFSET_NOT_3D", "Could not offset to a 3d shape"));
|
|
265
|
+
return errors.ok(newShape);
|
|
266
|
+
})
|
|
267
|
+
);
|
|
268
|
+
} finally {
|
|
269
|
+
offsetBuilder.delete();
|
|
270
|
+
progress.delete();
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function makeCompound(shapeArray) {
|
|
274
|
+
const oc = occtBoundary.getKernel().oc;
|
|
275
|
+
const builder = new oc.TopoDS_Builder();
|
|
276
|
+
const compound = new oc.TopoDS_Compound();
|
|
277
|
+
builder.MakeCompound(compound);
|
|
278
|
+
for (const s of shapeArray) {
|
|
279
|
+
builder.Add(compound, s.wrapped);
|
|
280
|
+
}
|
|
281
|
+
builder.delete();
|
|
282
|
+
return shapeTypes.createCompound(compound);
|
|
283
|
+
}
|
|
284
|
+
function makeSolid(facesOrShells) {
|
|
285
|
+
var _stack = [];
|
|
286
|
+
try {
|
|
287
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
288
|
+
const oc = occtBoundary.getKernel().oc;
|
|
289
|
+
const shell = weldShapes(facesOrShells);
|
|
290
|
+
return errors.andThen(
|
|
291
|
+
faceFns.cast(scope.register(new oc.ShapeFix_Solid_1()).SolidFromShell(shell.wrapped)),
|
|
292
|
+
(solid) => {
|
|
293
|
+
if (!shapeTypes.isSolid(solid))
|
|
294
|
+
return errors.err(
|
|
295
|
+
errors.typeCastError("SOLID_BUILD_FAILED", "Could not make a solid of faces and shells")
|
|
296
|
+
);
|
|
297
|
+
return errors.ok(solid);
|
|
298
|
+
}
|
|
299
|
+
);
|
|
300
|
+
} catch (_) {
|
|
301
|
+
var _error = _, _hasError = true;
|
|
302
|
+
} finally {
|
|
303
|
+
__callDispose(_stack, _error, _hasError);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
const basicFaceExtrusion = (face, extrusionVec) => {
|
|
307
|
+
var _stack = [];
|
|
308
|
+
try {
|
|
309
|
+
const oc = occtBoundary.getKernel().oc;
|
|
310
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
311
|
+
const vec = occtBoundary.toVec3(extrusionVec);
|
|
312
|
+
const ocVec = scope.register(new oc.gp_Vec_4(vec[0], vec[1], vec[2]));
|
|
313
|
+
const solidBuilder = scope.register(
|
|
314
|
+
new oc.BRepPrimAPI_MakePrism_1(face.wrapped, ocVec, false, true)
|
|
315
|
+
);
|
|
316
|
+
const solid = shapeTypes.createSolid(errors.unwrap(faceFns.downcast(solidBuilder.Shape())));
|
|
317
|
+
return solid;
|
|
318
|
+
} catch (_) {
|
|
319
|
+
var _error = _, _hasError = true;
|
|
320
|
+
} finally {
|
|
321
|
+
__callDispose(_stack, _error, _hasError);
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
const revolution = (face, center = [0, 0, 0], direction = [0, 0, 1], angle = 360) => {
|
|
325
|
+
var _stack = [];
|
|
326
|
+
try {
|
|
327
|
+
const oc = occtBoundary.getKernel().oc;
|
|
328
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
329
|
+
const centerVec = occtBoundary.toVec3(center);
|
|
330
|
+
const directionVec = occtBoundary.toVec3(direction);
|
|
331
|
+
const ax = scope.register(occtBoundary.makeOcAx1(centerVec, directionVec));
|
|
332
|
+
const revolBuilder = scope.register(
|
|
333
|
+
new oc.BRepPrimAPI_MakeRevol_1(face.wrapped, ax, angle * vecOps.DEG2RAD, false)
|
|
334
|
+
);
|
|
335
|
+
const result = errors.andThen(faceFns.cast(revolBuilder.Shape()), (shape) => {
|
|
336
|
+
if (!faceFns.isShape3D(shape))
|
|
337
|
+
return errors.err(errors.typeCastError("REVOLUTION_NOT_3D", "Revolution did not produce a 3D shape"));
|
|
338
|
+
return errors.ok(shape);
|
|
339
|
+
});
|
|
340
|
+
return result;
|
|
341
|
+
} catch (_) {
|
|
342
|
+
var _error = _, _hasError = true;
|
|
343
|
+
} finally {
|
|
344
|
+
__callDispose(_stack, _error, _hasError);
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
function genericSweep(wire, spine, {
|
|
348
|
+
frenet = false,
|
|
349
|
+
auxiliarySpine,
|
|
350
|
+
law = null,
|
|
351
|
+
transitionMode = "right",
|
|
352
|
+
withContact,
|
|
353
|
+
support,
|
|
354
|
+
forceProfileSpineOthogonality,
|
|
355
|
+
mode: sweepMode,
|
|
356
|
+
tolerance,
|
|
357
|
+
boundTolerance,
|
|
358
|
+
angularTolerance,
|
|
359
|
+
maxDegree,
|
|
360
|
+
maxSegments
|
|
361
|
+
} = {}, shellMode = false) {
|
|
362
|
+
var _stack = [];
|
|
363
|
+
try {
|
|
364
|
+
if (sweepMode === "simple" && !shellMode) {
|
|
365
|
+
const kernel = occtBoundary.getKernel();
|
|
366
|
+
const resultOc = kernel.simplePipe(wire.wrapped, spine.wrapped);
|
|
367
|
+
const result = errors.andThen(faceFns.cast(resultOc), (shape2) => {
|
|
368
|
+
if (!faceFns.isShape3D(shape2))
|
|
369
|
+
return errors.err(errors.typeCastError("SWEEP_NOT_3D", "Simple pipe did not produce a 3D shape"));
|
|
370
|
+
return errors.ok(shape2);
|
|
371
|
+
});
|
|
372
|
+
return result;
|
|
373
|
+
}
|
|
374
|
+
const oc = occtBoundary.getKernel().oc;
|
|
375
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
376
|
+
const withCorrection = transitionMode === "round" ? true : !!forceProfileSpineOthogonality;
|
|
377
|
+
const sweepBuilder = scope.register(new oc.BRepOffsetAPI_MakePipeShell(spine.wrapped));
|
|
378
|
+
if (tolerance !== void 0) {
|
|
379
|
+
sweepBuilder.SetTolerance(tolerance, boundTolerance ?? tolerance, angularTolerance ?? 1e-7);
|
|
380
|
+
}
|
|
381
|
+
if (maxDegree !== void 0) {
|
|
382
|
+
sweepBuilder.SetMaxDegree(maxDegree);
|
|
383
|
+
}
|
|
384
|
+
if (maxSegments !== void 0) {
|
|
385
|
+
sweepBuilder.SetMaxSegments(maxSegments);
|
|
386
|
+
}
|
|
387
|
+
{
|
|
388
|
+
const mode = {
|
|
389
|
+
transformed: oc.BRepBuilderAPI_TransitionMode.BRepBuilderAPI_Transformed,
|
|
390
|
+
round: oc.BRepBuilderAPI_TransitionMode.BRepBuilderAPI_RoundCorner,
|
|
391
|
+
right: oc.BRepBuilderAPI_TransitionMode.BRepBuilderAPI_RightCorner
|
|
392
|
+
}[transitionMode];
|
|
393
|
+
if (mode) sweepBuilder.SetTransitionMode(mode);
|
|
394
|
+
}
|
|
395
|
+
if (support) {
|
|
396
|
+
sweepBuilder.SetMode_4(support);
|
|
397
|
+
} else if (frenet) {
|
|
398
|
+
sweepBuilder.SetMode_1(frenet);
|
|
399
|
+
}
|
|
400
|
+
if (auxiliarySpine) {
|
|
401
|
+
sweepBuilder.SetMode_5(
|
|
402
|
+
auxiliarySpine.wrapped,
|
|
403
|
+
false,
|
|
404
|
+
oc.BRepFill_TypeOfContact.BRepFill_NoContact
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
if (!law) sweepBuilder.Add_1(wire.wrapped, !!withContact, withCorrection);
|
|
408
|
+
else sweepBuilder.SetLaw_1(wire.wrapped, law, !!withContact, withCorrection);
|
|
409
|
+
const progress = scope.register(new oc.Message_ProgressRange_1());
|
|
410
|
+
sweepBuilder.Build(progress);
|
|
411
|
+
if (!sweepBuilder.IsDone()) {
|
|
412
|
+
return errors.err(errors.occtError("SWEEP_FAILED", "Sweep operation failed"));
|
|
413
|
+
}
|
|
414
|
+
if (!shellMode) {
|
|
415
|
+
sweepBuilder.MakeSolid();
|
|
416
|
+
}
|
|
417
|
+
const shape = errors.unwrap(faceFns.cast(sweepBuilder.Shape()));
|
|
418
|
+
if (!faceFns.isShape3D(shape)) {
|
|
419
|
+
return errors.err(errors.typeCastError("SWEEP_NOT_3D", "Sweep did not produce a 3D shape"));
|
|
420
|
+
}
|
|
421
|
+
if (shellMode) {
|
|
422
|
+
const startWire = errors.unwrap(faceFns.cast(sweepBuilder.FirstShape()));
|
|
423
|
+
const endWire = errors.unwrap(faceFns.cast(sweepBuilder.LastShape()));
|
|
424
|
+
if (!faceFns.isWire(startWire)) {
|
|
425
|
+
return errors.err(errors.typeCastError("SWEEP_START_NOT_WIRE", "Sweep did not produce a start Wire"));
|
|
426
|
+
}
|
|
427
|
+
if (!faceFns.isWire(endWire)) {
|
|
428
|
+
return errors.err(errors.typeCastError("SWEEP_END_NOT_WIRE", "Sweep did not produce an end Wire"));
|
|
429
|
+
}
|
|
430
|
+
return errors.ok([shape, startWire, endWire]);
|
|
431
|
+
}
|
|
432
|
+
return errors.ok(shape);
|
|
433
|
+
} catch (_) {
|
|
434
|
+
var _error = _, _hasError = true;
|
|
435
|
+
} finally {
|
|
436
|
+
__callDispose(_stack, _error, _hasError);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
function complexExtrude(wire, center, normal, profileShape, shellMode = false) {
|
|
440
|
+
var _stack = [];
|
|
441
|
+
try {
|
|
442
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
443
|
+
const centerVec = occtBoundary.toVec3(center);
|
|
444
|
+
const normalVec = occtBoundary.toVec3(normal);
|
|
445
|
+
const endVec = vecOps.vecAdd(centerVec, normalVec);
|
|
446
|
+
const mainSpineEdge = scope.register(surfaceBuilders.makeLine(centerVec, endVec));
|
|
447
|
+
const spine = scope.register(errors.unwrap(surfaceBuilders.assembleWire([mainSpineEdge])));
|
|
448
|
+
const law = profileShape ? scope.register(errors.unwrap(buildLawFromProfile(vecOps.vecLength(normalVec), profileShape))) : null;
|
|
449
|
+
const result = shellMode ? genericSweep(wire, spine, { law }, shellMode) : genericSweep(wire, spine, { law });
|
|
450
|
+
return result;
|
|
451
|
+
} catch (_) {
|
|
452
|
+
var _error = _, _hasError = true;
|
|
453
|
+
} finally {
|
|
454
|
+
__callDispose(_stack, _error, _hasError);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
function twistExtrude(wire, angleDegrees, center, normal, profileShape, shellMode = false) {
|
|
458
|
+
var _stack = [];
|
|
459
|
+
try {
|
|
460
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
461
|
+
const centerVec = occtBoundary.toVec3(center);
|
|
462
|
+
const normalVec = occtBoundary.toVec3(normal);
|
|
463
|
+
const endVec = vecOps.vecAdd(centerVec, normalVec);
|
|
464
|
+
const mainSpineEdge = scope.register(surfaceBuilders.makeLine(centerVec, endVec));
|
|
465
|
+
const spine = scope.register(errors.unwrap(surfaceBuilders.assembleWire([mainSpineEdge])));
|
|
466
|
+
const extrusionLength = vecOps.vecLength(normalVec);
|
|
467
|
+
const pitch = 360 / angleDegrees * extrusionLength;
|
|
468
|
+
const radius = 1;
|
|
469
|
+
const auxiliarySpine = scope.register(
|
|
470
|
+
surfaceBuilders.makeHelix(pitch, extrusionLength, radius, centerVec, normalVec)
|
|
471
|
+
);
|
|
472
|
+
const law = profileShape ? scope.register(errors.unwrap(buildLawFromProfile(extrusionLength, profileShape))) : null;
|
|
473
|
+
const result = shellMode ? genericSweep(wire, spine, { auxiliarySpine, law }, shellMode) : genericSweep(wire, spine, { auxiliarySpine, law });
|
|
474
|
+
return result;
|
|
475
|
+
} catch (_) {
|
|
476
|
+
var _error = _, _hasError = true;
|
|
477
|
+
} finally {
|
|
478
|
+
__callDispose(_stack, _error, _hasError);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
const loft = (wires, { ruled = true, startPoint, endPoint } = {}, returnShell = false) => {
|
|
482
|
+
var _stack = [];
|
|
483
|
+
try {
|
|
484
|
+
if (wires.length === 0 && !startPoint && !endPoint) {
|
|
485
|
+
return errors.err(errors.validationError("LOFT_EMPTY", "Loft requires at least one wire or start/end point"));
|
|
486
|
+
}
|
|
487
|
+
const oc = occtBoundary.getKernel().oc;
|
|
488
|
+
const scope = __using(_stack, new shapeTypes.DisposalScope());
|
|
489
|
+
const loftBuilder = scope.register(new oc.BRepOffsetAPI_ThruSections(!returnShell, ruled, 1e-6));
|
|
490
|
+
if (startPoint) {
|
|
491
|
+
loftBuilder.AddVertex(scope.register(makeVertex(occtBoundary.toVec3(startPoint))).wrapped);
|
|
492
|
+
}
|
|
493
|
+
wires.forEach((w) => loftBuilder.AddWire(w.wrapped));
|
|
494
|
+
if (endPoint) {
|
|
495
|
+
loftBuilder.AddVertex(scope.register(makeVertex(occtBoundary.toVec3(endPoint))).wrapped);
|
|
496
|
+
}
|
|
497
|
+
const progress = scope.register(new oc.Message_ProgressRange_1());
|
|
498
|
+
loftBuilder.Build(progress);
|
|
499
|
+
if (!loftBuilder.IsDone()) {
|
|
500
|
+
return errors.err(errors.occtError("LOFT_FAILED", "Loft operation failed"));
|
|
501
|
+
}
|
|
502
|
+
const result = errors.andThen(faceFns.cast(loftBuilder.Shape()), (shape) => {
|
|
503
|
+
if (!faceFns.isShape3D(shape))
|
|
504
|
+
return errors.err(errors.typeCastError("LOFT_NOT_3D", "Loft did not produce a 3D shape"));
|
|
505
|
+
return errors.ok(shape);
|
|
506
|
+
});
|
|
507
|
+
return result;
|
|
508
|
+
} catch (_) {
|
|
509
|
+
var _error = _, _hasError = true;
|
|
510
|
+
} finally {
|
|
511
|
+
__callDispose(_stack, _error, _hasError);
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
exports.basicFaceExtrusion = basicFaceExtrusion;
|
|
515
|
+
exports.buildLawFromProfile = buildLawFromProfile;
|
|
516
|
+
exports.complexExtrude = complexExtrude;
|
|
517
|
+
exports.genericSweep = genericSweep;
|
|
518
|
+
exports.loft = loft;
|
|
519
|
+
exports.makeCompound = makeCompound;
|
|
520
|
+
exports.makeCone = makeCone;
|
|
521
|
+
exports.makeCylinder = makeCylinder;
|
|
522
|
+
exports.makeEllipsoid = makeEllipsoid;
|
|
523
|
+
exports.makeOffset = makeOffset;
|
|
524
|
+
exports.makeSolid = makeSolid;
|
|
525
|
+
exports.makeSphere = makeSphere;
|
|
526
|
+
exports.makeTorus = makeTorus;
|
|
527
|
+
exports.makeVertex = makeVertex;
|
|
528
|
+
exports.revolution = revolution;
|
|
529
|
+
exports.twistExtrude = twistExtrude;
|
|
530
|
+
exports.weldShellsAndFaces = weldShellsAndFaces;
|